2012-07-03 3 views
2

Donc, j'ai des ellipses données - elles sont définies par leur point médian, un rayon horizontal (rh) et un rayon vertical (rv). Je les dessine en utilisant sin/cos et le résultat me semble assez bon (juste en m'assurant que ce n'est pas une source d'erreur). Maintenant, disons que j'ai un angle (ou un vecteur de direction) donné et je veux avoir le point sur le contour de l'ellipse avec cet angle/cette direction. Mon approche intuitive consistait simplement à utiliser le vecteur de direction, à le normaliser et à multiplier sa composante x avec rh, sa composante y avec rv. Maintenant, mon programme écrit et tous les calculs que j'ai faits sur un papier ne me donnent pas le point que je veux, mais un autre, bien qu'il soit encore sur le contour de l'ellipse. Cependant, cette méthode fonctionne très bien si la direction est l'une de (1,0), (0, 1), (-1, 0), (0, -1), (donc cela fonctionne pour 0 °, 90 °, 180 °, 270 °). Bien qu'il y ait une grande quantité de données concernant les ellipses sur Internet, je n'ai trouvé aucune information sur mon problème particulier - et je n'ai pas pu trouver de meilleure solution que celle ci-dessus.Comment obtenir un point sur le contour d'une ellipse donnée sous un angle?

Alors, une idée de comment y parvenir?

Répondre

2

Si je comprends ce que vous demandez alors je pense que ce que vous avez besoin est polar form of an ellipse où l'angle est mesuré à partir du centre de l'ellipse. En utilisant cette forme de l'ellipse, vous serez capable d'évaluer votre valeur de rayon elliptique pour un choix donné de thêta, puis de tracer votre point.

Si vous jetez un oeil à cette image gif vous verrez pourquoi l'utilisation de la paramétrique angle vous donner le bon résultat que à thêta = 90, 180, 270 et 360 degrés http://en.wikipedia.org/wiki/File:Parametric_ellipse.gif. Utilisez la forme polaire pour une ellipse et vous devriez obtenir les points que vous voulez.

1

Vous avez raison - l'angle paramétrique est et non identique à l'angle entre le point souhaité et l'axe X. Cependant, leurs tangentes sont proportionnelles (avec un facteur de rh/rv) afin que vous puissiez utiliser cette approche:

  • Obtenez la tangente de l'angle désiré
  • Multiplier cette tangente par rh/rv
  • Utilisez trigonometric identities pour calculer le sinus et cosinus à partir de la tangente
  • Echelle/la position du point en fonction des paramètres (point médian, rh, rv)

En Python:

from math import copysign, cos, sin, sqrt 

class Ellipse: 

     def __init__(self, mx, my, rh, rv): 
       self.mx = mx 
       self.my = my 
       self.rh = rh 
       self.rv = rv 

     def pointFromAngle(self, a): 
       c = cos(a) 
       s = sin(a) 
       ta = s/c ## tan(a) 
       tt = ta * self.rh/self.rv ## tan(t) 
       d = 1./sqrt(1. + tt * tt) 
       x = self.mx + copysign(self.rh * d, c) 
       y = self.my + copysign(self.rv * tt * d, s) 
       return x, y 
Questions connexes