将椭圆转换为折线

4
我目前有几个椭圆。它们由一个中心点和两个向量定义,一个指向最小轴,另一个指向最大轴。
然而,我正在创建的程序需要将这些形状处理成折线。我相信一定有一个公式可以从我拥有的数据生成一组点,但我不确定如何去做。
有没有人有关于如何处理这个问题的想法?
谢谢。

这被称为镶嵌。查一下吧。你想要将曲线镶嵌。最简单的方法是从曲线的参数表示开始。也查一下这个。 - n. m.
你必须定义这些折线的要求。 - MBo
这被称为曲线平滑化。 - user1196549
两个向量对于一个椭圆来说是过多的信息... - V-X
2个回答

6
(假设表示椭圆轴的两个向量都平行于坐标轴)
如果你有一个从椭圆中心沿着角度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值,这并不重要。


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


然而,固定-delta角度步进具有一些缺点。它在椭圆的最小轴附近(曲率较小的位置)生成更密集的多边形点序列,在最大轴附近(曲率较大的位置)生成更稀疏的点序列。这实际上与期望行为相反:最好在曲率较大的区域具有更高的点密度。

如果这是您所关注的问题,那么您可以更新算法使其使用可变步进。随着我们接近最大轴,角度增量应逐渐减小,并在我们接近最小轴时增加。


太好了,我会试一试,谢谢!只有一个快速的问题,关于你提到的half_axis,它是半轴向量的长度,你是什么意思?这是从长轴还是短轴取得的? - djcmm476
@djcmm476 是你两个向量的大小。上面的内容将在原点处对齐两个点,"绘制"出你的椭球体。将旋转矩阵和平移矩阵应用于其中的结果会得到正确的值,你将看到矩阵的组成部分。 - IdeaHat

3

假设中心在(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]重复操作。

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


绝对比我的答案好。我担心将旋转和过渡变换混合到公式中会使其过于复杂,但在这种情况下,它实际上非常完美地发挥了作用。 - AnT stands with Russia
@AndreyT:是的,如果轴向量已知,则包括旋转矩阵。 - user1196549

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接