我真正想要的是,在三点的帮助下,我需要绘制一条曲线,通过所有三点。我可以通过使用“.Path.cubicTo(float x1,float y1,float x2,float y2,float x3,float y3)”方法来实现这一点但在这种情况下我的中间点不在于曲线。 我需要绘制一条“)”形状的曲线而不是像“V”形状的曲线。即曲线必须在曲线上的每个点弯曲。
答案 0 :(得分:1)
假设我们有三个点D0(x0,y0)
,D1(x1,y1)
,D2(x2,y2)
。
我们还必须找到通过P0-P1-P2-P3
,D0
和D1
的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-P2
与D0-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
然后您可以使用P1
,P2
和P3
坐标作为Path.cubicTo()
的参数。 0.3是这里的比例因子,改变它会使曲线变宽 -
这些计算基于De Casteljau的贝塞尔曲线分裂算法。
此处红色钻石为P1"
和P2"
,绿色钻石为P1'
和P2'
,蓝色圆圈为P1
和P2
。< / p>