gpt4 book ai didi

android - 曲线通过android canvas中的三个点

转载 作者:太空狗 更新时间:2023-10-29 14:16:32 26 4
gpt4 key购买 nike

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

最佳答案

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

显然,

P0 = D0
P3 = D2

然后有无限数量的贝塞尔样条通过方程定义的点D1

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

其中tD1点对应的贝塞尔曲线参数。

要找到一条真正的曲线,我们应该分配一些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

关于android - 曲线通过android canvas中的三个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21399153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com