Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 弹性/蛇行算法_Algorithm_Graphics - Fatal编程技术网

Algorithm 弹性/蛇行算法

Algorithm 弹性/蛇行算法,algorithm,graphics,Algorithm,Graphics,我正在制作一个图形应用程序,在其中我可以通过拖动多段线的控制点来编辑多段线。 然而,我想让它更容易使用,使它有弹性;当拖动一个控制点时,我不想移动一个点,而是希望在距离该点一定距离内的点也被移动,这取决于控制点“拉动”的力度 有人知道一个简单的算法吗?这可能是相当初级的,因为首要的要求是速度 事实上,知道如何称呼这种行为也很好,所以我可以在谷歌上查到。我尝试了“蛇行”线,但这似乎是指活动轮廓,这不是我要找的 谢谢在一个简单的层面上,你可以通过胡克定律的一点帮助来实现这一点。基本上,您可以将多段线

我正在制作一个图形应用程序,在其中我可以通过拖动多段线的控制点来编辑多段线。 然而,我想让它更容易使用,使它有弹性;当拖动一个控制点时,我不想移动一个点,而是希望在距离该点一定距离内的点也被移动,这取决于控制点“拉动”的力度

有人知道一个简单的算法吗?这可能是相当初级的,因为首要的要求是速度

事实上,知道如何称呼这种行为也很好,所以我可以在谷歌上查到。我尝试了“蛇行”线,但这似乎是指活动轮廓,这不是我要找的


谢谢

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

o-o-o-o-o-o-o-o-o-o-o

每个顶点通过弹簧连接到另一个顶点,弹簧拉伸时收缩,挤压时排斥

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

这是它的基础,每次控制点移动时,您都需要求解所有顶点/弹簧的方程,这些点将为您“蛇形”


如果你想在谷歌上找到更多关于“绳子物理”或“布料物理”的例子(因为绳子是一维布料)。显然,出于你的目的,忽略重力

基本上,您正在寻找移动(变形/变换)多个点的方法

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

您的转换将至少再包含两个参数

  • 影响点的半径r
  • 因为中间的点会受到更多的影响,并且在边缘处,你应该定义如何插值衰减(线性、正态分布等)
  • 。 对于线性插值,受影响的点将根据以下公式移动:

    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

    非常感谢,这正是我需要的。@vhirk/davbryn,我怀疑这是你需要的;胡克定律无法模拟多段线的控制点将如何移动,您甚至无法建立一组方程来求解,而无需进一步的条件(这将决定实际行为)。绳索物理和布料物理也更多地是关于重力场和/或施加外力的不可拉伸材料(更多关于其形成的形状)和(imo)太复杂了。谢谢,在阅读了有关绳索物理的内容后,a得出了与您一样的结论;这显然不是我想要的:)然而,你建议的方法是正确的。我用一个可变半径(移动强度的两倍)实现了它,看起来效果很好。