2

複数のポイントで構成されるパスがあります-つまり、0,0 0,50 50,50 70,20

この線を画面に描くだけでは、各点の接合部に鋭角がつくため、かなりきついように見えます。

したがって、鋭角を「タイトな」曲線に自動的に変更するベジェ曲線のアルゴリズム/メソッドはどのように見えるのでしょうか。

カーブが大きくなりすぎたり、一般的にメインパスの落下に影響を与えたりしたくないので、結合を柔らかくします。以下をご覧になると、私がまとめた簡単なサンプルがここにあります。左側の線は私が今持っているもので、真ん中の線は私が欲しい線です。

右の画像は、アルゴリズムが必要だと思うことを表しています。基本的に、結合から10%離れたポイントで結合を構成する各アークに追加のポイントを追加し、次に結合ポイントを削除して、ポイントがあった場所になるようにハンドルを調整します(図ではありません)。少し離れていますが、これはあなたが見ることができるようにするためです)。これが私ができるようにする必要があることです。

代替テキスト

4

2 に答える 2

3

Er.... PathSegmentCollectionにBezierSegmentを追加するだけです。

于 2010-09-03T02:50:47.680 に答える
1

したがって、「コーナー」ポイントごとに2つの追加ポイントを識別する必要があります。「コーナー」ポイントは、パスに沿った任意の内部ポイントです。

ここにスタートがあります:

public List<Point> AddControlPoints(List<Point> path)
{
    // arbitrary minimum length to use to make a corner
    double segmentLengthThreshold = 10.0;
    double cornerDistance = 2.0;

    if (path.Count < 3) return path.ToList(); // arbitrarily a copy

    var newPath = new List<Point>();
    newPath.Add(path[0]);
    for (int ii = 1; ii < path.Count - 1; ii += 2)
    {
        // walk each "corner" point and do line interpolation for the point
        double m = (path[ii].Y - path[ii-1].Y) / (path[ii].X - path[ii-1].X);
        double b = (path[ii].Y - m * path[ii].X);

        // above we setup the equation to move along the line
        // find the new X value and move along it
        double xi = path[ii].X - cornerDistance/m;
        newPath.Add(new Point(xi, m * xi + b));
        newPath.Add(path[ii]);

        // repeat for the next side
        m = (path[ii+1].Y - path[ii].Y) / (path[ii+1].X - path[ii].X);
        b = (path[ii].Y - m * path[ii].X);

        xi = path[ii].X + cornerDistance/m;
        newPath.Add(new Point(xi, m * xi + b));

        // this will likely fail in many ways, 0 slopes etc
        // but throwing the equations some test values shows it makes
        // decent control points. If you'd like them to be length based
        // just find the distance of the two points and multiply by a
        // factor
    }

    return newPath;
}
于 2010-09-03T15:36:11.350 に答える