Comment détecter si une ellipse se croise (entre en collision avec) un cercle

je veux améliorer un système de collision.

en ce moment je détecte si 2 objets irréguliers entrent en collision si leurs rectangles limites entrent en collision.

je veux obtenir le rectangle pour l'ellipse correspondante tandis que pour l'autre utiliser un cercle. J'ai trouvé une méthode pour obtenir les coordonnées de l'ellipse mais j'ai un problème quand j'essaie de détecter si elle croise le cercle.

connaissez-vous un algorithme pour tester si un cercle coupe l'ellipse?

14
demandé sur genpfault 2010-05-31 22:32:26

10 réponses

brève réponse: résoudre exactement si les deux objets se croisent est assez compliqué pour être infaisable aux fins de détection de collision. Décrétez votre ellipse comme un polygone n-face pour un certain n (selon la précision que vous avez besoin d'être) et faites la détection de collision avec ce polygone.

réponse longue: si vous insistez pour déterminer si l'ellipse lisse et le cercle se croisent, il y a deux approches principales. Les deux impliquent de résoudre d'abord pour le point le plus proche de la le cercle est au centre de l'ellipse, et ensuite on compare cette distance au rayon du cercle.

approche 1: utiliser une paramétrisation de l'ellipse. Transformez vos coordonnées pour que l'ellipse soit à l'origine, avec ses axes alignés sur les axes x-Y. Qui est:

  • Centre de l'ellipse: (0,0)
  • Centre du cercle: c = (cx, cy)
  • Rayon du cercle: r
  • rayon de l'axe de l'ellipse aligné sur x:
  • rayon de l'axe de l'ellipse aligné en y: B.

L'équation de l'ellipse est alors donnée par a cos(t), b sin(t). Pour trouver le point le plus proche, nous voulons minimiser la distance carrée || (a cos t, b sin t) - c ||^2. Comme Jean le souligne, c'est "juste calcul": prendre un dérivé, et définissez égal à 0. A moins que je ne manque quelque chose, cependant, la résolution de l'équation résultante (assez désagréable) pour t n'est pas possible analytiquement, et doit être approché en utilisant par exemple la méthode de Newton. Branchez le t vous trouvez dans l'équation paramétrique pour obtenir le point le plus proche.

  • Pro: Numérique résoudre est seulement dans une variable t.
  • Con: vous devez être capable d'écrire une paramétrisation de l'ellipse, ou de transformer vos coordonnées pour que vous le puissiez. Cela ne devrait pas être trop difficile pour toute représentation raisonnable que vous avez de l'ellipse. Cependant, je vais vous montrer une deuxième méthode, qui est beaucoup plus générale et peut être utile si vous avez de généraliser votre problème, disons, à la 3D.

approche 2: utiliser le calcul multidimensionnel. Aucun changement de coordonnées n'est nécessaire.

  • Centre du cercle: c = (cx, cy)
  • rayon du cirlce: R
  • Ellipse est donné par g(x, y) = 0 pour une fonction G. Par exemple, pour la réponse de Curd, vous pouvez utiliser g(x, y) = distance de (x,y) à partir de la mise au point 1 + distance de (x, y) à partir de la mise au point 2 - e.

Trouver le point sur l'ellipse le plus proche du centre de le cercle peut alors être formulé comme un contrainte du problème de minimisation:

Minimize ||(x,y) - c||^2 subject to g(x,y) = 0

(minimiser la distance carrée équivaut à minimiser la distance, et beaucoup plus agréable à traiter puisque c'est un polynôme quadratique en x,Y.)

pour résoudre le problème de minimisation contrainte, nous introduisons le multiplicateur Lagrange lambda, et résolvons le système d'équations

2 * [ (x,y) -c ] + lambda * Jg(x,y) = 0
g(x,y) = 0

ici Jg est le gradient de G. Il s'agit d'un système de trois équations (non linéaires) dans trois inconnues: x, y, et lambda. Nous pouvons résoudre ce système en utilisant la méthode de Newton, et le (x,y) que nous obtenons est le point le plus proche du centre du cercle.

  • Pro: Pas de paramétrage doit être trouvé
  • Pro: la méthode est très générale, et fonctionne bien chaque fois que l'écriture g est plus facile que de trouver une équation paramétrique (comme en 3D)
  • Con: nécessite une solution MultiVariable Newton, qui est très poilu si vous n'avez pas accès à une méthode numérique paquet.

mise en garde: ces deux approches résolvent techniquement le point qui extremizes la distance jusqu'au centre du cercle. Ainsi, le point peut-être le point le plus éloigné du cercle, et pas le plus proche. Pour les deux méthodes, en semant votre résoudre avec une bonne conjecture initiale (le centre du cercle fonctionne bien pour la méthode 2; Vous êtes sur votre propre pour la méthode 1) réduira cela danger.

Troisième Approche Possible?: il peut être possible de résoudre directement pour les racines du système de deux équations quadratiques en deux variables représentant le cercle et l'ellipse. Si une racine réelle existe, les objets se croisent. La façon la plus directe de résoudre ce système, encore une fois en utilisant un algorithme numérique comme la méthode de Newton, n'aidera pas parce que le manque de convergence n'implique pas nécessairement la non-existence d'une racine réelle. Pour deux équations quadratiques en deux variables, cependant, il peut exister une méthode spécialisée qui est garanti de trouver de vraies racines, si elles existent. Je ne peux pas moi-même penser à une façon de faire cela, mais vous pouvez vouloir faire des recherches vous-même (ou voir si quelqu'un sur stackoverflow peut élaborer.)

17
répondu user168715 2010-06-02 21:49:46

une ellipse est définie par l'ensemble des points dont la somme de la distance au point A et de la distance au point B est constante E. (A et B sont appelés les foyers de l'ellipse).

tous les points P, dont la somme AP + BP est inférieure à e, se situent à l'intérieur de l'ellipse.

Un cercle est défini comme l'ensemble des points dont l' distance jusqu'au point c est R.

Un test simple pour l'intersection du cercle et de l'ellipse est la suivante:

Trouver

P comme l' intersection du cercle et de la ligne AC et

Q à l'intersection du cercle et de la ligne BC.

Cercle et de l'ellipse se croisent (ou le cercle se trouve complètement à l'intérieur de l'ellipse) si

AP + BP < = e ou AQ + BQ < = e

alt text

EDIT:

après le commentaire de Martin DeMello et l'adaptation de ma réponse en conséquence, j'ai réfléchi davantage sur le problème et a constaté que la réponse (avec le 2e contrôle) ne détecte toujours pas intersections:

si le cercle et l'ellipse ne se croisent que très peu (juste un peu plus que tangente) P et Q Ne se trouveront pas à l'intérieur de l'ellipse:

alt text

Donc, le test décrit ci-dessus détecte la collision seulement si le chevauchement est "assez grand". Peut-être est-il assez bon pour vos fins pratiques, bien que mathématiquement, il n'est pas parfait.

16
répondu Curd 2010-06-03 09:32:10

agrandir les rayons majeurs et mineurs de l'ellipse par le rayon du cercle. Testez ensuite si le centre du cercle donné est à l'intérieur de cette nouvelle ellipse plus grande en additionnant les distances aux foyers de l'ellipse agrandie.

Cet algorithme est très efficace. Vous pouvez commencer si le cercle donné ne coupe pas un cercle qui circonscrit l'ellipse. C'est plus lent qu'un test de boxe, mais trouver la boxe d'une ellipse non alignée sur l'axe est délicat.

4
répondu Danny Epstein 2012-10-16 23:22:48

trouver le point sur l'ellipse le plus proche du centre du cercle

et puis vérifiez si la distance de ce point est plus petite que le rayon du cercle

si vous avez besoin d'aide juste un commentaire, mais c'est tout simplement le calcul

edit: voici un moyen de trouver la solution, puisqu'il y a quelque chose qui ne va pas avec les caillés

donnée au centre α β sur l'ellipse

et (faute de se souvenir du terme) rayon X a, y rayon B la paramétrisation est

r (Θ) = (ab)/ ((BcosΘ)^2 + (asinΘ)^2)^.5)

x (Θ) = α + sin (Θ)r (Θ)

y (Θ) = β + cos (Θ)r (Θ)

et puis il suffit de prendre le cercle avec le centre à (φ, ψ) et le rayon r puis la distance d (Θ) = ((φ - x(Θ))^2 + (ψ - y(Θ)) ^2)^.5

le minimum de cette distance est lorsque d'(Θ) = 0 (' pour la dérivée)

d'(Θ) = 1 / d (Θ) * (- φx'(Θ) + x (Θ)x '(Θ) - ψy'(Θ) + y (Θ)y'(Θ)) )

= = >

x'(Θ) * (- φ + x (Θ)) = y'(Θ) * (ψ-y (Θ))

et continuer à aller et aller et j'espère que vous pourrez résoudre pour Θ

Le cadre dans lequel vous travaillez peut avoir des choses pour vous aider à résoudre ce problème, et vous pouvez toujours prendre la solution facile et approximatif roots via méthode de Newton

3
répondu Jean-Bernard Pellerin 2010-06-03 01:00:32

si un cercle et une ellipse entrent en collision, alors soit leurs limites se croisent 1, 2, 3, ou 4 fois(ou à l'infini dans le cas d'une ellipse circulaire qui coïncide avec le cercle), ou le cercle est à l'intérieur de l'ellipse ou vice versa.

je suis en supposant que le cercle a une équation de (x - a)^2 + (y - b)^2 <= r^2 (1) et l'ellipse a une équation de [(x - c)^2]/[d^2] + [(y - e)^2]/[f^2] <= 1 (2)

Pour vérifier si l'un d'entre eux est à l'intérieur de l'autre, vous pouvez evaluer l'équation du cercle aux coordonnées du centre de l'ellipse(x=c, y=e), ou vice versa, et voir si l'inégalité tient.

pour vérifier les autres cas dans lesquels leurs limites se croisent, vous devez vérifier si le système d'équations décrit par (1) et (2) a des solutions.

vous pouvez le faire en ajoutant (1) et (2), vous donnant

(x - a)^2 + (y - b)^2 + [(x - c)^2]/[d^2] + [(y - e)^2]/[f^2] = r^2 + 1

ensuite, vous multipliez les termes, en donnant

x^2 - 2ax + a^2 + y^2 - 2by + b^2 + x^2/d^2 - 2cx/d^2 + c^2/d^2 + y^2/f^2 - 2ey/f^2 + e^2/f^2 = r^2 + 1

collectionner comme les termes, nous obtenons

(1 + 1/d^2)x^2 - (2a + 2c/d^2)x + (1 + 1/f^2)y^2 - (2b + 2e/f^2)y = 1 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2

maintenant, laissez -m = (1 + 1/d^2), n = -(2a + 2c/d^2), o = (1 + 1/f^2), and p = -(2b + 2e/f^2)

l'équation est maintenant mx^2 + nx + oy^2 + py = 1 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2

maintenant, nous avons besoin de compléter les cases sur le côté gauche

m[x^2 + (n/m)x] + o[y^2 + (p/o)y] = 1 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2

m[x^2 + (n/m)x + (n/2m)^2 - (n/2m)^2] + o[y^2 + (p/o)y + (p/2o)^2 - (p/2o)^2] = 1 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2

m[(x + n/2m)^2 - (n/2m)^2] + o[(y + p/2o)^2 - (p/2o)^2] = 1 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2

m(x + n/2m)^2 - m(n/2m)^2 + o(y + p/2o)^2 - o(p/2o)^2 = 1 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2

m(x + n/2m)^2 + o(y + p/2o)^2 = 1 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2 + m(n/2m)^2 + o(p/2o)^2

ce système a une solution iff 11 + r^2 - a^2 - b^2 - c^2/d^2 - e^2/f^2 + m(n/2m)^2 + o(p/2o)^2 >= 0

voilà, si je n'ai pas fait d'erreurs algébriques. Je ne sais pas comment vous pouvez simplifier l'expression résultante, donc cette solution pourrait être tout à fait gourmand en ressources, si vous allez vérifier de nombreux cercles/ellipses

3
répondu Bwmat 2012-07-18 01:10:31

oubliez la solution mathématique. Comme vous pouvez le voir facilement en dessinant, vous pouvez avoir jusqu'à quatre solutions, et donc probablement un polynôme de quatrième grade.

au Lieu de cela il suffit de faire une recherche binaire sur le bord de l'une des figures. Il est facile de déterminer si un point se trouve à l'intérieur d'une ellipse et encore plus dans un cercle (voir si la distance est plus courte que le rayon).

si vous voulez vraiment aller pour les maths, Wolfram MathWorld a un bel article ici: http://mathworld.wolfram.com/Circle-EllipseIntersection.html mais attention, vous devrez quand même écrire un résolveur d'équation polynomiale, probablement en utilisant quelque chose comme la recherche binaire.

3
répondu Thomas Ahle 2015-10-26 09:01:56

Ce n'est pas compliqué. user168715 la réponse est généralement juste, mais faire le calcul n'est pas nécessaire. Juste la trigonométrie.

Trouver l'angle entre le centre des deux objets. En utilisant ceci vous pouvez trouver le point le plus proche du centre du cercle sur l'ellipse en utilisant la forme polaire:

Ellipse Equation : Polar form relative to center

(extrait de L'article de Wikipedia sur Ellipses)

maintenant, comparez la distance entre les deux centres d'objet, en soustrayant le rayon de l'ellipse et du cercle.

peut-être que je manque quelque chose; peut-être ArcTan/Cos/Sin sont lents -- mais je ne le pense pas, et il devrait y avoir des approximations rapides si nécessaire.

2
répondu phillipwei 2011-05-12 17:28:02

je sais que c'est trop tard mais j'espère que ça aiderait quelqu'un. Mon approche pour résoudre ce problème était d'interpoler l'ellipse dans un polygone n-dimensions, puis de construire une ligne entre tous les 2 points et de trouver si le cercle croise avec l'une des lignes ou non. Cela ne fournit pas la meilleure performance, mais il est pratique et facile à mettre en œuvre.

Pour interpoler l'ellipse à un n-dimensions polygone, vous pouvez utiliser:

    float delta = (2 * PI) / n;

    std::vector<Point*> interpolation;

    for(float t = 0; t < (2 * PI); t += delta) {

        float x = rx * cos(t) + c->get_x();
        float y = ry * sin(t) + c->get_y();

        interpolation.push_back(new Point(x, y));
    }

c: le centre de la ellipse. RX: rayon de l'axe X de l'ellipse. ry: rayon de l'axe de l'ellipse aligné en Y.

maintenant nous avons les points d'interpolation, nous pouvons trouver l'intersection entre le cercle et les lignes entre tous les 2 points. Une façon de trouver la ligne-intersection de cricle est décrite ici, une intersection se produit si une intersection est produite entre les lignes et le cercle.

J'espère que cela aidera n'importe qui.

2
répondu Mo Abdul-Hameed 2017-05-23 12:13:47

en Supposant: l'ellipse centrée à l'origine et avec le demi-grand axe (de longueur a) orienté le long de l'axe x, et avec un demi-mineur l'axe de longueur b; E2 est l'excentricité au carré, i.e. (a a-b b) / (a*a); le cercle est centré à X, Y et de rayon R.

les cas faciles sont: le centre du cercle est à l'intérieur de l'ellipse (i.e. hypot(X/A, Y/b) <= 1) il y a donc une intersection; le centre du cercle est à l'extérieur d'un cercle centré en 0 de rayon a+r (IE hypot (X,Y) > a+r) donc il n'y a pas d'intersection.

une approche pour les autres cas est de calculer la géodésie coordonnées (latitude, hauteur) du centre du cercle. Cercle coupe l'ellipse si et seulement si la hauteur est inférieure au rayon.

la latitude géodésique d'un point sur une ellipse est l'angle la normale à l'ellipse au point avec l'axe des x, et la hauteur d'un point à l'extérieur de l'ellipse est la distance de la point du point sur l'ellipse la plus proche. Note la latitude géodésique n'est pas la même que l'angle polaire du centre de l'ellipse au point à moins que l'ellipse est en fait circulaire.

dans les formules la conversion des coordonnées géodésiques lat, ht en coordonnées cartésiennes X, Y est X = (nu+ht) * cos (lat), Y = (nu * (1-E2) + ht) * sin(lat)) où nu = a / sqrt( 1-E2 * sin (lat) sin (lat)). Le point sur l'ellipse le plus proche de X, Y est le point avec la même latitude, mais la hauteur nulle, c'est à dire x = nu cos (lat), y = nu * (1-E2) * sin (lat). Notez que nu est une fonction de latitude.

malheureusement le processus de trouver lat, ht de X, Y est un itératif. Une approche consiste à trouver d'abord la latitude, puis hauteur.

un peu d'algèbre montre que la latitude satisfait lat = atan2( Y+ E2 * nu sin( lat), X) qui peut être utilisé pour calculer des approximations successives de la latitude, à partir de lat = atan2 (Y, X

Plus E2 est grande, c'est-à-dire plus l'ellipse est plate, plus itérations seront nécessaires. Par exemple, si l'ellipse est presque circulaire (dire E2<0.1) puis cinq itérations obtiendront x, y ci-dessous à l'intérieur de a*1e-12, mais si l'ellipse est très plate, par exemple E2=0,999 vous aurez besoin d'environ 300 itérations pour obtenir la même précision!

Enfin, compte tenu de la latitude, la hauteur peut être calculée par le calcul de (x,y): x = nu cos( lat), y = nu

1
répondu dmuir 2010-06-04 18:03:15

je voulais donner quelques informations sur le problème plus général du contact entre deux ellipses. Calculer la distance d'approche la plus proche de deux ellipses était un problème de longue date et n'a été résolu analytiquement au cours des dix dernières années-il est pas du tout simple. La solution au problème peut être trouvée ici http://www.e-lc.org/docs/2007_01_17_00_46_52/.

La méthode générale pour déterminer s'il y a contact entre deux ellipses est d'abord de calculer la distance d'approche la plus proche des ellipses dans leur configuration actuelle, puis soustraire cette distance de leur magnitude actuelle de séparation. Si ce résultat est inférieur ou égal à 0, alors qu'ils sont en contact.

si quelqu'un est intéressé je peux poster du code qui calcule la distance de l'approche la plus proche--c'est en C++. Le code est pour le cas général de deux ellipses arbitraires, mais vous pouvez évidemment le faire pour un cercle et une ellipse, puisqu'un cercle est une ellipse avec petits et grands axes égaux.

0
répondu Fred Minkowski 2015-11-14 04:01:57