如何使用贝泽功能使曲线平滑的钢笔工具



我在编写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 个点。为了将贝泽曲线连接在一起,我做了这样的事情。

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 ());

当我尝试绘制曲线时,它看起来不是曲线。

根据@fang的观察,不要使用time ++;,因为你不想从 0.xyz 到 1.xyz,你想增加一小部分。贝塞尔函数仅对 0 到 1(含)之间的时间参数"工作"(即,用于通常的图形目的),因此您希望从 time=0; 开始,使用一些小time += step;迭代多次,并在time>=1+step停止一次。

(然后,除非您非常幸运,否则您可能需要手动为time=1添加最终点,以确保您获得正确的端点)

相关内容

最新更新