Je recherche un algorithme simple pour tracer des points uniformément répartis sur une ellipse, étant donné les axes majeurs et mineurs. C'est vraiment facile à faire avec un cercle comme ça:
var numberOfPoints = 8;
var angleIncrement = 360 / numberOfPoints;
var circleRadius = 100;
for (var i = 0; i < numberOfPoints; i++) {
var p = new Point();
p.x = (circleRadius * Math.cos((angleIncrement * i) * (Math.PI / 180)));
p.y = (circleRadius * Math.sin((angleIncrement * i) * (Math.PI / 180)));
}
(ce qui crée des points qui sont à la même distance de leurs points voisins) mais je ne peux pas trouver ou trouver un moyen de le faire sur une ellipse. (Solutions en AS3 préférées, mais non requises.)
mathematics
actionscript-3
Justin C. Rounds
la source
la source
Réponses:
Re-paramétrez-le par longueur d'arc et échantillonnez uniformément. Si vous avez besoin d'aide pour faire le calcul, je le demanderais ici:
https://math.stackexchange.com/
il a également été demandé ici: /mathpro/28070/finding-n-points-that-are-equidistant-around-the-circumference-of-an-ellipse
la source
Approximation raisonnable
Comme déjà indiqué dans d'autres réponses, il n'y a aucun moyen exact de le faire. Cependant, il est possible d'approximer efficacement une solution.
Ma formule ne gérera que le quadrant supérieur droit . Divers changements de signe devront être appliqués pour gérer d'autres quadrants.
Soit d la distance d'arc souhaitée entre des points consécutifs. Supposons que le dernier point tracé soit à (x, y) .
Ensuite, le point suivant doit être tracé aux coordonnées suivantes:
Preuve
Soit le point suivant à (x + Δx, y + Δy) . Les deux points satisfont l'équation de l'ellipse:
Se débarrasser de y dans les équations donne:
Nous supposons que Δx est suffisamment petit, nous remplaçons donc f (x + Δx) -f (x) par f '(x) Δx en utilisant l' approximation linéaire pour f' :
Si d est suffisamment petit, alors Δx et Δy sont suffisamment petits et la longueur de l'arc est proche de la distance euclidienne entre les points. L'approximation suivante est donc valable:
Nous remplaçons Δy dans ce qui précède et résolvons pour Δx :
Et si d n'est pas assez petit?
Si d est trop grande pour les approximations ci - dessus soient valides, il suffit de remplacer d avec d / N , par exemple N = 3 , et seulement tracer un point sur N .
Note finale
Cette méthode a des problèmes aux extrêmes ( x = 0 ou y = 0 ), qui peuvent être traités en utilisant des approximations supplémentaires ( c'est-à-dire en sautant le dernier point du quadrant, qu'il soit réellement tracé ou non).
La manipulation de l'ellipse entière sera probablement plus robuste en refaisant le tout en utilisant des coordonnées polaires. Cependant, c'est un peu de travail, et c'est une vieille question, donc je ne le ferai que s'il y a un intérêt de l'affiche originale :-)
la source
Je dépend en quelque sorte de ce que vous entendez par "uniformément". J'ai écrit un article sur l'utilisation des ellipses dans mon jeu ici: http://world-create.blogspot.com/2009/01/ellipse-maths.html
De la poste:
Vous pouvez obtenir des points espacés uniformément autour de l'ellipse par l' angle en faisant:
Mais selon les spécificités de votre ellipse, ces valeurs pourraient être regroupées (s'il y a une extrémité "pointue" vers l'ellipse).
la source
La réponse, avec le code Java complet, se trouve ici sur StackOverflow
Répondu par:
édité le 11 décembre 13 à 4:14 John Paul
répondu 11 déc. 13 à 3:48 Dave
la source