2010-06-04 40 views
0

Excuses si cela est considéré comme une question répétée, mais les réponses que j'ai vues ici sont trop complexes pour mes besoins.Formule pour déterminer si un segment de ligne coupe un cercle (plat)

J'ai simplement besoin de savoir si un segment de ligne coupe un cercle. Je n'ai pas besoin de trouver la distance à la ligne du centre du cercle, je n'ai pas besoin de résoudre les points d'intersection.

La raison pour laquelle j'ai besoin de quelque chose de simple est que je dois coder cela en SQL et que je suis incapable d'appeler des bibliothèques externes, et que j'ai besoin d'écrire cette formule dans une clause WHERE ... basiquement déclaration unique que je peux brancher des valeurs à. En supposant 2 points A (Ax, Ay) et B (Bx, By) pour décrire le segment de droite, et un cercle avec le centre C (Cx, Cy) et le rayon R, la formule que j'utilise actuellement est:

(R R ((Ax-Bx) (Ax-Bx) + (Ay-By) (Ay-By))) - (((Ax-Cx) (By-Cy)) - ((Bx-Cx) (Ay-Cy)))> 0

Cette formule provient de link text et est basée sur un cercle 0,0 centré.

La raison pour laquelle je poste est que je reçois des résultats étranges et je me demandais si je faisais quelque chose de stupide. :(

Répondre

0

bien que cela ne répond pas exactement à votre question: Avez-vous vraiment calculer ce à la volée sur un SQL-Select Cela signifie que le système DB doit calculer la formule pour chaque ligne unique dans la table (ou chaque ligne unique pour laquelle les autres où les conditions détiennent respectivement) qui pourrait entraîner une mauvaise performance.

au lieu de cela, vous pouvez envisager de créer une colonne booléen et calculer sa valeur dans un sur-insert/déclencheur à la mise à jour Vous n'avez pas besoin de mettre le test dans une formule à une seule ligne, car l'utilisation d'une colonne séparée présente un autre avantage: vous pouvez créer un index sur cette colonne. vous permet d'obtenir votre ensemble d'enregistrements entrecroisés/non-croisés très rapidement.

+0

Merci pour la suggestion, mais malheureusement, j'ai besoin de faire ce calcul pour de nombreux cercles différents (chaque fois contre plusieurs milliers de segments de ligne), donc je ne peux rien calculer à l'avance. – Dan

+0

Je vois, les coordonnées du cercle ne font pas du tout partie des enregistrements (?) Vous voudrez peut-être spécifier cela dans votre question. – chiccodoro

+0

Il est probablement important de mentionner que je filtre la plupart des lignes avant ce calcul en vérifiant que: 1) au moins un des points A, B a une valeur x au moins (cercle centre - rayon) 2) au moins un 3) au moins un des points A, B a une valeur au moins égale à (cercle centre-rayon) 4) au moins un des points A, B a une valeur x au maximum (cercle centre + rayon) A, B a une valeur de ay au maximum (cercle centre + rayon) Si toutes ces conditions ne sont pas réunies, toute la ligne se trouve en dehors de la forme en croix réalisée en prolongeant un carré centré sur le cercle de longueur 2R. – Dan