C# 迭代求椭圆上弧长对应的点

C# 迭代求椭圆上弧长对应的点,c#,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) { f

给定一个距离(弧长)逆时针远离椭圆上的已知点(
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_0是椭圆上与P_0对应的参数t
点GetPos(双距离,双t_0,双分辨率=5000,双ε=0.1)
{
对于(int i=0;i
不幸的是,如果
t
值给出的弧长刚好超过ε值,则此代码可能不会收敛。由于这是一个减小t的回路,超调量不会被修正

我在考虑将其建模为一个控制问题,使用类似PID控制器的东西。然而,我意识到,由于设定点(即我所需的弧长)和我的输出(本质上是参数
t
)是指不同的变量,我不知道如何继续


有没有更好的方法来解决这类问题,或者我目前的方法遗漏了什么?

经过一番思考后,我改用了二进制搜索方法,因为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\u 0
到0)。

首先-是的,你是对的(这里有很多内容:)-现在的问题是:你现在对数值积分有多大的兴趣?matlab可以很好地解决这样的问题。您可以从matlab生成一个可由c#调用的dll。matlab可以返回很好的解的jpg图。