【发布时间】:2010-06-09 10:08:00
【问题描述】:
我正在制作一个图形应用程序,我可以在其中通过拖动控制点来编辑多段线。 但是,我想通过使其具有弹性来使其更易于使用;拖动控制点时,我希望移动距离该点一定距离内的点,而不是移动单个点,这取决于控制点被“拉”的程度。
有人知道这个的简单算法吗?它可能非常初级,因为主要要求是速度。
其实,知道怎么称呼这样的行为也不错,我可以去google查一下。我尝试了“蛇形”线,但这似乎指的是活动轮廓,这不是我想要的。
谢谢
【问题讨论】:
我正在制作一个图形应用程序,我可以在其中通过拖动控制点来编辑多段线。 但是,我想通过使其具有弹性来使其更易于使用;拖动控制点时,我希望移动距离该点一定距离内的点,而不是移动单个点,这取决于控制点被“拉”的程度。
有人知道这个的简单算法吗?它可能非常初级,因为主要要求是速度。
其实,知道怎么称呼这样的行为也不错,我可以去google查一下。我尝试了“蛇形”线,但这似乎指的是活动轮廓,这不是我想要的。
谢谢
【问题讨论】:
在一个简单的层面上,您可以通过胡克定律的一点帮助来实现这一点。您基本上可以将您的折线视为一个字符串,由弹簧连接的大量顶点组成:
o-o-o-o-o-o-o-o-o
每个顶点通过弹簧连接到另一个顶点,如果拉伸会收缩,如果压扁会反弹。
因此,当控制点移动时,连接的弹簧将展开(拉伸)或收缩(收缩)。这反过来又对共享该弹簧的任何顶点施加力。因此,如果我将第一个顶点向上和向左拉,弹簧将对右侧的顶点施加一个力,将其拉近。这将持续到下一个(有一些能量消散),直到所有弹簧都“舒适”。
这是它的基本原理,每次控制点移动时,您都需要将方程求解到所有顶点/弹簧,并且这些点会为您“蛇行”。
如果您想要更多示例,请在谷歌上搜索“绳索物理”或“布物理”(因为绳索是 1D 布)。显然,为了您的目的而忽略重力。
【讨论】:
基本上,您正在寻找一种移动(变形/变换)多个点的方法。
假设您已经给出了移动的方向和强度,这将导致点 x, y 的 dx, dy。
您的转换将至少增加两个参数
对于线性插值,受影响的点将根据以下公式移动:
r[i] = sqrt(sqr(x-x[i])+sqr(y-y[i]))
所以如果 r[i]
x[i]' = x[i] + dx*(1-r[i]/r) y[i]' = y[i] + dy*(1-r[i]/r)
这是用于线性插值 dx[i] = dx - r[i]/r
【讨论】: