3

コルヌ スパイラル (別名、クロソイド) またはスプラインの適切な描画アルゴリズムを見た人はいますか? 弧と線については、ブレゼンハムのアルゴリズムのようなものがあります。それはクロソイドに適応できますか?

ウィキペディアのページには、次の Sage コードがあります。

p = integral(taylor(cos(L^2), L, 0, 12), L)
q = integral(taylor(sin(L^2), L, 0, 12), L)
r1 = parametric_plot([p, q], (L, 0, 1), color = 'red')

利用可能なパラメトリック プロットのサンプル コードはありますか? Web 検索ではあまり表示されません。

4

1 に答える 1

3

このための既存の高速アルゴリズムは見当たりませんでした。しかし、私はこのようなものを描くための一般的な方法を理解するようになりました。基本的に、計算された左、中、右の点が直線に十分近くなり、その線を引くことができるようになるまで、Lを再帰的に分割します。統合にはMathNet.Numerics.dllを使用できました。いくつかのコード:

    public static void DrawClothoidAtOrigin(List<Point> lineEndpoints, Point left, Point right, double a, double lengthToMidpoint, double offsetToMidpoint = 0.0)
    {
        // the start point and end point are passed in; calculate the midpoint
        // then, if we're close enough to a straight line, add that line (aka, the right end point) to the list
        // otherwise split left and right

        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;
    }
于 2012-07-19T15:16:28.740 に答える