首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在3D中给定N个点时,如何创建三次bezier曲线?

在3D中给定N个点时,如何创建三次bezier曲线?
EN

Stack Overflow用户
提问于 2010-08-20 06:57:35
回答 1查看 7.2K关注 0票数 4

因此,当只知道曲线上的点时,我需要找出三次bezier曲线的控制点在哪里,这些点可以位于3D中。如果我可以对曲线上的任意数量的点执行此操作,那将是最理想的。我发现的大多数都只涉及2D,或者只有4个点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-25 01:20:21

让我看看我是否理解了:你想要一条插值Bezier曲线,通过一组给定的点P0 P1 ...

但绘制为Bezier曲线,函数如下

代码语言:javascript
复制
bezier4( nstep, Pj, Cj, Dj, Pj+1 )  -- control points Cj, Dj

也就是说,你想为每一块Pj导出两个贝塞尔控制点Cj,Dj - Pj+1?

导出此类控制点的一种方法是使用伯恩斯坦多项式基。

代码语言:javascript
复制
b0(t) = (1-t)^3
b1(t) = 3 (1-t)^2 t,
b2(t) = 3 (1-t) t^2
b3(t) = t^3

bezier4(t) = b0(t) P0  +  b1(t) C0  +  b2(t) D0  +  b3(t) P1
= P0 at t=0, tangent --> C0
= P1 at t=1,  tangent <-- D0

并查找或推导出通过P-1 P0 P1 P2的插值又称Catmull-Rom样条:

代码语言:javascript
复制
b0(t) P0
+ b1(t) (P0 + (P1 - P-1) / 6)
+ b2(t) (P1 - (P2 - P0) / 6)
+ b3(t) P1
= P0 at t=0, P1 at t=1

我们希望bezier4(t)与CatmullRom(t)是完全相同的曲线,因此:

代码语言:javascript
复制
C0 = P0 + (P1 - P-1) / 6
D0 = P1 - (P2 - P0) / 6

给定N个点P0 P1 ...(在2d 3d中...anyd),一次取4个;对于每4个,该公式给出2个控制点Cj,Dj

代码语言:javascript
复制
bezier4( nstep, Pj, Cj, Dj, Pj+1 )

这有意义吗,这是你想要的吗?

(作为奖励,我会拼凑一些Python / numpy。)

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

https://stackoverflow.com/questions/3526940

复制
相关文章

相似问题

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