弹性/蛇形线算法

时间:2010-06-09 10:08:01

标签: algorithm graphics

我正在创建一个图形应用程序,我可以通过拖动它的控制点来编辑折线。 但是,我想通过使其弹性来使它更容易使用;当拖动控制点而不是移动单个点时,我希望移动该点的特定距离内的点,这取决于控制点被“拉”的难度。

有人知道一个简单的算法吗?它可能非常简陋,因为主要要求是速度。

实际上,知道如何调用这种行为也会很好,所以我可以在google上查找。我试过'蛇'线,但这似乎是指活动轮廓,这不是我想要的。

谢谢

2 个答案:

答案 0 :(得分:4)

在一个简单的层面上,你可以通过胡克定律的一点帮助实现这一目标。您基本上可以将折线视为一个字符串,由一系列由弹簧连接的顶点组成:

O-O-O-O-O-O-O-O-O

每个顶点都通过一个弹簧连接到另一个顶点,如果被拉伸则会收缩,如果被压扁则会排斥。

因此,当移动控制点时,连接的弹簧将展开(拉伸)或收缩(收缩)。这反过来将力施加到共享那个弹簧的任何顶点。因此,如果我向上并向左拉动第一个顶点,弹簧会向顶点向右施加一个力,将其拉近。这将持续到下一个(有一些能量耗散),直到所有弹簧都“舒适”。

这是它的基础知识,每次控制点移动时你需要将方程式求解为所有顶点/弹簧,这些点将为你“蜿蜒”。

如果你想进一步的例子谷歌'绳索物理'或'布料物理'(作为绳子是一维布)。显然,忽略重力用于你的目的。

答案 1 :(得分:2)

基本上你正在寻找一种移动(变形/变换)多个点的方法。

让我们假设你已经给出了移动的方向和强度,这将导致dx,dy为x,y。

您的转换至少会有两个参数

  1. 点数受影响的半径r
  2. 由于中间的点会受到更多影响,因此您应该定义如何插入衰减(线性,正态分布等)。
  3. 对于线性插值,受影响的点将根据以下公式移动:

    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