如何在给定角度的椭圆轮廓上得到一个点?

时间:2012-07-03 11:04:32

标签: geometry ellipse

所以,我给出了椭圆 - 它们由中点,水平半径(rh)和垂直半径(rv)定义。我正在使用sin / cos绘制它们,结果看起来相当不错(只是确保这不是错误源)。

现在说我有一个角度(或方向向量),我希望椭圆的轮廓上有一个角度/方向。我的直观方法是简单地使用方向向量,对其进行归一化并将其x分量乘以rh,其y分量乘以rv。现在,我的书面程序和我在纸上所做的所有计算都没有给出我想要的点,而是另一个,尽管它仍然在椭圆的轮廓上。但是,如果方向是(1,0),(0,1),( - 1,0),(0,-1)之一,则此方法可以正常工作(因此它适用于0°,90°, 180°,270°)。

虽然互联网上有关于省略号的大量数据,但我无法找到有关我的特定问题的任何信息 - 我无法提出比上述更好的解决方案。

那么,任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

如果我理解你的要求那么我认为你需要的是polar form of an ellipse,其中角度是从椭圆中心测量的。使用这种形式的椭圆,您将能够为给定的θ选择评估椭圆半径值,然后绘制您的点。

如果你看一下这个gif图像,你会发现为什么使用参数角度在theta = 90,180,270和360时给你正确的结果 http://en.wikipedia.org/wiki/File:Parametric_ellipse.gif。使用极坐标形式作为椭圆,你应该得到你想要的点。

答案 1 :(得分:1)

您是正确的 - 参数角度与所需点和X轴之间的角度相同。但是,它们的切线是成比例的(因子为rh/rv),所以你可以使用这种方法:

  • 获取所需角度的正切
  • 将此切线乘以rh/rv
  • 使用trigonometric identities从正切
  • 计算正弦和余弦
  • 根据参数(中点,rh,rv)
  • 缩放/定位点

在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