将椭圆转换为折线

时间:2014-10-15 15:14:28

标签: c++ geometry ellipse

我目前有几个省略号。它们由一个中心点定义,然后是两个矢量,一个指向最小轴,另一个指向最大轴。

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

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

感谢。

2 个答案:

答案 0 :(得分:5)

(假设两个表示椭圆轴的矢量都是平滑的坐标轴)

如果从角度为angle的省略号中心发出径向光线,则该光线在点处与椭圆相交

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

其中x_half_axisy_half_axis只是你的半轴向量的长度(幅度)。

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

如果你的delta比较大(椭圆上的几个点),那么应该仔细选择它以确保你的"椭圆形多边形"很好地关闭:2*Pi应该分成几个delta个步骤。尽管价值较小delta,但这并不重要。


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


固定三角形踩踏有一些缺点。它在椭圆的最小轴(曲率较小)附近产生更密集的多边形点序列,并在最大轴附近产生更稀疏的点序列(曲率更大)。这实际上与期望的行为相反:在较高曲率的区域中具有较高的点密度是更好的。

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

答案 1 :(得分:2)

假设(Xc,Yc)处的中心和轴向量(Xm,Ym)(XM,YM)(这两个应该是正交的),公式为

X = XM cos(t) + Xm sin(t) + Xc
Y = YM cos(t) + Ym sin(t) + Yc

t中的[0,2Pi]

为了在轮廓上有效分布端点,我建议使用递归应用的最大偏差标准:绘制对应于范围[t0,t2]的弧,尝试中点值t1=(t0+t2)/2。如果相应的点使得P1到行P0P2的距离低于恒定阈值(例如一个像素),则可以按段P0P1逼近弧。否则,请重复弧[t0,t1][t1,t2]的操作。

预先顺序递归允许您按顺序发射折线顶点。