首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分割bezier曲线

分割bezier曲线
EN

Stack Overflow用户
提问于 2011-12-03 17:25:44
回答 3查看 10.6K关注 0票数 12

我正在为iPhone开发一款游戏,当你移动时,它会在你的角色之后创建一条路径(动作类似于蛇,但在转向方面是弯曲的)。我现在做这件事的方法是把玩家所有的顶点都放在一个数组中,然后在每个帧上画一个圆圈。

我想继续使用贝塞尔曲线代替。我读了很多关于他们的书,我很了解他们,但我对数学不是很在行。我的理解是,我应该使用DeCasteljau的算法在一个特定的t上分割曲线,但是我还没有找到使用哪个公式以及如何在代码中实现这一点。

所以,我现在拥有的是t=1曲线的所有控制点,现在我只想得到t<1的所有控制点,有人能给我一个容易理解的数学公式吗?或者一个实现(最好是在python或objective中)。也许你甚至可以在iphone中使用一个对象来分割曲线?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-06 19:40:54

我设法让它发挥作用,实际上,非常简单的数学。只需计算bezier的所有切线,就可以得到积分。

这里有一些python:

代码语言:javascript
复制
def sliceBezier(points, t):
    x1, y1 = points[0]
    x2, y2 = points[1]
    x3, y3 = points[2]
    x4, y4 = points[3]

    x12 = (x2-x1)*t+x1
    y12 = (y2-y1)*t+y1

    x23 = (x3-x2)*t+x2
    y23 = (y3-y2)*t+y2

    x34 = (x4-x3)*t+x3
    y34 = (y4-y3)*t+y3

    x123 = (x23-x12)*t+x12
    y123 = (y23-y12)*t+y12

    x234 = (x34-x23)*t+x23
    y234 = (y34-y23)*t+y23

    x1234 = (x234-x123)*t+x123
    y1234 = (y234-y123)*t+y123

    return [(x1, y1), (x12, y12), (x123, y123), (x1234, y1234)]

To调用它:

代码语言:javascript
复制
sliceBezier([(point1_x, point1_y),(controlpoint1_x, controlpoint1_y),(controlpoint2_x, controlpoint2_y),(point2_x, point2_y)], 0.23);
票数 23
EN

Stack Overflow用户

发布于 2011-12-05 20:38:16

我实现了类似的东西,如果您有一个现代浏览器看看这里。它是在javascript中实现的,并且还支持更高级的beziers。

票数 3
EN

Stack Overflow用户

发布于 2019-10-10 15:54:58

这里有一个使用苹果SIMD的解决方案。它简洁,并返回两个细分曲线。

代码语言:javascript
复制
void SplitBezier(float t,
                 simd_float2 cv[4],
                 simd_float2 a[4],
                 simd_float2 b[4]) {

  a[0] = cv[0];
  b[3] = cv[3];

  a[1] = simd_mix(cv[0], cv[1], t);
  b[2] = simd_mix(cv[2], cv[3], t);

  auto b12 = simd_mix(cv[1], cv[2], t);

  a[2] = simd_mix(a[1], b12, t);
  b[1] = simd_mix(b12, b[2], t);

  a[3] = b[0] = simd_mix(a[2], b[1], t);

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8369488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档