所以,我给出了椭圆 - 它们由中点,水平半径(rh)和垂直半径(rv)定义。我正在使用sin / cos绘制它们,结果看起来相当不错(只是确保这不是错误源)。
现在说我有一个角度(或方向向量),我希望椭圆的轮廓上有一个角度/方向。我的直观方法是简单地使用方向向量,对其进行归一化并将其x分量乘以rh,其y分量乘以rv。现在,我的书面程序和我在纸上所做的所有计算都没有给出我想要的点,而是另一个,尽管它仍然在椭圆的轮廓上。但是,如果方向是(1,0),(0,1),( - 1,0),(0,-1)之一,则此方法可以正常工作(因此它适用于0°,90°, 180°,270°)。
虽然互联网上有关于省略号的大量数据,但我无法找到有关我的特定问题的任何信息 - 我无法提出比上述更好的解决方案。
那么,任何想法如何实现这一目标?
答案 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
在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