迭代地在椭圆上找到与弧长相对应的点

时间:2015-05-06 03:02:35

标签: c#

给定椭圆上已知点(P_0)逆时针方向的距离(弧长),我试图找到该距离处的点(P_1)。

由于我不能分析地评估对应于特定弧长的t,因此我不得不迭代每个离散点,直到得到答案。

我的初始代码是这样的:

// t_0 is the parametric t on the ellipse corresponding to P_0

Point GetPos(double distance, double t_0, double res = 5000, double epsilon = 0.1)
{
    for(int i = 0; i < res; ++i)
    {
        // The minus is to make the point move in an clockwise direction
        t = t_0 - (double)(i)/(double)res * t_0;
        // Find the integral from t to t_0 to get the arc length
        // If arc length is within epsilon, return the corresponding point
    }
} 

不幸的是,如果t值给出的弧长恰好超过了epsilon值,则此代码可能无法收敛。由于这是一个减小t的循环,因此不会纠正过冲。

我正在考虑将此建模为控制问题,使用类似PID控制器的东西。但是,我意识到由于设定点(这是我想要的弧长)和我的输出(基本上是参数t),指的是不同的变量,我不知道如何继续。

有没有更好的方法来解决这类问题,还是我错过了目前的做法?

1 个答案:

答案 0 :(得分:0)

经过一番思考后,我使用了二进制搜索方法,因为PID控制器难以调整,并且通常不能快速收敛到所考虑的椭圆的所有情况。

double max = t_0; double min = 0; double result = 0; double mid = 0;

mid = (max - min) / 2.0;
while ((Math.Abs(distance - result) > epsilon))
{
    result = // Arc Length from t_0 to mid
    if (result > distance) 
    {
        min = mid;
        mid = ((max - mid) / 2.0) + min;
    }
    else
    {
        max = mid;
        mid = (mid - min) / 2.0;
    }
}

// Return the point at t = max

二进制搜索的工作原理是搜索始终超出有序范围(从t_0到0)。