Comment détecter si une ellipse coupe(entre en collision avec) un cercle de
Je veux améliorer un système de collision.
Maintenant, je vous détecter si 2 objets irréguliers en collision si leur délimitation des rectangles entrent en collision.
Je veux obtenir le rectangle pour le correspondant de l'ellipse alors que pour les autres à utiliser un cercle. J'ai trouvé une méthode pour obtenir de l'ellipse coordonnées mais j'ai un problème lorsque je tente de détecter si elle coupe le cercle.
Connaissez-vous un algorithme pour tester si un cercle coupe l'ellipse?
Vous avez déclaré, opengl, mais pas une langue. Êtes-vous à l'aide de C?
J'ai pensé est liée à opengl. En fait, je suis à l'aide d'actionscript.
On peut opposent intersection entre deux ellipses si les cercles à l'aide de leurs grands rayons de ne pas se recouper.
J'ai pensé est liée à opengl. En fait, je suis à l'aide d'actionscript.
On peut opposent intersection entre deux ellipses si les cercles à l'aide de leurs grands rayons de ne pas se recouper.
OriginalL'auteur adiian | 2010-05-31
Vous devez vous connecter pour publier un commentaire.
Réponse courte: Résoudre exactement pour savoir si les deux objets se croisent est assez compliqué d'être infaisable pour le but de la détection de collision. Discrétiser votre ellipse comme un n-sided polygone pour n (selon le degré de précision que vous devez être) et de faire de la détection de collision avec ce polygone.
Réponse longue: Si vous insistez pour déterminer si la douceur de l'ellipse et le cercle se croisent, il y a deux approches principales. Les deux impliquent la résolution de la première pour les le point le plus proche vers le centre du cercle à l'ellipse, puis en comparant la distance sur le cercle de rayon.
Approche 1: Utiliser un paramétrage de l'ellipse. Transformer vos coordonnées afin que l'ellipse est à l'origine, avec ses axes alignés pour les axes x-y. Qui est:
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 le carré de la distance|| (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. À moins que je me manque quelque chose, cependant, la résolution de l'résultant (très méchant) l'équation pourt
n'est pas possible analytiquement, et doit être approchée 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.t
.Approche 2: Utilisation multidimensionnelle de calcul. Pas de changement de coordonnées est nécessaire.
Trouver le point sur l'ellipse la 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
(Minimisation du carré de la distance est équivalente à la minimisation de la distance, et beaucoup plus agréable à aborder car c'est un polynôme quadratique en x,y.)
Pour résoudre la contrainte du problème de minimisation, nous introduisons des multiplicateurs de Lagrange lambda, et de résoudre le système d'équations
Ici Jg est le gradient de g. C'est un système de trois (non-linéaire) équations à trois inconnues: x, y, et lambda. On peut résoudre ce système à l'aide de la Méthode de Newton, et l' (x,y) on en est au point le plus proche vers le centre du cercle.
Mise en garde: ces deux approches techniquement résoudre pour le point qui extremizes la distance vers le 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, l'ensemencement de votre aide pour régler une bonne estimation initiale (le centre du cercle fonctionne bien pour la Méthode 2; vous êtes sur votre propre pour la Méthode 1) permettra de réduire ce danger.
Potentiel Troisième Approche?: Il peut être possible de résoudre directement les racines de la système de deux équations quadratiques à deux variables représentant le cercle et de l'ellipse. Si une racine réelle existe, les objets se croisent. La façon la plus directe de la résolution de ce système, de nouveau à l'aide d'un algorithme numérique, comme la Méthode de Newton, n'aidera pas car le manque de convergence n'est pas nécessaire implique la non-existence d'une racine réelle. Pour les deux équations quadratiques à deux variables, cependant, il peut exister une méthode spécialisée qui est garanti de trouver de vraies racines, si elles existent. Moi je ne peux pas penser à une façon de le faire, mais vous souhaitez peut-être à la recherche de vous-même (ou voir si quelqu'un sur stackoverflow peut élaborer.)
merci, je pensais qu'il y est beaucoup de solution simple. Bien évidemment, il serait non seulement difficile à mettre en œuvre pour la détection de collision, mais aussi très lent.
OriginalL'auteur user168715
Une ellipse est définie un ensemble de points dont les
somme de la distance au point A et la distance à un 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 trouvent à l'intérieur de l'ellipse.
Un cercle est défini comme l'ensemble des points dont l'
la distance à un point C est le 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 comme l'intersection entre le cercle et 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
MODIFIER:
Après le commentaire de Martin DeMello et d'adapter ma réponse donc j'ai pensé plus sur le problème et a constaté que la réponse (avec la 2ème case) n'est toujours pas en mesure de détecter tous intersections:
Si cercle et de l'ellipse sont l'intersection n'très peu (juste un peu plus que de la tangente) P et Q ne vais pas mentir à l'intérieur de l'ellipse:
Donc, le test décrit ci-dessus détecte la collision seulement si le chevauchement est "assez grand".
Peut-être qu'il est assez bon pour votre pratique, bien que mathématiquement ce n'est pas parfait.
Pas de. Les définitions de l'ellipse et le cercle sont communs. Et le reste on peut en tirer facilement.
je suis assez sûr que d'un cercle peuvent se croiser une ellipse, et ont encore le point d'intersection de du centre du cercle et l'ellipse du focus se situent en dehors de l'ellipse. envisager le haut d'un cercle d'intersection d'une extrémité d'une longue, mince ellipse, et choisissez-les de loin. edit: voici un schéma: i.imgur.com/FU2MN.png
DeMello: vous avez raison. Je pense faire un deuxième vérifier la corriger. (sans l'avoir prouvé). Merci. Je vais modifier la réponse en conséquence.
Une pensée: je n'ai aucune preuve, mais dans le cas problème, je pense que l'intersection ira à la phase aiguë de l'arc PQ. Si c'est le cas, vous pouvez faire le test plus précis par l'essai d'un ensemble de points sur le cercle à l'intérieur qu'à l'arc et de voir si l'un de ceux qui sont à l'intérieur de l'ellipse.
OriginalL'auteur
Agrandir l'ellipse de la majeure et la mineure rayons par le rayon du cercle. Puis tester si le centre du cercle est à l'intérieur de cette nouvelle grande ellipse en faisant la somme des distances aux foyers de la grande ellipse.
Cet algorithme est très efficace. Vous pouvez précoce-si le cercle n'a pas d'intersection d'un cercle qui circonscrit l'ellipse. C'est plus lent que d'une boîte englobante de test, mais la recherche de la boîte englobante d'un non-axe aligné ellipse est délicate.
OriginalL'auteur Danny Epstein
trouver le point sur l'ellipse la plus proche du centre de le cercle
et ensuite, vérifiez si la distance de ce point est plus petit que le rayon du cercle
si vous avez besoin d'aide juste un commentaire, mais c'est tout simplement le calcul
edit: voici un chemin vers la solution, car il ya quelque chose de mal avec le lait caillé
centre donné α β sur l'ellipse
et (pour manque de se souvenir du terme) de rayon x, y, rayon b
le paramétrage est
r(Θ) = (ab)/( ( (BcosΘ)^2 + (asinΘ)^2 )^.5)
x(Θ) = α + sin(Θ)r(Θ)
y(Θ) = β + cos(Θ)r(Θ)
et puis il suffit de prendre le cercle de centre à (φ, ψ) et de rayon r
alors la distance d(Θ) = ( (φ - x(Θ))^2 + (ψ - y(Θ) )^2)^.5
le minimum de cette distance, c'est quand d'(Θ) = 0 (' pour les dérivés)
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 vous travaillez peut-il avoir des choses à vous aider à résoudre ce problème, et vous pouvez toujours prendre le chemin le plus facile et approximative racines via La Méthode de Newton
OriginalL'auteur Jean-Bernard Pellerin
si un cercle et une ellipse entrent en collision, puis de leurs frontières se croisent 1, 2, 3, ou 4 fois(ou infiniment nombreuses dans le cas d'une circulaire de l'ellipse, 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 évaluer l'équation du cercle au les coordonnées du centre de l'ellipse(x=c, y=e), ou vice-versa, et de voir si l'inégalité est vraie.
de vérifier les autres cas dans lesquels leurs limites se croisent, vous avez pour vérifier si le système d'équations décrit par (1) et (2) n'ont pas de 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 de la
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
Là vous l'avez, si je n'ai pas fait d'erreurs algébriques. Je ne sais pas combien vous pouvez vous simplifier l'expression qui en résulte, donc, cette solution peut être très gourmand en ressources, si vous allez vérifier de nombreux cercles/ellipses
xy
(par exemple, si c'est pas de l'axe aligné)? Je pense qu'une approche similaire pourrait être un travail même si.oups, j'ai oublié tout à propos biaisés ellipses, n'a jamais vraiment venu à travers dans mes différents cours de mathématiques. Je ne sais pas si il serait facile de modifier cette approche pour traiter avec eux.
depuis un cercle demeure inchangé, cependant vous traduire et faire pivoter votre système de coordonnées, vous pouvez redéfinir votre axes se situent le long des axes de l'ellipse
Pouvez-vous préciser la marche, près du début où vous avez f(x,y) = r^2 (1) et g(x,y) = 1 (2) et ensuite de dire que ceux-ci ont une solution commune lorsque f(x, y) + g(x, y) = r^2 + 1 (3)? Je ne suis pas sûr si je suis stupide, mais je ne vois pas pourquoi ça doit être vrai. Par exemple, une solution X,Y à la combinaison de l'équation (3) peut être tel que f(X,Y) = 2 et g(X,Y) = r^2 - 1. Ce ne serait pas une solution de (1) ou (2), individuellement.
OriginalL'auteur Bwmat
Oublier une solution mathématique. Comme vous pouvez facilement voir par le dessin, vous pouvez avoir jusqu'à quatre solutions, et donc susceptibles d'une classe de quatrième polynôme.
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 est situé à l'intérieur d'une ellipse et d'autant plus dans un cercle (un peu 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 aurez encore à écrire une équation polynomiale du solveur, probablement à l'aide de quelque chose comme la recherche binaire.
OriginalL'auteur Thomas Ahle
Ce n'est pas compliqué. user168715 la réponse est généralement droit, mais en faisant le calcul n'est pas nécessaire. Juste de la trigonométrie.
Trouver l'angle entre le centre des deux objets. En utilisant cela, vous pouvez trouver le point le plus proche vers le centre du cercle à l'ellipse à l'aide de la polaire-forme:
(Prises à partir de l'article de Wikipedia sur Ellipses)
Maintenant comparer la distance entre l'objet de deux centres, en soustrayant l'ellipse rayon et le rayon du cercle.
Peut-être que je suis absent quelque chose; peut-être ArcTan/Cos/Sin sont lents, mais je ne le pense pas, et il doit être rapide-approximations si nécessaire.
Je ne pense pas que vous pouvez utiliser l'angle entre les centres de calculer la distance. Par exemple, deux objets qui se chevauchent, mais la distance permet de calculer seraient positifs: imgur.com/FOE9ZkW
OriginalL'auteur phillipwei
Je sais que c'est trop tard mais j'espère que ça aiderait quelqu'un. Mon approche pour résoudre ce problème est d'interpoler l'ellipse en un n-dimensions du polygone, puis de construire une ligne entre chaque 2 points et que le cercle coupe avec des lignes ou pas. Ce n'est pas de fournir les meilleures performances, mais il est très pratique et facile à mettre en œuvre.
Pour interpoler l'ellipse à un n-dimensions polygone, vous pouvez utiliser:
c: Du centre de l'ellipse.
rx: Le rayon de x-alignés axe de l'ellipse.
ry: Le rayon de y aligné à l'axe de l'ellipse.
Maintenant, nous avons l'interpolation de points, on peut trouver l'intersection entre le cercle et les lignes entre chaque 2 points.
Une façon de trouver la ligne cricle intersection est décrit ici,
une intersection se produit si une intersection est produite entre les lignes et le cercle.
Espère que cela aide quelqu'un.
OriginalL'auteur Mo Abdul-Hameed
En supposant:
l'ellipse centrée à l'origine et avec le demi-grand
de l'axe (de longueur) orientés le long de l'axe des x, et avec un semi-mineur
l'axe de la longueur de b; E2 est l'excentricité au carré, c'est à dire (una-bb)/(a*a);
le cercle est centré en X,Y et de rayon r.
Le cas faciles sont:
le centre du cercle est à l'intérieur de l'ellipse (c'est à dire 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
(c'est à dire hypot(X,Y) > a+r) donc il n'y a pas une intersection.
Une approche pour les autres cas, c'est pour calculer la géodésique
coordonnées (latitude, hauteur) du centre du cercle. Le cercle
coupe l'ellipse si et seulement si la hauteur est inférieure au rayon de.
Les géodésiques de la latitude 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. Remarque la latitude géodésique est pas le même que l'angle polaire de l'ellipse de centre le point, à moins que le
l'ellipse est en fait circulaire.
Dans les formules de conversion de coordonnées géodésiques lat,ht à
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 la plus proche de X,Y) est le point de
avec la même latitude, mais la hauteur nulle, c'est à dire x = nucos(lat),
y = nu * (1-E2) * sin(lat).
Notez que nu est une fonction de la latitude.
Malheureusement, le processus de recherche lat,ht à partir de X,Y est un
itératif. Une approche consiste d'abord à trouver la latitude, puis
la hauteur.
Un peu d'algèbre montre que la latitude est satisfait
lat = atan2( Y+ E2*nusin(lat), X)
qui peut être utilisé pour calculer des approximations successives de la latitude,
départ au lat = atan2( Y, X(1.0-E2)), ou (plus efficace) peut être
résolu en utilisant la méthode de newton.
La plus grande E2 est, c'est à dire le flatter l'ellipse est, le plus
itérations seront nécessaires. Par exemple, si l'ellipse est presque
circulaire (disons E2<0.1), puis cinq itérations obtiendrez x,y ci-dessous
à l'intérieur d'un*1e-12, mais si l'ellipse est très plat, 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 = nucos(lat), y = nu(1-E2)*sin(lat)
et alors h est la distance de x,y du centre du cercle,
h = hypot( X-x, Y-Y)
OriginalL'auteur dmuir
Je voulais apporter quelque chose dans le problème plus général impliquant un contact entre deux ellipses. Le calcul de la distance de plus courte approche de deux ellipses a été longtemps un problème et n'a été résolu de manière analytique dans les dix dernières années-il n'est pas simple. La solution à ce 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 de plus courte approche des ellipses dans leur configuration actuelle, puis de soustraire de leur ampleur actuelle de la 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 le code qui calcule la distance de plus courte approche--c'est en C++. Le code est pour le cas général de deux arbitraire des ellipses, mais vous pouvez bien évidemment le faire pour un cercle et de l'ellipse, depuis un cercle est une ellipse avec l'égalité des petits et grands axes.
OriginalL'auteur Fred Minkowski