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图。