我没有看到任何现有的高速算法来处理这个问题。然而,我了解到了绘制类似图形的常见方法。基本上,你需要递归地将L分成更小的线段,直到计算出的左、中、右三个点足够接近一条直线,然后你就可以画出那条直线。我能够使用MathNet.Numerics.dll进行积分。以下是一些代码:
public static void DrawClothoidAtOrigin(List<Point> lineEndpoints, Point left, Point right, double a, double lengthToMidpoint, double offsetToMidpoint = 0.0)
{
var midpoint = new Point(a * C(lengthToMidpoint + offsetToMidpoint), a * S(lengthToMidpoint + offsetToMidpoint));
var nearest = NearestPointOnLine(left, right, midpoint, false);
if (Distance(midpoint, nearest) < 0.4)
{
lineEndpoints.Add(right);
return;
}
DrawClothoidAtOrigin(lineEndpoints, left, midpoint, a, lengthToMidpoint * 0.5, offsetToMidpoint);
DrawClothoidAtOrigin(lineEndpoints, midpoint, right, a, lengthToMidpoint * 0.5, offsetToMidpoint + lengthToMidpoint);
}
private static double Distance(Point a, Point b)
{
var x = a.X - b.X;
var y = a.Y - b.Y;
return Math.Sqrt(x * x + y * y);
}
private static readonly double PI_N2 = Math.Pow(Math.PI * 2.0, -0.5);
public static double C(double theta)
{
return Integrate.OnClosedInterval(d => Math.Cos(d) / Math.Sqrt(d), 0.0, theta) / PI_N2;
}
public static double S(double theta)
{
return Integrate.OnClosedInterval(d => Math.Sin(d) / Math.Sqrt(d), 0.0, theta) / PI_N2;
}