2017-01-27 1 views
0

Je peux penser à deux façons de créer une classe Ellipse.Comment décrire une ellipse adaptée à la 3D (géométrie, rendu, physique), dans n'importe quelle langue

En mathématiques, une ellipse est décrite par deux points focaux et la longueur de l'axe majeur ou semi-majeur.

Une structure typique serait comme ceci:

  • Focus 1: Vector3D
  • Focus2: Vector3D
  • semiMajorAxis: deux
  • planeNormal: Vector3D

Cependant, j'ai trouvé c'est sous-optimal, car 99% du temps, je ne me soucie pas vraiment des points focaux.

Il semble plus difficile de déterminer comment croiser des lignes/rayons ou effectuer des projections. Au lieu de cela, je représenterais une ellipse comme un cercle étiré le long d'un vecteur.

La structure serait quelque chose comme ceci:

  • centre: Vector3D
  • rayon: Double
  • stretchVector: Vector3D (l'axe le long duquel le tronçon est appliqué)
  • stretchRate: Double
  • planeNormal: Vector3D

L'idée est d'effectuer tous les tests/traces/projections comme si c'était fait contre un simple cercle, simplement en mettant à l'échelle les valeurs d'entrée et de sortie avant de les envoyer à mes méthodes de cercle.

Cependant je manque d'expérience dans ce domaine, donc je ne suis pas sûr que l'on est:

  • le plus facile à utiliser
  • le plus rapide à calculer (il est en 3D, donc J'ai besoin de bonnes perfs)

EDIT: en fait, je besoin ellipse visages volume (section de cylindre, cône sec tion) plutôt que des mouvements. Donc, mon utilisation principale serait de raycast ou de la croiser avec des lignes, des plans, des cercles, d'autres ellipses, etc ...

+0

Pour 3D vous avez également besoin vecteur normal au plan ellipse – MBo

+0

vous pouvez également consulter Outils géométriques/bibliothèque magie sauvage à 'https: //www.geometrictools. com/'et livre'Geometric Tools pour Computer Graphics' pour trouver des approches efficaces – MBo

+0

Oui, je l'ai oublié. Edited;) – cronvel

Répondre

1

La forme d'une ellipse est définie par les longueurs de l'axe principal a et l'axe secondaire b. Ensuite, il est probablement une bonne idée de définir le plan contenant via le point central C et le vecteur normal n_0 normalisé à la longueur un. L'information restante dont vous avez besoin est la direction de l'axe principal. Cela pourrait être spécifié par juste un angle à une ligne par défaut dans le plan spécifié, mais je ne connais pas un moyen naturel et efficace de le faire. Donc, je choisirais de spécifier le vecteur de direction v_a de l'axe principal. Cela introduit une certaine redondance puisque n_0 . v_a = 0 doit contenir et en plus |v_a| = 1 ou |v_a| = a (la première condition est plus efficace pour vos besoins). Le vecteur de direction v_b du petit axe peut être calculé à partir de l'information ci-dessus, mais pour des raisons d'efficacité, on préférera probablement le précalculer.

Alltogether on pourrait représenter une ellipse en 3D avec les données suivantes:

  • a, b: valeurs réelles longueur de désignation de l'axe majeur et mineur, resp.
  • C: point 3D, le centre de l'ellipse
  • n_0: vecteur 3D, vecteur normal du plan contenant
  • v_a, v_b: vecteurs 3D désignant la direction de gros et de détail, resp.

remplissant les conditions suivantes:

  • a >= b > 0
  • |n_0| = |v_a| = |v_b| = 1
  • n_0 = v_a x v_b
  • v_a . v_b = 0

Un test d'intersection efficace peut maintenant être fait de cette façon :

  1. Calculez le point d'intersection P de par ex. un rayon avec le plan contenant défini par C et n_0.
  2. Transformez le point d'intersection P en position d'ellipse canonique en 2D (centre = (0,0), grand axe parallèle à l'axe des x) en calculant P* = M . (P-C) (voir la définition de la matrice 2x3 M ci-dessous).
  3. transformer l'ellipse à un cercle de rayon b en calculant P** = (b/a P*_x, P*_y)
  4. maintenant P est à l'intérieur de la 3D-ellipse d'origine si et seulement si on a: P**_x^2 + P**_y^2 <= b^2.

La matrice de transformation M est simplement

/v_a_x v_b_x n_0_x \ 
\ v_a_y v_b_y n_0_y/
+0

Merci pour votre réponse. S'il vous plaît, pouvez-vous expliquer pourquoi est-ce mieux que la définition en utilisant les 2 points focaux, en particulier pour raycasting et intersections avec des lignes, des plans, des cercles et d'autres ellipses? – cronvel

+0

@cronvel Ok, maintenant j'ai votre vrai problème. voir mes conseils ajoutés. – coproc

+0

@cronvel J'ai ajouté un simple test d'intersection pas-à-pas – coproc

0

Si vous faites de la physique, vous devriez vous intéresser à la mise au point, car c'est très pertinent dans une telle configuration . Voir orbital elements pour les façons de décrire les ellipses dans de tels contextes. Vous avez besoin d'une telle paramétrisation si par ex. vous voulez avoir la vitesse d'un corps céleste.

Cela dit, je pense que la meilleure description non-physique d'une ellipse en 3D pourrait être la suivante:

x(t) = a + cos(t) b + sin(t) c 

Ici a est la position du centre, b est le vecteur du centre à la la fin de l'axe demi-grand, et c est le vecteur du centre à la fin de l'axe semiminor. Vous vous attendez à ce que b et c soient perpendiculaires les uns aux autres, c'est-à-dire qu'ils aient un point zéro. Pour t 0,2 [0,2π) cela vous donnera tous les points de l'ellipse, et de nombreuses propriétés géométriques peuvent être décrites en termes de conditions qui dépendent de t, donc vous pouvez résoudre pour t.

+0

Merci pour votre réponse. En fait j'ai besoin d'ellipse comme faces de volume (section de cylindre, section de cône) plutôt que de mouvements. Donc, mon utilisation principale serait de raycast ou de la croiser avec des lignes, des plans, des cercles, d'autres ellipses, etc ... – cronvel

+0

@cronvel: Une courbe comme une face d'un corps solide sonne mal. Vous devriez avoir une surface là-bas. Je suppose que j'irais chercher une description implicite dans ces cas: une équation dans * x, y, z * satisfaite par tous les points de la surface. – MvG