【问题标题】:elastic / snaking line algorithm弹性/蛇形线算法
【发布时间】:2010-06-09 10:08:00
【问题描述】:

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

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

其实,知道怎么称呼这样的行为也不错,我可以去google查一下。我尝试了“蛇形”线,但这似乎指的是活动轮廓,这不是我想要的。

谢谢

【问题讨论】:

    标签: algorithm graphics


    【解决方案1】:

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

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

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

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

    这是它的基本原理,每次控制点移动时,您都需要将方程求解到所有顶点/弹簧,并且这些点会为您“蛇行”。

    如果您想要更多示例,请在谷歌上搜索“绳索物理”或“布物理”(因为绳索是 1D 布)。显然,为了您的目的而忽略重力。

    【讨论】:

    • 非常感谢,这正是我所需要的。
    • @vhdirk/davbryn,我怀疑这是你需要的;胡克定律不模拟折线的控制点将如何移动,您甚至无法在没有进一步条件的情况下建立一组方程来求解(这将确定实际行为)。绳索物理和布料物理也更多地是关于重力场和/或施加外力的不可拉伸材料(更多关于它形成的形状)和(imo)太复杂了。
    【解决方案2】:

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

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

    您的转换将至少增加两个参数

    1. 影响点的半径 r
    2. 由于中间的点会受到更大的影响,并且在边缘处,您应该定义如何插入衰减(线性、正态分布等...)

    对于线性插值,受影响的点将根据以下公式移动:

    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

    【讨论】:

    • 谢谢,在阅读了这个绳索物理之后,a 得出了和你一样的结论;这显然不是我想要的:) 但是,您建议的方法是正确的。我用可变半径(移动强度的两倍)实现了它,这似乎工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2013-01-05
    • 2020-01-31
    相关资源
    最近更新 更多