我目前有几个椭圆。它们由一个中心点和两个向量定义,一个指向最小轴,另一个指向最大轴。
然而,我正在创建的程序需要将这些形状处理成折线。我相信一定有一个公式可以从我拥有的数据生成一组点,但我不确定如何去做。
有没有人有关于如何处理这个问题的想法?
谢谢。
然而,我正在创建的程序需要将这些形状处理成折线。我相信一定有一个公式可以从我拥有的数据生成一组点,但我不确定如何去做。
有没有人有关于如何处理这个问题的想法?
谢谢。
angle
发射的径向射线,则该射线与椭圆相交于点。x = x_half_axis * cos(angle);
y = y_half_axis * sin(angle);
x_half_axis
和y_half_axis
只是您半轴向量的长度(大小)。
因此,只需选择一些足够小的角度步长delta
。通过该步长从中心点在整个[0…2 * Pi]
范围内扫过,从0
角度开始,然后是delta
角度,然后是2* delta
角度等。对于每个angle
值,椭圆点的坐标将由上述公式给出。这样,您就可以生成椭圆的多边形表示。
如果您的delta
相对较大(椭圆上的点较少),则应仔细选择它以确保您的“椭圆多边形”漂亮地关闭:2 * Pi
应分成一个delta
步数的整数倍。尽管对于小的delta
值,这并不重要。
如果您的最小-最大轴向量不与坐标轴平行,则仍然可以使用上述方法,然后通过应用相应的旋转变换将结果点转换为正确的最终位置。
然而,固定-delta角度步进具有一些缺点。它在椭圆的最小轴附近(曲率较小的位置)生成更密集的多边形点序列,在最大轴附近(曲率较大的位置)生成更稀疏的点序列。这实际上与期望行为相反:最好在曲率较大的区域具有更高的点密度。
如果这是您所关注的问题,那么您可以更新算法使其使用可变步进。随着我们接近最大轴,角度增量应逐渐减小,并在我们接近最小轴时增加。
假设中心在(Xc,Yc)
,轴向量为(Xm,Ym)
和(XM,YM)
(这两个应该正交),则公式为
X = XM cos(t) + Xm sin(t) + Xc
Y = YM cos(t) + Ym sin(t) + Yc
在[0,2Pi]
内使用t
以获得有效的轮廓端点分布。
为了获得轮廓上端点的高效分布,建议使用最大偏差准则进行递归应用:绘制对应于范围[t0,t2]
的弧线时,请尝试中点值t1=(t0+t2)/2
。如果相应的点使得P1
到线段P0P2
的距离低于一个常量阈值(例如一个像素),则可以通过线段P0P1
来近似该弧线。否则,对弧线[t0,t1]
和[t1,t2]
重复操作。
先序递归允许您按顺序发出折线顶点。