首页 文章

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

提问于
浏览
2

因此,我给出了省略号 - 它们由中点,水平半径(rh)和垂直半径(rv)定义 . 我正在使用sin / cos绘制它们,结果对我来说看起来相当不错(只是确保这不是错误源) .

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

虽然互联网上有大量有关椭圆本身的数据,但我找不到有关我的特定问题的任何信息 - 我无法提出比上述更好的解决方案 .

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

2 回答

  • 1

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

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

  • 2

    你是对的 - 参数角度与所需点和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
    

相关问题