Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Компьютерная геометрия и графика

..pdf
Скачиваний:
10
Добавлен:
05.02.2023
Размер:
634.52 Кб
Скачать

71

Рассмотрим сначала задачу проведения гладкой кривой через ряд заданных точек. Для её решения часто используют сплайновые сегменты.

4.2КУБИЧЕСКИЕ СПЛАЙНЫ

Физически сплайны можно представить в виде узкой деревянной рейки, лежащей концами на точках опоры, кривизны которой реализуется с помощью свинцовых грузов.

Рисунок 4.1

Математически сплайн описывается полиномом k – той степени. Чаще всего используют полиномы третьей степени – кубические сплайны. Конкретный вид кубического сплайна определяется координатами точек, через которые его надо провести (концевых точек) и наклоном в этих точках.

Если требуется провести гладкую кривую между n точками, то используется совокупность n 1 сплайнов – так называемые сплайновые сегменты. При этом предъявляется требование непрерывности второго порядка в местах соединений.

Уравнение единственного кубического сплайнового сегмента в параметрической форме выглядит следующим образом:

4

P(t) = B1 + B2t + B3t2 + B4t3 = Biti1,t1 < t < t2 ,

i=1

где P(t) =[x(t), y(t), z(t)] – вектор положения произвольной точки на сплайне.

72

Y

X

Z

Рисунок 4.2

Коэффициенты Bi ,i =1,4 определяются координатами концов сегмента P1

и P2 и

 

 

касательными векторами на концах P1

иP2, которые

являются

произвольными по параметру t .

 

 

Внутри

сплайнового сегмента параметр t

меняется от

t1 до t2

(t1 соответствуетP1,t2 P2 ).

 

 

Обычно полагают t1 = 0 . Тогда

 

 

 

P(0) = P1 ,

 

 

 

P(t

) = P

 

 

 

 

2

 

2

 

 

 

dP

 

 

 

= P1,

 

 

 

 

 

 

 

 

 

 

 

t = 0

 

 

 

dt

 

 

 

 

 

 

 

 

 

dP

 

 

 

= P2.

 

 

 

 

 

 

 

 

 

 

 

t = t2

 

 

 

dt

 

 

 

 

 

 

 

 

Отсюда получим:

P(0) = B1 = P1,

dP

 

= B

+ 2B t +3B t2

 

t=0

=B = P,

 

 

 

 

 

 

dt

t = 0

2

3

4

 

2 1

 

 

 

 

 

 

P(t2 ) = B1 + B2t2 + B3t22 + B4t23 = P2 ,

73

 

dP

 

 

 

= B

+ 2B t

+3B t2

= P.

 

 

 

 

 

 

 

 

dt

t = t2

2

 

 

 

 

 

3 2

 

 

 

4

2

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Окончательно имеем:

 

 

 

 

 

 

B1 = P1 ,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B2

= P1,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B

=

3(P2 P1)

 

2P1

P2

,

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

t2

 

 

 

 

t

2

 

 

 

t

2

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

B =

2(P1 P2 )

P1

P2

.

 

 

 

 

 

 

 

4

 

 

 

 

 

t3

 

 

 

 

t2

 

t2

 

 

 

 

 

 

 

 

 

 

 

 

2

2

 

2

 

 

 

 

 

74

Отсюда уравнение одного кубического сплайнового сегмента:

 

 

 

 

 

 

 

 

 

3(P

P )

 

 

 

 

2P'

 

 

P'

 

 

 

 

 

2(P

P )

 

P'

P'

 

P(t) = P + P't +

(

 

 

2

1

 

 

 

 

 

 

 

1

 

 

 

2

)t2 + (

 

 

 

1

2

+

1

2

)t3 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

t2

 

 

 

 

 

 

t

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

t

3

 

 

t2

t2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

2

 

2

 

 

Обобщение этого уравнения для любых двух смежных сегментов Pk (t)

и

Pk +1(t) , где 1< k < n 2 имеет вид

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3(P

P

)

 

 

 

 

2P

 

 

 

 

P'

 

 

 

 

 

 

 

 

 

 

 

 

 

P (t) = P + Pt +

(

 

K =1

 

 

 

 

K

 

 

 

 

 

 

 

 

K

 

 

K +1

)t2 +

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

K

 

K

 

K

 

 

 

 

 

 

 

 

 

tK2 +1

 

 

 

 

 

 

 

 

 

 

 

 

tK +1

 

 

 

 

tK +1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+(

2(PK PK +1)

+

PK

PK' +1

)t3;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t22K =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tK3 +1

 

 

 

 

 

 

 

 

 

tK2 +1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3(P

=1

P

 

 

 

)

 

 

 

 

2P

 

 

 

 

P'

 

 

 

 

 

 

P

(t)

= P

 

+ P

 

 

t + (

 

 

 

K

 

 

 

 

 

K +1

 

 

 

 

 

+1K

 

 

K +2

)t2 +

 

 

 

 

 

 

 

 

 

 

tK2 +2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

K +1

 

K

+1

 

 

 

K +1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tK +2

 

 

 

 

tK +2

 

 

 

 

 

 

+(

2(PK +1 PK +2 )

+

PK+1

PK' +2

)t3.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tK3 +2

 

 

 

 

 

 

 

 

t22K =2

tK2 +2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

При этом важно, что в уравнении

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PK (t)

 

 

tk < t < tK +1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PK +1(t)

 

 

tk+1 < t < tK +2 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Кривая в этом случае определяется тремя точками PK (t), PK =1(t), PK +2 (t)

и

касательными на концах, то есть

 

 

PK

 

иPK+2 . Касательная в точках PK +1 PK+1

определяется из условия непрерывности второго порядка – постоянства кривизны в точке соединенияPK +1 .

Вторая производная P(t)

P′′(t) = 2B3 + 6B4t при t = tK +1 в конце первого сегмента.

P′′(t) = 2B3 + 6B4tK +1

а в начале второго (t = 0) .

P′′ = 2B3 (это коэффициенты двух разных сплайновых сегментов).

Приравняем P в этих точках, подставим B3 и B4 :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

75

 

 

 

 

 

 

 

 

 

 

 

2(PK PK +1)

+

 

PK

+

 

PK=1

 

+

 

3(PK +1 PK )

2PK

PK

=1

 

=

6tK +1

 

 

 

 

 

 

 

 

2

 

 

 

 

 

3

2

 

 

2

2

tK +1

 

 

 

 

 

tK +1

 

 

tK +1

 

 

 

tK =1

 

 

 

 

tK =1

 

 

tK =1

 

=

 

3(PK +2 PK =1)

 

2PK

+1

 

 

PK

+2

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

2

 

tK +2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tK +2

 

 

 

 

 

tK =2

 

 

 

 

 

 

 

 

 

После преобразований (умножения на tK +1tK +2 и группировки членов)

получим

tK +2 P′ + 2(tK +2 + tK +1)PK+2 + tK +1PK+2 =

 

=

3

2

2

 

 

 

 

tK +1tK +2

tK +2 (PK +2 PK +1) + tK +2 (PK +1

PK ) .

 

 

 

 

В этом уравнении только одно неизвестное – PK+2 , то есть касательная в

точке соединения.

 

 

При проведении кривой через n

точек касательные во всех точках

соединения – P2Pn1

– определяются из следующего матричного уравнения:

t300

...

...

=

2(t2 + t3 )

t2

0

t4

2(t3 + t4 )

t3

0

t5

2(t4 + t5 )

...

...

...

...

...

tn

 

 

3

 

 

2

 

2

 

 

 

 

 

 

 

 

(P3

P2 ) + t3

(P2

 

 

t t t2

P1)

 

 

2 3

 

 

 

 

 

 

 

 

 

3

 

2

 

2

 

 

 

 

 

 

 

(P4

P3 ) + t4

(P3

 

 

t t t3

P2 )

 

 

3 4

 

 

 

 

 

 

 

 

 

.........................................

 

 

.........................................

 

3

 

2

 

 

2

 

 

 

 

tn1

(Pn Pn1) + tn (Pn1 Pn2

t

t

 

 

n1

n

 

 

 

 

 

0

t4

...

2(tn1 + tn )

.

)

 

 

 

P

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

P2

 

 

 

 

 

=

 

 

P3

...

 

 

 

...

 

tn1

 

 

 

 

 

 

 

Pn

 

Это произведение матрицы размера (n 2) n на матрицу n 1.

Результатом является матрица (n 2) 1.

76

Система обычных уравнений, получающихся из этого матричного уравнения, будет определена, если известны, то есть касательные на концах кривой.

Решение этой системы даст значения касательных в точках соединения,

после чего могут быть получены коэффициенты Bi ,i =

1,

4

всех сплайновых

сегментов.

 

 

Для окончательного решения задачи построения

сплайн-кривой нам

остаётся выбрать пределы изменения параметра t в

 

каждом сегменте.

Поскольку все полученные формулы предполагают, что начало каждого сегмента соответствует t = 0, то необходимо определить лишь значения tK ,k = 2 n . Выбор этих величин будет влиять на гладкость сплайна.

Обычно эту задачу решают не из строгих соображений (например, обеспечение минимума кривизны вдоль всей кривой) – это довольно сложно. На практике приемлемыми являются простейшие методы выбора tK .

Можно, например, использовать так называемые нормализованные параметры, то есть считать, что на всех участках 0 < t <1.

Тогда матричное уравнение для определения касательных в точках соединения будет иметь вид:

 

 

 

 

 

 

 

 

 

 

 

 

 

P

 

 

3(P P )

 

 

 

 

 

1

4

1

0

 

0 ...

0

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

3

1

 

 

 

 

 

0

1

4

1

 

0 ...

0

0

0

 

 

 

 

3(P4 P2 )

 

 

 

 

 

 

 

 

 

P2

 

=

 

,

 

n2

 

 

 

 

... ... ... ...

...

 

...

 

...

 

 

 

 

... ... ...

...

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

0

 

0 ...

1

4

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pn

 

3(Pn

Pn1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а с учетом того, что P1

и P2′ должны быть заданы:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P

 

 

 

 

P )

P

 

 

 

1

4

1

0

 

0 ...

0

0

0

 

 

 

 

 

3(P

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

3

1

 

1

 

 

0

1

4

1

 

0 ...

0

0

0

 

 

3(P4

 

 

 

 

 

 

 

 

P3

 

=

 

P2 ) − P2

.

n2

 

 

 

 

... ... ... ...

...

 

 

 

 

...

 

 

 

 

... ... ...

...

...

 

 

 

 

 

 

 

 

 

 

0

0

0

0

 

0 ...

1

4

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pn1

 

 

3(Pn Pn1) − Pn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

77

Коэффициенты Bi ,i =1,4 для каждого сегмента вычисляются из следующего уравнения:

B4

 

 

2

−2

1

B

 

−3

3

−2

3

 

=

0

0

1

B

 

 

2

 

 

 

0

0

B1

1

1

 

 

P

 

 

 

 

 

K

 

 

−1

PK +1

,1< k < n −1.

0

 

 

P

 

 

 

 

 

K

 

 

0

PK +1

 

Такой метод удобен в вычислительном отношении, так как трехдиагональную матрицу из уравнения для PK′ ,k = 2,n −1 приходится обращать только один раз. На практике метод дает хорошие результаты, если точки P1,..., PK 1 расположены достаточно равномерно.

При неравномерном распределении точек в качестве t обычно выбирают расстояние между P и P – метод локальных хорд. Кубические сплайновые кривые широко распространены, однако имеют ряд недостатков. Например, с их помощью нельзя точно передать дугу окружности, а только приближенно.

Примеры кубических сплайновых сегментов.

Рисунок 4.3

4.3КРИВЫЕ БЕЗЬЕ

Рассмотренные сплайн-кривые проходят через все заданные точки. Во многих случаях это дает хорошие результаты, однако имеется один недостаток

78

– необходимость явного задания касательных векторов. Интуитивно эти вектора трудно себе представить, особенно неподготовленному пользователю.

Более удобный способ построения кривых предложил Безье. Кривая Безье определяется несколькими точками, – так называемыми вершинами многоугольника. При этом кривой принадлежат лишь первая и последняя точки, а остальные задают ее форму.

Рисунок 4.4.

Так как вид кривой зависит то формы многоугольника, то изменение положения вершин создает y пользователя значительно более ясное интуитивное ощущение восприятия связи между вершинами, задаваемыми в диалоговом режиме, и требуемой формой.

Кроме того, если сплайн-кривые имеют фиксированный порядок (мы рассмотрели. Порядок равный трем – кубические сплайны), то в методе Безье порядок любого криволинейного сегмента может быть увеличен путем задания дополнительных вершин.

Математически кривая Безье описывается полиномиальной функцией, построенной в так называемом базисе Бернштейна. Базисная функция в нем задается соотношением

I

n,i

(t) = cn

ti (1t)ni ,

 

i

 

 

 

где cni =

n!

 

,

0 <i < n .

 

 

 

 

i!(n i)!

 

Здесь n – степень полинома; i – порядковый номер отдельной вершины. Точки кривой в базисе Бернштейна задаются как

79

P(t) =

n

 

 

 

 

(t) , 0 < t <1

 

 

 

 

PI

n,i

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

i=0

 

 

 

 

 

 

 

 

 

 

 

то есть n – й порядок полинома характеризуется n +1– й вершиной.

В начальной точке t = 0

 

I

 

(0) =

 

 

 

 

 

n!

 

 

00 (10)n0 =1;(0!=1) ;

n,0

 

 

 

 

 

 

 

 

 

 

 

 

0!(n 0)!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(0) = 0,i =

 

,

 

 

(00 =1) .

I

n,1

1,n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В конечной точке t =1

 

In,n

(1) =

 

 

 

 

 

n!

1n (11)nn =1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n!(n n)!

 

 

 

In,1(1) = 0,i =

 

.

 

0,n 1

 

То есть P(0) = P0

и P(1) = Pn , вершины P0 и Pn действительно являются

началом и концом криволинейного сегмента.

В качестве примера рассмотрим кубические кривые Безье. Зададим

постоянные приращения параметру t :

t ={0;1 3;2 3;1}

 

 

 

 

 

Тогда

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

(t) =

3!

 

t(1t)2 = 3t(1t)2 ;

3,1

 

 

 

 

1!2!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

(t) =

3!

t2 (1t) =3t2 (1t).

3,2

 

 

 

2!1!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Получим

 

 

 

 

 

 

 

 

 

 

 

 

T

 

I3,0

 

 

 

 

I3,1

 

 

 

I3,2

I3,3

 

0

 

1

 

 

 

 

 

0

 

 

 

0

0

1/ 3 8/ 27 4 / 9 2/ 9 1/ 27

2/ 3 1/ 27 2 / 9 4/ 9 8/ 27

 

1

 

0

 

 

 

 

 

0

 

 

 

0

1

То есть

P(0) = P0 ;

80

P(1 3) =8 27 P0 + 4 9 P1 + 2 9P2 +1 27P3;

P(2 3) =1 27 P0 + 2 9 P1 + 4 9P2 +8 27P3;

P(1) = P3 .

В зависимости от положения точек P0 P3 могут получаться различные кривые.

 

 

P2

P1

P2

P3

 

 

P3

P0

P0

P1

Рисунок 4.5

При сопряжении двух сегментов требуется выполнить условия непрерывности в общем случае k – го порядка, то есть равенства k – й производной кривой первого сегмента в конечной точке и k – й производной второго сегмента в начальной точке.

Рассмотрим условие непрерывности первого порядка.

 

 

 

 

 

 

Выражение для P (t) удобно найти, явно расписав сумму для P(t) :

 

P(t) = P C0t0

(1t)n

+ PC1t1(1t)n1

+.. + P Cn1tn1

(1t) + PnCnt(1t)0

=

0 n

 

1 n

n1 n

 

n n

 

= P (1t)n + nPt(1t)n1 +.. + nP tn1(1t) + P tn.

 

 

 

0

1

n1

n

 

 

 

Тогда

 

 

 

 

 

 

P(t) = −nP (1t)n1

+ nP (1t)n1 n(n 1)Pt(1t)n2

+.. +

 

0

 

1

1

 

 

 

+n(n 1)P tn2 (1t) nP tn1 + nP tn1.

 

 

 

n1

 

n1

n

 

 

 

В точках t = 0 и t =1 получим

P(0) = n(P1 P0 ) ;

P(1) = n(Pn Pn1) ;