我正在创建一个图形应用程序,我可以通过拖动它的控制点来编辑折线。 但是,我想通过使其弹性来使它更容易使用;当拖动控制点而不是移动单个点时,我希望移动该点的特定距离内的点,这取决于控制点被“拉”的难度。
有人知道一个简单的算法吗?它可能非常简陋,因为主要要求是速度。
实际上,知道如何调用这种行为也会很好,所以我可以在google上查找。我试过'蛇'线,但这似乎是指活动轮廓,这不是我想要的。
谢谢
答案 0 :(得分:4)
在一个简单的层面上,你可以通过胡克定律的一点帮助实现这一目标。您基本上可以将折线视为一个字符串,由一系列由弹簧连接的顶点组成:
O-O-O-O-O-O-O-O-O
每个顶点都通过一个弹簧连接到另一个顶点,如果被拉伸则会收缩,如果被压扁则会排斥。
因此,当移动控制点时,连接的弹簧将展开(拉伸)或收缩(收缩)。这反过来将力施加到共享那个弹簧的任何顶点。因此,如果我向上并向左拉动第一个顶点,弹簧会向顶点向右施加一个力,将其拉近。这将持续到下一个(有一些能量耗散),直到所有弹簧都“舒适”。
这是它的基础知识,每次控制点移动时你需要将方程式求解为所有顶点/弹簧,这些点将为你“蜿蜒”。
如果你想进一步的例子谷歌'绳索物理'或'布料物理'(作为绳子是一维布)。显然,忽略重力用于你的目的。
答案 1 :(得分:2)
基本上你正在寻找一种移动(变形/变换)多个点的方法。
让我们假设你已经给出了移动的方向和强度,这将导致dx,dy为x,y。
您的转换至少会有两个参数
对于线性插值,受影响的点将根据以下公式移动:
r [i] = sqrt(sqr(x-x [i])+ sqr(y-y [i]))
所以如果r [i]< [R
x [i]'= x [i] + dx *(1-r [i] / r) y [i]'= y [i] + dy *(1-r [i] / r)
这是线性插值dx [i] = dx - r [i] / r