0

beizer 関数の記述に問題があります。私は c# で簡単なコードを書きました:

public static PointF[] BeizerFunction (int interval, PointF point0, PointF point1, PointF point2) {
        //x = (1 - t) * (1 - t) * p[0].x + 2 * (1 - t) * t * p[1].x + t * t * p[2].x;
        //y = (1 - t) * (1 - t) * p[0].y + 2 * (1 - t) * t * p[1].y + t * t * p[2].y;
        var Points = new PointF[interval];
        var time = 1.0f / (float) interval;

        for (var i=0; i<Points.Length; i++) {
            var point = Points [i];

            point = new PointF ();
            point.X = (1 - time) * (1 - time) * point0.X
                + 2 * (1 - time) * time * point1.X
                + time * time * point2.X;
            point.Y = (1 - time) * (1 - time) * point0.Y
                + 2 * (1 - time) * time * point1.Y
                + time * time * point2.Y;

            Points [i] = point;
            time ++;
        }

        return Points;
    }

アプリケーションではマウスの動きをリッスンするので、マウス ポインターがこの機能のコントロール ポイントになると思います。上記のコードが正しければ、3 点からのバイザー曲線が得られるはずです。

実際には複数のカーブがあるため、ポイントは 3 つ以上になります。ビーズ曲線を一緒に結合するには、次のようにします。

Bezier(p0.5, p1, p1.5);
Bezier(p1.5, p2, p2.5);
Bezier(p2.5, p3, p3.5); 

3点だけを描画するC#コードはこれです

var p0 = new PointF (50, 50);
        var p1 = new PointF (100, 100);
        var p2 = new PointF (150, 50);

        var points = QuadraticBezierFunction.BeizerFunction (100, p0, p1, p2);

        for (var i=0; points != null && i<points.Length-1; i=i+1)
            canvas.DrawLine (points[i].X, points[i].Y, points[i+1].X, points[i+1].Y, new Android.Graphics.Paint ());

曲線を描こうとすると、曲線に見えません。

4

1 に答える 1