给定椭圆上已知点(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
),指的是不同的变量,我不知道如何继续。
有没有更好的方法来解决这类问题,还是我错过了目前的做法?
答案 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)。