Как создать кубическую кривую Безье, когда дано N точек в 3D? - PullRequest
4 голосов
/ 20 августа 2010

Так что мне нужно выяснить, где будут контрольные точки для кубической кривой Безье, когда только зная точки на кривой, точки могут лежать в 3D.Было бы идеально, если бы я мог сделать это для любого количества точек на кривой.Большая часть того, что я нашел, касается только 2D или только 4 очков.

1 Ответ

3 голосов
/ 24 августа 2010

Дайте мне посмотреть, понимаю ли я вас: вам нужна интерполяционная кривая Безье, проходящая через заданный набор точек P0 P1 ...
, но нарисованная в виде кривых Безье, с функцией, подобной

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

То есть вы хотите получить две контрольные точки Безье Cj, Dj для каждой фигуры Pj - Pj + 1?

Один из способов получения таких контрольных точек - использовать полиномиальную основу Бернштейна

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

и найдите или извлеките интерполирующий сплайн Catmull-Rom, который проходит через P-1 P0 P1 P2:

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 вместе.)

...