我目前有几个椭圆。它们由一个中心点和两个 vector 定义,一个指向最小轴,另一个指向最大轴。

但是,对于我正在创建的程序,我需要能够将这些形状作为折线处理。我相当确定一定有公式可以从我拥有的可用数据中生成一组点,但我不确定如何去做。

有没有人对如何解决这个问题有任何想法?

谢谢。

最佳答案

(假设表示椭圆轴的两个 vector 都与坐标轴平行)

如果您有一条径向光线从椭圆中心以 angle 角度发出,则该光线在点处与椭圆相交

x = x_half_axis * cos(angle);
y = y_half_axis * sin(angle);

其中 x_half_axisy_half_axis 只是半轴 vector 的长度(大小)。

因此,只需选择一些足够小的角度步长 delta 。使用该步骤在整个 [0...2*Pi] 范围内围绕中心点扫掠,从 0 角度开始,然后是 delta 角度,然后是 2 * delta 角度,依此类推。对于每个 angle 值,椭圆点的坐标将由上述公式给出。这样,您将生成椭圆的多边形表示。

如果您的 delta 相对较大(椭圆上的点很少),那么应该仔细选择它以确保您的“椭圆多边形”很好地闭合:2*Pi 应该分成整数个 delta 步骤。尽管对于较小的 delta 值,它并不重要。

如果您的最小-最大轴 vector 不平行于坐标轴,您仍然可以使用上述方法,然后通过应用相应的旋转变换将结果点转换到正确的最终位置。

但是,固定增量角度步进有一些缺点。它在椭圆的最小轴附近(曲率较小)生成更密集的多边形点序列,在最大轴附近(曲率较大)生成稀疏点序列。这实际上与理想的行为相反:在较高曲率的区域中具有较高的点密度会更好。

如果这对您来说是个问题,那么您可以更新算法以使其使用可变参数步进。随着我们接近最大轴,角度 delta 应该逐渐减小,并随着我们接近最小轴而增加。

10-06 10:39
查看更多