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) .
|
b +-------._ (x,y)
| `@-._
| `-.
| `.
| \
-+--------------------+--->
O| a
Ensuite, le point suivant doit être tracé aux coordonnées suivantes:
x' = x + d / sqrt(1 + b²x² / (a²(a²-x²)))
y' = b sqrt(1 - x'²/a²)
Preuve
Soit le point suivant à (x + Δx, y + Δy) . Les deux points satisfont l'équation de l'ellipse:
x²/a² + y²/b² = 1
(x+Δx)²/a² + (y+Δy)²/b² = 1
Se débarrasser de y dans les équations donne:
Δy = b (sqrt(1 - (x+Δx)²/a²) - sqrt(1 - x²/a²))
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' :
Δy = -bxΔx / (a² sqrt(1 - x²/a²))
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:
Δx² + Δy² ~ d²
Nous remplaçons Δy dans ce qui précède et résolvons pour Δx :
Δx ~ d / sqrt(1 + b²x² / (a²(a²-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 :-)