我目前有几个省略号。它们由一个中心点定义,然后是两个矢量,一个指向最小轴,另一个指向最大轴。
但是,对于我创建的程序,我需要能够将这些形状作为折线处理。我相当确定必须有一个公式来从我拥有的可用数据中生成一组点,但我不确定如何去做。
有没有人对如何解决这个问题有任何想法?
感谢。
答案 0 :(得分:5)
(假设两个表示椭圆轴的矢量都是平滑的坐标轴)
如果从角度为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
,但这并不重要。
如果最小 - 最大轴向量与坐标轴不平行,您仍然可以使用上述方法,然后通过应用相应的旋转变换将结果点转换为正确的最终位置。
固定三角形踩踏有一些缺点。它在椭圆的最小轴(曲率较小)附近产生更密集的多边形点序列,并在最大轴附近产生更稀疏的点序列(曲率更大)。这实际上与期望的行为相反:在较高曲率的区域中具有较高的点密度是更好的。
如果这对您来说是个问题,那么您可以更新算法以使其使用可变步进。当我们接近最大轴时,角度δ应逐渐减小,随着接近最小轴,角度增量应增加。
答案 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]
的操作。
预先顺序递归允许您按顺序发射折线顶点。