椭圆的一部分的周长

Perimeter of a PART of an ellipse

如何求椭圆的弧长?

输入是

a = length of major axis
b = length of minor axis
c = angle from X axis

请注意完整周长是

PI * ( 3*(a + b) - SQRT( (3*a + b) * (a + 3*b) ) )

我要的是椭圆周长PART的长度

乍一看这似乎是纯数学问题,但实际上并非如此

因为这个问题无法通过标准代数数学方法解决(没有测角学可以帮助至少我们仍然不知道正确的 answer/equation)因为 我们根本不知道周长是多少椭圆是。你能找到的所有方程式(包括你发布的那个)都只是适用于特定偏心率范围的近似值(因此它们并不精确,并且对于不同偏心率的椭圆,它们的误差会越来越大)!!!

沿周长积分是可能的(曲线积分)但是 IIRC 它会导致不可积分的热量,所以你需要使用数值方法来代替(编程的地方)。

计算 arc-length 的最简单方法是将椭圆弧转换为一组非常小的线,然后使用参数化椭圆方程在某个 for 循环中对它们的长度求和。

现在只需选择行数或数值积分方法即可满足您的精度要求...

椭圆的方向对于这个问题没有意义,因为你的圆弧从长轴开始......所以你可以解决它,因为它总是轴对齐。

这里使用以下行的简单 C++ 示例:

int e;
float a=?,b=?,ang=?,l,aa,da=0.001*M_PI,x,y,x0,y0;
aa=0.0;                                    // starting angle
x=a*cos(aa);                               // starting point
y=b*sin(aa); 
for (e=1,l=0.0;e;)
 {
 aa+=da; if (aa>=ang){ e=0; aa=ang; }      // ending angle reached?
 x0=x; x=a*cos(aa);                        // 2 consequent points on ellipse (line)
 y0=y; y=b*sin(aa);
 l+=sqrt(((x-x0)*(x-x0))+((y-y0)*(y-y0))); // add line length to arclength
 }

其中 a,b 是您的 semi-axises,ang 是 angular 弧的大小,l 是您的 arc-length。 da 是积分步长,越小精度越高但计算时间越长...

我直接在 SO 编辑器中键入此代码,因此它可能包含语法错误...

顺便说一句,这里有一些与椭圆周长问题相关的 QA 以供参考:

  • Algorithm for shape calculation (Ellipse)
  • I need an equation for equal movement along an ellipse
  • Find equidistant points on ellipse or Beizier curves