C++ 将椭圆转换为多段线

C++ 将椭圆转换为多段线,c++,geometry,ellipse,C++,Geometry,Ellipse,我现在有几个省略号。它们由一个中心点和两个向量定义,一个点指向最小轴,另一个点指向最大轴 但是,对于我正在创建的程序,我需要能够将这些形状作为多段线处理。我相当肯定,必须有一个公式,从我现有的可用数据生成一组点,但我不确定如何去做 有人知道怎么做吗 谢谢 (假设表示椭圆轴的两个向量平行于坐标轴) 如果有一条放射状光线从椭圆中心以角度角度,则该光线在点处与椭圆相交 x = x_half_axis * cos(angle); y = y_half_axis * sin(angle); 其中x_半_

我现在有几个省略号。它们由一个中心点和两个向量定义,一个点指向最小轴,另一个点指向最大轴

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

有人知道怎么做吗

谢谢

(假设表示椭圆轴的两个向量平行于坐标轴)

如果有一条放射状光线从椭圆中心以角度
角度
,则该光线在点处与椭圆相交

x = x_half_axis * cos(angle);
y = y_half_axis * sin(angle);
其中
x_半_轴
y_半_轴
仅使用半轴向量的长度(大小)

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

如果您的
delta
相对较大(椭圆上的几个点),则应仔细选择,以确保您的“椭圆多边形”很好地闭合:
2*Pi
应拆分为大量的
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]
重复该操作


预排序递归允许您按顺序发出多段线顶点。

这称为细分。查一查。您希望细分曲线。最简单的方法是从曲线的参数化表示开始。这一条也要查一下。你必须定义对这些多段线的要求。这叫做曲线的展平。两个向量对于一个椭圆来说太多信息了……太好了,我来试试,谢谢!只是一个简单的问题,对于你提到的半轴,它是半轴向量的长度,这是什么意思?它是从长轴还是短轴取的?@djcmm476这是两个向量的大小。上面将在原点“绘制”elipsoid,该原点与两点对齐。对他的结果应用旋转矩阵和平移矩阵将得到正确的值,并且你将看到矩阵的组成部分出现了问题。这肯定是一个比我更好的答案。我担心将旋转和过渡变换混合到公式中会使其过于复杂,但在这种情况下,它实际上表现得非常好。@AndreyT:是的,如果轴向量已知,它们包括旋转矩阵。