How to get a point on an ellipse's outline given an angle?

与世无争的帅哥 提交于 2021-02-19 05:43:29

问题


So, I have ellipses given - they are defined by their midpoint, an horizontal radius(rh) and an vertical radius(rv). I'm drawing them using sin/cos and the result looks fairly good to me(just making sure this isn't an error source).

Now say I have an angle(or a direction vector) given and I want to have the point on the ellipse's outline with that angle/direction. My intuitive approach was to simply use the direction vector, normalise it and multiply its x-component with rh, its y-component with rv. Now both my written program AND all the calculations I did on a paper give me not the point I want but another one, though it's still on the ellipse's outline. However, this method works just fine if the direction is one of (1,0), (0, 1), (-1, 0), (0, -1), (so it works for 0°, 90°, 180°, 270°).

Although there is a farily big amount of data about ellipses themselves on the internet, I couldn't find any information about my particular problem - and I couldn't come up with any better solution than the above one.

So, any idea how to achieve this?


回答1:


If I understand what you are asking then I think that what you need is polar form of an ellipse where the angle is measured from the ellipse centre. Using this form of the ellipse, you will be able to evaulate your elliptic radius value for a given choice of theta and then plot your point.

If you take a look at this gif image you will see why using the parametric angle give you the correct result only at theta = 90, 180, 270 and 360 degrees http://en.wikipedia.org/wiki/File:Parametric_ellipse.gif . Use the polar form for an ellipse and you should get the points that you want.




回答2:


You are correct - the parametric angle is not the same as the angle between the desired point and the X axis. However, their tangents are proportional (with a factor of rh/rv) so you can use this approach:

  • Get the tangent of the desired angle
  • Multiply this tangent by rh/rv
  • Use trigonometric identities to compute the sine and cosine from the tangent
  • Scale/position the point according to the parameters (midpoint, rh, rv)

In 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


来源:https://stackoverflow.com/questions/11309596/how-to-get-a-point-on-an-ellipses-outline-given-an-angle

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!