我目前有几个椭圆。它们由一个中心点和两个 vector 定义,一个指向最小轴,另一个指向最大轴。
但是,对于我正在创建的程序,我需要能够将这些形状作为折线处理。我相当确定一定有公式可以从我拥有的可用数据中生成一组点,但我不确定如何去做。
有没有人对如何解决这个问题有任何想法?
谢谢。
最佳答案
(假设表示椭圆轴的两个 vector 都与坐标轴平行)
如果您有一条径向光线从椭圆中心以 angle
角度发出,则该光线在点处与椭圆相交
x = x_half_axis * cos(angle);
y = y_half_axis * sin(angle);
其中
x_half_axis
和 y_half_axis
只是半轴 vector 的长度(大小)。因此,只需选择一些足够小的角度步长
delta
。使用该步骤在整个 [0...2*Pi]
范围内围绕中心点扫掠,从 0
角度开始,然后是 delta
角度,然后是 2 * delta
角度,依此类推。对于每个 angle
值,椭圆点的坐标将由上述公式给出。这样,您将生成椭圆的多边形表示。如果您的
delta
相对较大(椭圆上的点很少),那么应该仔细选择它以确保您的“椭圆多边形”很好地闭合:2*Pi
应该分成整数个 delta
步骤。尽管对于较小的 delta
值,它并不重要。如果您的最小-最大轴 vector 不平行于坐标轴,您仍然可以使用上述方法,然后通过应用相应的旋转变换将结果点转换到正确的最终位置。
但是,固定增量角度步进有一些缺点。它在椭圆的最小轴附近(曲率较小)生成更密集的多边形点序列,在最大轴附近(曲率较大)生成稀疏点序列。这实际上与理想的行为相反:在较高曲率的区域中具有较高的点密度会更好。
如果这对您来说是个问题,那么您可以更新算法以使其使用可变参数步进。随着我们接近最大轴,角度 delta 应该逐渐减小,并随着我们接近最小轴而增加。