曲线在android画布中通过三个点

时间:2014-01-28 07:15:08

标签: android android-canvas curve bezier

我真正想要的是,在三点的帮助下,我需要绘制一条曲线,通过所有三点。我可以通过使用“.Path.cubicTo(float x1,float y1,float x2,float y2,float x3,float y3)”方法来实现这一点但在这种情况下我的中间点不在于曲线。 我需要绘制一条“)”形状的曲线而不是像“V”形状的曲线。即曲线必须在曲线上的每个点弯曲。

1 个答案:

答案 0 :(得分:1)

假设我们有三个点D0(x0,y0)D1(x1,y1)D2(x2,y2)。 我们还必须找到通过P0-P1-P2-P3D0D1的Bezier三次样条线D2

显然,

P0 = D0
P3 = D2

然后有不定数量的贝塞尔样条曲线通过等式{/ p>定义的点D1

P2 = (D1 - (1-t)^3 * P0 - t^3 * P3) / (3*(1-t)*t^2) -
     (1-t) * P1/t;

其中t是与点D1对应的贝塞尔曲线参数。

要查找真实曲线,我们应指定一些t,为简单起见,我们选择t = 0.5并选择P1。然后可以从上面的等式中找到P2

以下是基于P1-P2D0-D2平行的限制的解决方案:

% vector pointing from D0 to D2
baseSides = 0.3 * (D2 - D0)
% vector moving D1 towards D0 - D2 base
baseDown = 0.1 * (D0 - D1) + (D2 - D1))
% moving D1 down to the base and split to left and right
P1" = D1 + baseDown - baseSides
P2" = D1 + baseDown + baseSides
P1' = P1" + (P1" - D1) * 2 / 3
P2' = P2" + (P2" - D1) * 2 / 3
P1 = P1' + P1' - D0
P2 = P2' + P2' - D2

然后您可以使用P1P2P3坐标作为Path.cubicTo()的参数。 0.3是这​​里的比例因子,改变它会使曲线变宽 -

这些计算基于De Casteljau的贝塞尔曲线分裂算法。

Bezier spline passing through a point

此处红色钻石为P1"P2",绿色钻石为P1'P2',蓝色圆圈为P1P2。< / p>