- •Параметрические Кривые: Обзор
- •Примеры
- •Касательный Вектор и Касательная
- •Примеры
- •Нормальный Вектор и Кривизна
- •Кривизна
- •Еще примеры
- •Почему Направляющая Тройка Важна?
- •Вопросы Непрерывности
- •Проблемы с Параметрическим Представлением
- •Параметризация По Длине Дуги
- •Геометрическая Непрерывность
- •Рациональные Кривые
- •Рациональные Формы Стандартных Кривых
- •Теоремы Объединения [Uniformization]
- •Построение Кривых Безье
- •Что, если область u не [0.1]?
- •Краткий Итог
- •Нахождение точки на Кривой Безье: Алгоритм De Casteljau's
- •Вычисления
- •Рекурсивное Представление
- •Кривые Безье Касательны к их Первому и Последнему Сегменту.
- •Объединение Двух Кривых Безье с соблюдением c1-Непрерывности
- •Соотношение Между Производной и Алгоритмом de Casteljau
- •Производные Высших Порядков [Higher Derivatives]
- •Разбиение Кривой Безье
- •Зачем Это Нужно, блин ? [Why Do We Need Curve Subdivision?]
- •Базисные Функции b-spline: Определение
- •Два Важных Замечания
- •Какое Значение Имеют Коэффициенты?
- •Базисные Функции b-spline: Важные Свойства
- •Ni,p(u) - это многочлен p-й степени от u
- •Неотрицательность -- Для всех I, p и u, Ni,p(u) неотрицательно
- •Влияние Множественных УзлоFf
- •Примеры Вычислений
- •Простые Узлы
- •Множественные Узлы
- •Кривые b-spline: Определение
- •Кривые b-spline: Важные Свойства
- •Преимущества Использования Кривых b-spline
- •Кривые b-spline: Вычисление Коэффициентов
- •Кривые b-spline: Перемещение Контрольных Точек
- •Некоторые Полезные Следствия Свойства Сильного Ограничивающего Многоугольника
- •Кривые b-spline: Изменение Узлов
- •Замечание о Множественных Узлах
- •Производные Кривой b-spline
- •Фиксированные Кривые b-spline
- •Производные Высших Порядков
- •Nurbs: Мотивация
- •Nurbs: Определение
- •Два Прмых Следствия [Two Immediate Results]
- •Геометрическая Интерпретация.
- •Nurbs: Важные Свойства
- •Важные Свойства Базисных Функций nurbs
- •Неотрицательность -- для всех I и p, Ri,p(u) неотрицательно
- •Важные Свойства Кривых nurbs
- •Кривая nurbs p(u) - это кусочная кривая, каждый компонент которой - это рациональная кривая степени p
- •Фиксированная кривая nurbs p(u) проходит через две крайние контр. Точки p0 и pn
- •Nurbs: Изменение Весов
- •Углубленное Рассуждение
- •Кривые b-spline/nurbs: Введение Узла
- •Введение Одиночного Узла
- •Пример 1: Введение Узла на Узловом Интервале
- •Пример 2: Введение Узла в Существующем Простом Узле
- •Пример 3: Введение Узла в Существующем Множественном Узле
- •Введение Узла для Кривых nurbs
- •Кривые b-spline/nurbs: Множественное Введение Узла
- •Замечание (Наблюдение) I: Коэффициенты для Вычисления Новых Контр. Точек
- •Замечание [Наблюдение] II: Вычисление Новых Контрольных Точек
- •Вычислить первый столбец, второй столбец, ... И h-ый столбец;
- •Новым набором контр. Точек будут те, что ограничены пунктирным многоугольником.
- •Отсечение Углов
- •Алгоритм De Boor
- •Алгоритм De Boor для Кривых nurbs
- •Основные Понятия
- •Параметрические Поверхности
- •Неявные Поверхности
- •Особенности
- •Поверхности Безье: Построение [Construction]
- •Базисные Функции
- •Поверхности [Tensor] Произведения
- •Поверхности Безье: Важные Свойства
- •Изопараметрические Кривые
- •Граничные [Boundary] Кривые
- •Направление u и направление V
- •Поверхности [Tensor] Произведения: Возвращаемся к теме
- •Поверхности b-spline: Построение
- •Базисные Функции
- •Фиксированные, Закрытые и Открытые Поверхности b-spline
- •Поверхности b-spline: Важные Свойства
- •Выбор Параметров : Обзор [Parameter Selection Overview]
- •Метод Длины Хорды
- •Центростремительный Метод
- •Получение Узлового Вектора
- •Универсальный Метод
- •Параметры и Узловые Векторы для Поверхностей
- •Глобальная Интерполяция Кривых
- •Нахождение Решения
- •Алгоритм
- •Влияние Параметров и Узлов
- •Влияние Степени
- •Почему Этот метод Назывется Глобальным?
- •Глобальная Аппроксимация Кривых
- •Значение Наименьшей Площади
- •Поиск Решения
- •Алгоритм
- •Влияние Степени и Количества Контрольных Точек
- •Почему Этот Метод Глобальный?
- •Глобальная Интерполяция Поверхностей
- •Поиск Решения
- •Почему Этот Метод Глобальный?
- •Глобальная Аппроксимация Поверхностей
- •Поиск Решения
- •Усовершенствование Алгоритма
- •Простое Сравнение
Разбиение Кривой Безье
Значение разбиения в разделении данной кривой Безье в p(u) для некоторого u на два отрезка кривой, каждый из которых также является кривой Безье. Из-за того, что полученные кривые должны иметь свои собственные наборы контрольных точек, исходный набор точек отбрасывается. Кроме того, так как исходная кривая Безье степени n разделяется на две части, каждая из которых является подмножеством исходной кривой n степени, результирующие кривые Безье также должны быть степени n.
Наша задача:
Дан набор n + 1 контрольных точек p0, p1, p2, ..., pn и значение параметра u в пределах от 0 до 1, нужно найти два набора по n+1 контрольных точек q0, q1, q2, ..., qn и r0, r1, r2, ..., rn, чтобы кривая Безье, построенная по точкам qi (соотв., ri) была частью исходной кривой Безье на [0,u] (соотв., [u,1]).
Хоть проверка корректности и немного скучна, но сам алгоритм очень прост. Фактически, алгоритм de Casteljau для определения точки p(u) на кривой дает всю необходимую информацию. На рисунке снизу слева, показаны все промежуточные шаги при использовании этого алгоритма, а на рисунке справа показано разбиение кривой на две части в точке p(u), а также соотв. этим частям ломаные контрольных точек.
Если вы хорошо сравните эти два рисунка, вы, вероятно, заметите, что ломаная слева состоит из точек p00 = p0, p10, p20, p30, p40, p50 и p60 = p(u), а кривая справа - из точек p60 = p(u), p51, p42, p33, p24, p15 и p06 = p6. Следующие рисунки иллюстрируют выбор этих точек.
Вспомните о треугольной схеме вычисления по алгоритму de Casteljau. Для данного u нужно n итераций, чтобы вычислить p(u). По ходу вычислений, берем первую и последнюю точки в каждом столбце, а в конце набор всех первых (соотв., последних) точек даст ту часть разделения исходной кривой, которая лежит на отрезке [0,u] (соотв., на [u,1]). Таким образом, в следующей треугольной схеме, двигаясь от верхнего угла по направлению стрелок, а затем от вершины против направления стрелок к нижнему углу, получим два набора точек для двух соответствующих отрезков разделения.
Заметьте, что так как отрезок, соединяющий точки 50 и 51, касателен кривой в точке 60, то и последний сегмент левой кривой (т.e., между точками 50 и 60) касателен левой кривой, а первый сегмент правой кривой (т.e., между точками 60 и 51) соответственно касателен правой.
Зачем Это Нужно, блин ? [Why Do We Need Curve Subdivision?]
Э, не скажи. Тут великая польза 8-). Например, можно использовать ее для нахождения пересечения кривых Безье, их расчета, для упрощения разработки кривых. Допустим, у нас есть кривая, но она нам не очень подходит. В этом случае можно разделить ее на две части в нужной точке, на подходящую и неподходящую. Затем, можно забыть о нормальной части и сосредоточиться на "кривой".
Можно применять разделение кривой сколько угодно раз. Но нужно помнить, что, если мы хотим сохранить гладкость перехода, нужно, чтобы отрезки в точке соединения были коллинеарны.
Повышение Степени Кривой Безье
Во многих случаях при работе с кривыми Безье нужно, чтобы они были одинаковых степеней. Кроме того, хотя кривые Безье высших степеней труднее рассчитывать, они все же являются более гибкими при разработке. Поэтому может быть очень полезным увеличение степени кривой Безье без изменения ее формы. Заметьте, что "без изменения формы кривой" является ключевым пунктом; иначе увеличение степени не принесет никакой практической пользы. Увеличение степени кривой Безье без изменения ее формы называется повышением степени. Далее мы обсудим только алгоритм.
Допустим, дана кривая Безье степени n, определяемая n + 1 контрольными точками p0, p1, p2, ..., pn и нам надо увеличить степень этой кривой до n + 1 без изменения ее формы. Так как кривая Безье степени n + 1 определяется n + 2 контрольными точками, нам необходимо найти этот новый набор точек. Очевидно, p0 и pn должны быть в новом наборе точек, потому что кривая проходит через них. Таким образом, нам нужно только n новых контрольных точек. Пусть новый набор контрольных точек будет q0, q1, q2, ..., qn+1. Как упоминалось ранее, q0 = p0 и qn+1 = pn. Другие контрольные точки рассчитываются так:
Если вас не устраивает такая общая формула, вот вам формулы для каждой контрольной точки от q1 до qn.
Каждый сегмент исходной ломаной содержит точно одну новую контрольную точку. Говоря точнее, сегмент pi-1pi содержит новую контрольную точку qi. Вспомним из обсуждения алгоритма de Casteljau, что точку C на отрезке прямой между точками A и B, причем отношение расстояний между A и C и между A и B равно u, можно записать в виде C = (1 - u)A + uB. Из формул для новых контрольных точек видно, что отношение расстояний между pi-1 и qi и между pi-1 и pi равно 1 - i/(n+1). Тем не менее, в отличие от алгоритма de Casteljau, это соотношение не постоянно, а варьируется в зависимости от i. Но все же вычисления очень похожи на алгоритм de Casteljau.
Получив новый набор точек, исходный можно отбросить. Так как каждый сегмент исходной ломаной содержит новую контрольную точку, процесс получения новой ломаной похож на обрезание углов у исходных контрольных точек. Это показано на следующем рисунке. Рисунок показывает повышение степени с 4 до 5, новая ломаная показана темными линиями, старая - светлыми. В таблице слева указаны соотношения, по которым получаются точки новой ломаной.
i |
1 - i/(n+1) |
1 |
0.8 |
2 |
0.6 |
3 |
0.4 |
4 |
0.2 |
Заметьте, что повышение степени можно проводить последовательно сколько угодно раз, пока ваша система это сможет делать. Заметьте также, что с увеличением степени растет и количество контрольных точек. Кроме того, контрольная ломаная приближается к кривой.
На следующих рисунках, начиная с кривой 6 степени, степень повышалась до 7, 8, 10, 15 и, в итоге, 29. Видно, что форма кривой оставалась неизменной, а ломаная все ближе и ближе пдоходила к кривой. При увеличении степени до бесконечности, ломаная сливается с кривой - ее предельным положением.
B-spline: Мотивация
Допустим, нам нужно спроектировать профиль вазы. Рисунок слева - это кривая Безье 11 степени; но все-же сложно сделать так, чтобы "шея" огибала отрезок p4p5. Конечно, можно добавить контрольных точек около этого отрезка, чтобы увеличить вес в этой области. Но тогда увеличится степень кривой. Во многих случаях невыгодно использовать кривые высших степеней.
Как оговаривалось на предыдущей странице о производных кривых Безье, мы можем объединить две кривых Безье. Если последний сегмент ломаной первой кривой и первый сегмент ломаной второй кривой лежат на одной прямой, получаем по крайней мере G1-непрерывность, так как касательные векторы направлены в одну сторону (т.e., если их длины равны, получаем непрерывность C1). Рисунок посередине показывает это. На нем три отрезка кривых Безье, точки соединения показаны в желтых прямоугольниках. Мы видим, что с помощью нескольких кривых Безье меньших степеней, удовлетворяющих условию "коллинеарности", можно получить необходимую сложную форму. Но поддержание этой "коллинеарности" может быть довольно утомительным и нежелательным.
Возможно ли использовать отрезки кривых младших степеней, не заботясь об этом условии "коллинеарности" ? Кривые B-spline - это обобщение кривых Безье, разработанные для такого случая. На правом рисунке изображена кривая B-spline третьей степени с 8-ю контрольными точками. Фактически, это - пять кривых Безье 3-й степени, вместе образующих кривую B-spline, определяемую контрольными точками. Маленькие точки делят кривую на отрезки. Можно перемещать контрольные точки, чтобы изменить форму кривой, также, как и с кривыми Безье. Также можно изменять деление кривой. Таким образом, кривые B-spline имеют большую степень свободы в проектировании кривых.
Деление кривой напрямую довольно сложно. Вместо этого мы можем разделить диапазон кривой. То есть, если область кривой - это [0,1], то этот закрытый диапазон разделяется точками, называемыми узлами. Пусть узлы будут 0 <= u0 <= u1 <= ... <= um <= 1. Тогда точки p(ui) делят кривую, как показано на рисунке ниже, и, следовательно, изменение деления отрезка [0,1] изменяет форму кривой.
В итоге, чтобы создать кривую B-spline, нам нужны: набор контрольных точек, набор узлов и набор коэффициентов, по одному на каждую контрольную точку, т.е. чтобы все отрезки кривой соединялись и выполненялось нужное условие непрерывности. Вычисление коэффициентов - это, возможно, самая сложная часть работы, так как они должны гарантировать выполнение определенных условий непрерывности. К счастью, эти вычисления в этом курсе не понадобятся. Нам лишь нужно знать их характеристики для рассуждения о кривых B-spline.