要求的示例图像我使用UIBezier路径代码绘制了一条闭合路径bezier曲线。我可以找到屏幕上的触摸点是在闭合的贝塞尔路径边界上还是在它之外。要求:-我需要拖动用户在闭合路径bezier曲线边界上触摸的点,并使闭合路径beier曲线延伸。
参考:-下面的问题和我的问题一样,但我找不到解决办法。https://math.stackexchange.com/questions/53819/changing-a-bezier-curve-by-dragging-a-point-on-the-curve-itself-rather-than-a-co
如果我能得到Objective C代码或算法来完成上述功能,那将是一个很大的帮助。
嗨,方,我已经在我的帖子中发布了图片,说明了要求。目前我只有点A和点B,这是来自用户触摸和移动手指。我需要计算点C和D,并删除路径CD,使其看起来像是原始曲线刚刚在用户手指移动方向上展开。
注意:-当我得到一个闭合曲线时,我会做所有这些。如果没有关闭,用户可以自由绘制手,这是我能够实现的。目前使用四次曲线满足我的要求。
任何帮助都将是巨大的。
假设您有一条二次贝塞尔曲线C(t),并且您想要拖动的点a位于参数t0,则我们有
A=C(t0)=(1-t0)^2*P0+2t0(1-t0)*P1+t0^2*P2 (1)
现在,你把A点拖到B,所以我们有
B=D(t0)=(1-t0)^2*Q0+2t0(1-t0)*Q1+t0^2*Q2 (2)
因为我们希望C(t)和D(t)共享相同的端点,所以我们有P0=Q0和P2=Q2。然后,根据方程(1)和(2),我们得到
B-A = 2t0(1-t0)(Q1-P1), or
Q1 = (B-A)/(2t0(1-t0)) + P1
同样,如果你有一条三次贝塞尔曲线,我们就会得到
A=C(t0)=(1-t0)^3*P0+3t0(1-t0)^2*P1+3t0^2(1-t0)*P2+t0^3*P3 (3)
B=D(t0)=(1-t0)^3*Q0+3t0(1-t0)^2*Q1+3t0^2(1-t0)*Q2+t0^3*Q3 (4)
再次,组合(3)和(4)并保持相同的端点P0=Q0和P3=Q3将导致
B-A = 3t0(1-t0)^2*(Q1-P1)+3t0^2(1-t0)*(Q2-P2),
我们有
Q1= w(B-A)/(3t0(1-t0)^2) + P1, and
Q2= (1-w)(B-A)/(3t0^2(1-t0)) + P2
其中w只是[0,1]之间的加权值
正如你所看到的,对于三次贝塞尔曲线,你确实有移动P1和P2的无限解,这样点C(t0)就从a点移动到B点。你可以选择只移动P1或P2(通过将w设置为0.0或1.0)或同时移动它们(通过将w设置为0.0和1.0之间的任何值)。更复杂的算法将通过最小化C(t)和D(t)之间的积分差来决定w的值,但我想我们不需要去那里。
以上只是关于你帖子中链接中提到的"解决方案1"的更详细描述。我建议您采用这种方法(与解决方案2相比)。如果你确实有一条二次或三次贝塞尔曲线,那么找到与C(t0)处的点相关的参数t0就是找到2或3次多项式的根,这应该不难。