Очевидно, позволяя координатным функциям `x(u)`, `y(u)` и `z(u)`, быть произвольными, мы получаем большое разнообразие кривых. Тем не менее, есть компромиссы в ходе реализации геометрической системы моделирования. Идеальной является ситуация, позволяющая ограничиться классом функций, таким как:
Широко используемый класс функций - полиномы. Хотя они удовлетворяют последним двум критериям в этом списке, существует ряд важных типов кривых (поверхностей), которые не могут быть точно представлены с использованием полиномов; эти кривые должны быть приближены в системе с помощью полиномов. В этом и следующих разделах мы рассмотрим два общих метода выражения полиномиальных функций, базисную и Безье. Хотя они математически эквивалентны, но мы увидим, что метод Безье гораздо лучше подходит для представления и управления формой в компьютере.
Базисная кривая `n`-й степени задается:
`C(u)=(x(u),y(u),z(u))=sum_(i=0)^n a_iu^i` `0<=u<=1` (1.5)
Где `a_i=(x_i,y_i,z_i)` вектор, следовательно
`x(u)=sum_(i=0)^n x_iu^i` `y(u)=sum_(i=0)^n y_iu^i` `z(u)=sum_(i=0)^n z_iu^i`
И в матричной форме и уравнения (1.5)
`C(u)=[a_0 a_1 ... a_n][[1],[u],[vdots],[u^n]]=[a_i]^T[u^i]` (1.6)
(Мы пишем вектор-строку как транспонированной вектор-столбец)
Дифференцируя Ур. (1.5) получаем
`a_i={C^(i)(u)|_{u=0}}/{i!}`
Где `C^((i)) (u)|_{u=0}` `i`’ая производная от `C(u)` по `u=0`. Функция `n+1`, `{u^i}`, называется базисной (или смешивающей) функцией, и `{a_i}` коэффициент степени представления базиса.
Дано `u_0`, рассчитать точку `C(u_0)` на степенной базисной кривой наиболее эффективно с использование метода Хорнера.
Основной алгоритм
Horner1(a, n, u0, C) { /* Вычисление точки на степенной базисной кривой */ /* Вход: a, n, u0*/ /* Выход: C*/ C = a[n]; for (i=n-1; i>=0; i--) C=C*u0 + a[i]; }
Примеры
Пример1.1 | `n=1`. `C(u)=a_1 u_0+a_0`, `0<=u<=1`, это линейный сегмент между точками `a_0` и `a_0+a_1` (рисунок 1.5). Константа `C'(u)=a_1` даёт направление линии |
Пример1.2 | `n=2`. В общем, `C(u)=a_0+a_1 u+a_2 u^2`, `0<=u<=1`, это параболическая дуга между точками `a_0` и
`a_0+a_1+a_2` (рисунок 1.6) Это показано
Рисунок 1.5. Прямой линейный сегмент `C(u)=a_0+a_1u` Рисунок 1.6. Параболическая дуга `C(u)=a_0+a_1u+a_2u^2` Обратите внимание, что вектор ускорения, `C''(u)=2a_2`, является постоянным. Есть два специальных (вырожденных) интересных случая, оба возникают, когда вектор `a_2` параллелен начальному вектору касательной, `a_1` (когда `x_1 y_2=x_2 y_1`). В этом случае, вектор, касательный не включается, то есть, мы получаем прямую линию, вектор `a_2` может указать в том же направлении, что и `a_1` (рис 1.7а), или в обратном направлении (рис. 1.7б). На рис 1.7б, `a_1+2a_2 u_0=0` для некоторого `0<=u<=1` (скорость стремится к нулю, остановка частицы), а часть отрезка будет проследить в обратном направлении. Рисунок 1.7. `a_1` и `a_2` параллельны. В одном направлении Рисунок 1.7. В противоположном |
Пример1.3 | n=3. Кубическая, `C(u)=a_0+a_1 u+a_2 u^2+a_3 u^3`, является очень распространённой кривой, не лежит
на одной прямой (рис 1.8а); она может иметь точки перегиба (рис 1.8б);
выступы (рис 1.8в); или петли (рис 1.8г). Самопересекающиеся кривая
получается, если `a_0`, `a_1`, `a_2`, `a_3` не лежат на одной прямой. Точка перегиба на плоской кривой
определяется как точка, где кривая гладкая (без выступов) и касательная в этой точке проходит через кривую. Это
влечет за собой изменение в направлении поворота кривой. В точке перегиба, либо `C''(u)=0`, или
`C'(u)|\|C''(u)`. Необходимым (но не достаточным) условием для пика в `u=u_0` является `C'(u_0)=0` (нулевая
скорость). Условия возникновения петель также известны.
Рисунок 1.8. Кубические кривые, (а) трехмерные витые; (б) точка перегиба; (в) острие; (г) петля. |