2

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

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

尽管互联网上有大量关于椭圆本身的数据,但我找不到任何关于我的特定问题的信息——而且我想不出比上述更好的解决方案。

那么,知道如何实现这一目标吗?

4

2 回答 2

2

如果我理解您的要求,那么我认为您需要的是椭圆的极坐标形式,其中角度是从椭圆中心测量的。使用这种椭圆形式,您将能够针对给定的 theta 选择评估椭圆半径值,然后绘制您的点。

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

于 2012-07-03T20:38:11.640 回答
1

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

  • 得到所需角度的正切
  • 将此切线乘以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
于 2012-07-03T15:23:55.353 回答