Longueur d'une portion d'ellipse
Rappel théorique
Considérons une ellipse de centre O, de demi-axe x égal à rx, de demi-axe y égal à ry.
Soit un point P(x, y) de l'ellipse et θ l'angle (OP, Ox).
Tout point P de l'ellipse a pour coordonnées :
2 points infiniment voisins de l'ellipse sont tels que :
Autrement dit, la longueur de l'ellipse entre ces 2 points est :
Par conséquent, la longueur de l'ellipse entre 2 points P1 et P2 peut s'écrire :
en ayant posé au préalable A = 0.5 [rx² + ry²] et B = 0.5 [rx² - ry²]
Cette intégrale, dite intégrale elliptique, n'est pas calculable; c'est ici que l'outil informatique intervient.
On va discrétiser : L'arc d'ellipse sera assimilé à une ligne polygonale de n segments
Méthodologie
Le sens de parcours trigonométrique sera adopté, de sorte qu'il n'existe aucune ambiguité.En effet, avec 2 points, il y a 2 portions d'ellipse. Donc , l'ordre point de départ - point d'arrivée est fondamental.
- On demande d'abord rx, ry, les abscisses respectives de P1 et P2 : x1 et x2, puis les signes des ordonnées de P1 et de P2.
- Aprés avoir vérifié que rx et ry sont strictement positifs, on vérifie que x1 et x2 sont plausibles, c'est-à-dire que |x1| ≤ rx et |x2| ≤ rx
Les signes des ordonnées indiqueront dans quel quadrant on se trouve.
Remarque :
Pour calculer le périmêtre total de l'ellipse, il suffira que l'utilisateur entre x1=0 , signe + et x2=0, signe -
- on définit le nombre de segments d'interpolation n
- on calcule les coefficients A et B définis précédemment
- on définit une fonction teta dans laquelle :
si x=rx alors retourne 0 ( pas de calcul ! teta=0)
si le signe est négatif alors eps=-1 sinon eps=1
si x=0 alors retourne eps . Π/2 sinon retourne eps.acos(x / rx)
- on calcule l'incrément angulaire Δθ
si les 2 angles sont nuls, c'est que l'on veut le périmêtre alors Δθ=2Π/ n
sinon on calcule la différence angulaire diff = θ2 - θ1
Comme on s'impose le sens trigonométrique, on teste le signe :
si diff < 0 alors Δθ=2θ + diff / n sinon Δθ= diff / n
- on calcule enfin la longueur :
initialisation de la longueur à 0.
pour i =1 jusqu'à la valeur n faire
θi = θ1+(i*Δθ)
longueur = longueur + |Δθ| * sqrt( A - B * cos(2*θi) )
Traduction en php
Développement
On pourrait continuer en faisant varier le nombre d'incréments n et faire un calcul de précision relative de façon à voir à partir de quelle valeur de n le gain de précision supplémentaire obtenu en augmentant n soit en dessous d'une valeur définie.
On pourrait aussi tenir compte d'une position absolue à l'écran comme l'indique la figure suivante