[编辑]我的意思是选择曲线本身来更改(编辑)它(单击曲线,拖动曲线以编辑它)。通常情况下,我们选择控制点来更改曲线。我知道要更改曲线,我需要编辑控制点,但是如何将曲线上的更改解释为对控制点的更改呢?
P = k0*P0 + k1*P1 + k2*P2 + k3*P3
其中P是曲线上的点,P0、P1、P2和P3是输入控制点,k0、k1、k2和k3是给定t的常数。我将称k值为“贡献”,更具体地说,是控制点对曲线上点P(t)的贡献。一个需要记住的好特性是k0+k1+k2+k3=1。
因此,假设您有一个向量V=P'-P,其中P'是新位置,P是原始位置。我们需要移动一些控制点以使P'到达所需位置,但我们可以灵活选择要移动哪个控制点。任何具有非零贡献的点都可以使用,或者是某些组合。
假设用户在t=0处单击曲线。在这种情况下,只有k0是非零的,因此
P0 := P0 + V
将会产生正确的结果。这也可以写成
P0 := P0 + k0 * V
Pmax := Pmax + 1/kmax * V
编辑 - 回答您的问题后编辑
为了能够选择曲线本身以移动控制点,我建议贝塞尔曲线绝对不是正确的方法 - 您需要反向解方程才能找到正确的控制点位置。您还会发现,在某些情况下,移动控制点以使曲线走向所需位置实际上是不可能的。
如果您使用B样条,则可以在最接近用户单击位置的曲线上插入一个新的控制点,然后移动新的控制点。因此,实际上,您将添加一个新的控制点。
原始文本
假设您已经实现了贝塞尔曲线,给定一组控制点(通常为三个贝塞尔点,但可以是任意数量),可以生成一组要与显示设备上的线连接的点(通常使用0>= u <= 1
参数方程式),那么这很容易。
您的控制点确定曲线的走向,因此您只需要在这些控制点上实现选择反馈和拖放即可。
如果你正在寻找精确的点匹配,贝塞尔曲线并不是理想的选择,因为它们只通过第一个和最后一个控制点。而且,你添加到曲线上的点越多,它们就越不准确。好的,假设您必须使用贝塞尔曲线,因为您正在使用具有它们作为基元的渲染库。如果您绝对坚持在曲线本身上使用控制点的想法,您可以使用此处概述的方法插值控制点:如何在C#中找到BezierSegment的控制点,给定起点、终点和2个交点 - AKA立方Bezier 4点插值
换句话说,对于曲线上的每组4个点,您将运行上述算法并获取绘制立方Bezier所需的4个控制点。
C(t) = (1-t)³ * P0 + 3*(1-t)²*t * P1 + 3*(1-t)*t² * P2 + t³ * P3
| 因此,k0 = (1-t)³
|k1 = 3.0 * (1-t)² * t
|k2 = 3*(1-t)*t² | k3 = t³
| 每当t
改变时,所有这些k值也会随之改变。(https://www.desmos.com/calculator/sx8vx9is7b) - R. Navega