4

因此,当仅知道曲线上的点时,我需要找出控制点在三次贝塞尔曲线上的位置,这些点可以位于 3D 中。如果我可以对曲线上的任意数量的点执行此操作,那将是理想的。我发现的大部分内容只涉及 2D,或者只涉及 4 个点。

4

1 回答 1

3

让我看看我是否理解你:你想要一个插值贝塞尔曲线,通过一组给定的点 P0 P1 ...
但绘制为贝塞尔曲线,具有如下功能

bezier4( nstep, Pj, Cj, Dj, Pj+1 )  -- control points Cj, Dj

也就是说,您想为每个 Pj - Pj+1 导出两个 Bezier 控制点 Cj、Dj?

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

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 的插值 aka Catmull-Rom 样条:

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) 的曲线完全相同,因此:

C0 = P0 + (P1 - P-1) / 6
D0 = P1 - (P2 - P0) / 6

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

bezier4( nstep, Pj, Cj, Dj, Pj+1 )

这有意义吗,是你想要的吗?
(为了赏金,我会把一些 Python / numpy 拼凑在一起。)

于 2010-08-24T17:20:21.190 回答