椭圆的一部分的周长
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
如何求椭圆的弧长?
输入是
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