Кривая Безье
При работе с инструментом Безье кривая линия не воспроизводится мышью. Вместо этого задается положение узлов будущей кривой и уже в процессе построения воздействуют на направляющие точки в каждом из узлов.
Построение кривой инструментом Безье представляет собой последовательность циклов работы с каждым из узлов кривой. Цикл начинается с установки указателя инструмента в точку расположения будущего узла. Затем нажимается кнопка мыши, и, удерживая ее, уточняют положение направляющих точек, перетаскивая одну из них мышью (вначале — в направлении от узла, а потом — вокруг него). По умолчанию создаются симметричные узлы, но если в момент отпускания кнопки мыши воспользоваться клавишей-модификатором узла, будет создан сглаженный узел или точка излома. В момент отпускания кнопки мыши фиксируются тип узла и положение направляющих точек, после чего начинается цикл определения следующего узла. Для выхода из цикла следует нажать клавишу пробела.
В процессе создания точки излома следует удерживать нажатой клавишу-модификатор C. Клавиатура при этом должна работать в режиме ввода латиницы. После нажатия клавиши-модификатора направляющие точки начинают вести себя в соответствии с выбранным типом узла, и дальнейшее перетаскивание мышью будет влиять только на одну из них. Для создания сглаженного узла используется клавиша-модификатор S.
Практическое упражнение 3. Построение с использованием
инструмента Безье замкнутой кривой, по форме напоминающую беговую дорожку стадиона в виде прямоугольника, короткие стороны которого замещены полуокружностями.
Откройте документ CorelDraw.
Выберите инструмент Безье.
Установите указатель мыши в нужную точку, нажмите кнопку мыши и, не отпуская ее, переместите указатель мыши на некоторое расстояние так, чтобы стали видны направляющие точки. Чтобы касательная к следующему сегменту была строго горизонтальна, нажмите и удерживайте клавишу-модификатор Ctrl. Отпустите кнопку мыши, а затем и клавишу Ctrl — первый узел кривой построен.
Поскольку пока этот узел является единственным узлом линии, то после завершения работы с ним он автоматически становится точкой излома. После того как линия будет замкнута в этом узле, его тип сменится.
Постройте второй узел. Поскольку он должен располагаться на одной горизонтали с первым, перед перемещением указателя инструмента снова нажмите и удерживайте клавишу Ctrl. Второй узел строится точно так же, как первый, но после отпускания кнопки мыши он станет симметричным. Поскольку симметричные узлы вполне соответствуют виду строящейся кривой, нет необходимости явно указывать тип этого узла клавишей-модификатором.
Третий узел должен располагаться строго под вторым, поэтому по окончании работы со вторым узлом клавишу Ctrl можно даже не отпускать. На этот раз «вытаскивать» направляющую точку из узла следует не вправо, а влево, не отпуская клавишу Ctrl. Чтобы закругление получилось симметричным, расстояние от направляющей точки до узла должно быть примерно таким же, как у второго узла.
Четвертый узел строится точно так же, как третий. Теперь кривую следует замкнуть. Для этого указатель мыши перемещается на начальную точку (до появления в качестве указателя мыши «стрелочки» вместо символического изображения узла) и нажимается левая кнопка мыши. Остается только перетащить направляющую точку вправо при нажатой клавише Ctrl (чтобы левое закругление стало симметричным), и замкнутая кривая будет построена.
Исследуйте построенную кривую способом, просматривая типы построенных узлов.
Практическое упражнение 4. Построение с использованием инструмента Безье произвольного треугольника и незамкнутой зубчатой линии.
Самостоятельно построить с помощью инструмента Безье замкнутую кривую, представляющую собой равносторонний треугольник с закругленными вершинами и «пилу», но с закругленными зубцами.
Programming: theory and practice by alexBlack
Как GDI, так и GDI+ предоставляют функции для рисования кривых Безье. При этом используются кубические кривые, для построения которых нужны четыре опорные точки. Простой пример для GDI+ построения кривой и ее опорных точек:

Вычисление точек кривой Безье
Кривая Безье описывается простым параметрическим уравнением:
Вообще, семейство кривых описывается следующим рядом формул:
Здесь
— опорные точки, коэфициенты — значения из треугольника Паскаля (или биномиальные коэффициенты).
и
— параметры кривых. Если принять
мы получаем знакомую нам формулу.
Собственно нас интересуют кубические кривые (кстати, квадратичные легко преобразуются к кубическим и наоборот).
Известно, что кривая Безье всегда лежит внутри выпуклого четырехугольника, заданного опорными точками. Однако, как правило, его размер больше, чем размер прямоугольника, описанного вокруг кривой. Используя параметрическое уравнение мы можем вычислить размер области, реально занятой кривой.

Вычисление опорных точек.
Пусть изместно, что кривая выходит из точки A, проходит через точку B при t = 1 / 3 , через точку C при t = 2 / 3 и заканчивается в точке D. Подставив эти значения в параметрическое уравнение кривой Безье получим выражения для вычисления координат опорных точек:
Оформим эти вычисления отдельной процедурой. Она принимает четыре точки, через которые должна пройти кривая. В этих же переменных возвращаются начальная, конечная и две опорные точки кривой.
Посмотрим как это работает:

Аппроксимация дуги эллипса кривыми Безье
Пусть задан эллипс с центром в точке ( 0 , 0 ) и радиусами a, b (по оси X и по оси Y соответственно). Требуется построить дугу между заданными углами.
Прежде всего нужно найти точки начала и конца дуги — они же будут начальной и конечной точками кривой. Для заданного угла
точку на эллипсе можно найти подставив уравнение прямой
в уравнение эллипса. После несложных преобразований получаем:
Здесь вызов GetQuadransRad определяет в каком квадранте находятся точки, лежащие на луче, проведенном от центар координат под углом f. Кроме того, она корректирует угол так, чтобы он лежал в первом квадранте (так удобнее проводить вычисления).
Теперь мы можем вычислить две крайние точки дуги. После этого можно определить еще две точки дуги и по получившимся четырем точкам построить кривую Безье, вызвав уже реализованную ранее процедуру ToBezier.
Посмотрим, что у нас получилось.

Здесь красный эллипс нарисован средствами GDI+ для сравнения. Видно, что аппроксимация маленьких дуг (черным) совпадает с эталоном. Большие дуги сильно отклоняются от эталонной кривой.
Для точной аппроксимации разобъем дугу на две — три части и для каждой построим свою кривую Безье:
Теперь мы получаем полное совпадение. (пример использования в приложении).

Аппроксимация синусоиды кривыми Безье
Ограничимся интервалом от 0 до pi/ 2. Будем задавать синусоиду на этом интервале вектором. Начальная точка синусоиды в центре координат, конечную указывает заданный вектор. Для вычисления опорных точек можно использовать заранее вычисленные коэффициенты:
Здесь V — вектор, задающий направление. sin — задает отклонение кривой от вектора. true соответствует отклонению вправо, если смотреть по направлению вектора. A, B, C, D — опорные точки кривой Безье. Построим несколько участков синусоиды (исходный код примера в приложении):

Аппроксимация параболы кривыми Безье
Как известно, параболу можно построить по трем точкам. Возьмем, например, точку перегиба параболы и любую другую точку кривой. Тогда третью точку можно получить простым отражением. Мы приходим к той-же схеме, что и для синусоиды, т.е. используем вектор для задания двух точек.

Соединение точек плавной кривой в GDI+
Естественно, GDI+ имеет средства для соединения точек плавной кривой. Можно строить как замкнутые, так и не замкнутые кривые.

Если интересен пример, смотрите код в прикрепленном архиве. Нас же больше интересует сам принцип построения таких кривых.

Пусть, например, плавная кривая должна пройти через точки P 0 , P 1 , P 2 , т.е. кривая будет состоять из двух кривых Безье. Для плавного соединения этих кривых в точке P 1 нужно чтобы три последовательных опорных точки A, P 1 , и B лежали на одной прямой. По сути для получения опорных точек нам нужно найти касательную к кривой в точке P 1. Зная касательную и выбрав на ней точки A и B мы получим опорные точки для построения кривой Безье. Повторив этот расчет для каждой заданной точки мы получим серию опорных точек по которым сможем построить несколько кривых Безье. Вместе эти кривые называются сплайном. Т.к. мы рассматриваем кубические кривые Безье, то и сплайн называется кубическим Безье сплайном (cubic Bezier spline). Соответственно из квадратичных кривых Безье можно построить квадратичный Безье сплайн (quadratic Bezier spline).
Возможны несколько различных подходов для построения таких касательных. В каждом варианте будет получаться несколько отличающаяся кривая.
Кубические сплайны Эрмита
Кубические сплайны Эрмита (Cubic Hermite Splines) — это почти то-же самое, что и кубические сплайны Безье. Можно рассматривать их просто как другой способ задания кривых Безье. Вместо указания опорных точек мы в каждой точке кривой задаем вектор. Направление и величина этого вектора определяют скорость с которой кривая будет отклоняться к заданной точке.
Например, на рисунке слева вид кривой определяется векторами U и V, заданными для точек A и D, а на рисунке справа та-же кривая задана опорными точками B и C. Для преобразования векторов к опорным точкам кривой Безье существуют простые формулы:
![]() |
Сплайны Катмулла-Рома
Сплайны Катмулла-Рома (Catmull-Rom spline) можно рассматривать как вариант построения кубических сплайнов Эрмита.

Например, нужно получить вектор для точки D из последовательности A, D, E. Возьмем отрезок AE (соединяющий две соседние с точкой D точки) и перенесем его так, чтобы его центр совпал с точкой D. Половина этого отрезка и даст нам нужный вектор. Теперь остается по этому вектору получить опорные точки и построить кривую Безье.
Открытым остается вопрос что делать на концах последовательности. Если мы строим замкнутую кривую, то для первой точки списка соседней будет последняя и наоборот. Когда же мы строим не замкнутую кривую, то возможны варианты:
- считать соседними те-же точки, что и для замкнутой кривой.
- крайнюю точку считать соседней самой себе.
- дополнить список еще двумя точками, которые нужны только для получения крайних кривых Безье.
Посмотрим на реализацию построения сплайна Катмулла-Рома. Функция toCMSlines по заданной последовательности точек вычисляет опорные точки кривых Безье. (Полный пример смотрите в прикрепленном архиве).
Пример замкнутой и незамкнутой кривой:

Сплайны Кочанека-Бартельса
Сплайны Кочанека-Бартельса (Kochanek-Bartels splines) также являются кубическими сплайнами Эрмита, но дополнены тремя параметрами. Параметры называются tension, bias и continuity (натяжение, скос/склонение, непрерывность) и изменяют вид касательной и, следовательно, всей кривой.
Формулы для получения двух векторов в каждой точке:
Если параметры равны нулю, мы получаем сплайн Катмулла-Рома.
Метод для вычисления точек кривых Безье по этим формулам (полный пример в архиве):
В теории значения параметров должны лежать в пределах [- 1 , 1 ]. Посмотрим как меняется вид кривой в зависимости от параметров:
Основы программирования
Гранитные памятники на могилу фото и цены Карелия.
Аккредитация медицинских работников
Аккредитация медицинских работников публикует закон о порядке аккредитации.
Тревожная сигнализация Павловский Посад — комплект тревожной сигнализации nika2023.ru.
Рейтинг
Архив
-
(1) (1) (1) (1) (1) (1) (1) (3) (3) (3) (1) (1)
Построение кривой Безье

Для заданной последовательности точек построить кривую Безье.
Кривая Безье — это параметрическая кривая n-го порядка, которая задается следующей формулой:
x(t) = Cn 0 t 0 (1-t) n x0 + Cn 1 t 1 (1-t) n-1 x1 + Cn 2 t 2 (1-t) n-2 x2 + . + Cn n t n (1-t) 0 xn
В этой формуле xi — абсцисса i-ой точки, параметр t лежит в интервале от 0 до 1. Подобным образом задаются другие координаты.
Если задана последовательность, состоящая из (n-1) точек, то такая последовательность точек, называемая ломаной Безье, однозначно определяет форму кривой Безье. Изменяя положения вершин ломаной, можно управлять формой соответствующей кривой Безье.
Для построения кривой Безье необходимо задать в клиентской области окна множество точек, используя мышь. Затем, после выбора пункта меню «Draw curve» можно изменять форму кривой с помощью мыши. Пункт меню «New curve» предназначен для удаления текущей кривой и выбора точек для построения новой.
Как строить кривую безье паскаль
Загрузка. Пожалуйста,
подождите.
Помогите, пожалуйста написать в Pascal'е прогу или процедуру, рисующую кривую Безье порядка M по узловым точкам.
Функцию, вычисляющую сочетания, написал без проблем, а дальше не получается.
| Код |
| function Binom(i, m: integer): real; function factorial(x: integer): double; begin if x=0 then factorial:=1 else factorial:=x*factorial(x-1); end; var Cim: real; begin Cim:=factorial(m)/(factorial(i)*factorial(m-i)); end; |
Профиль
Группа: Участник
Сообщений: 19
Регистрация: 18.8.2005
Репутация: нет
Всего: нет
Вот отрыл в soft-загашниках:
| Код |
| unit bezier; |
interface
uses windows,Messages, SysUtils, Graphics;
//msl+ Bezier Curve for Delphi Canvas
PROCEDURE DrawBezierCurve (CNV:TCanvas;px1, py1, px2, py2, px3, py3, px4, py4, count : INTEGER);
FUNCTION pow (x : Extended; y : WORD) : Extended;
VAR
nt : WORD;
rslt : Extended;
BEGIN
rslt := 1;
FOR nt := 1 TO y DO
rslt := rslt * x;
pow := rslt;
END;
PROCEDURE Bezier (t : Extended; VAR x, y : INTEGER);
BEGIN
x := TRUNC (pow (1 — t, 3) * px1 + 3 * t * pow (1 — t, 2) * px2 +
3 * t * t * (1 — t) * px3 + pow (t, 3) * px4);
y := TRUNC (pow (1 — t, 3) * py1 + 3 * t * pow (1 — t, 2) * py2 +
3 * t * t * (1 — t) * py3 + pow (t, 3) * py4);
END;
VAR
resolution, t : extended;
xc, yc : INTEGER;
BEGIN
IF count = 0 THEN EXIT;
resolution := 1 / count;
cnv.MOVETO (px1, py1);
t := 0;
WHILE t < 1 DO BEGIN
Bezier (t, xc, yc);
cnv.LINETO (xc, yc);
t := t + resolution;
END;
cnv.LINETO (px4, py4);
END;
Бог в помощь! Удача в руки!
Профиль
Группа: Участник
Сообщений: 77
Регистрация: 27.9.2005
Репутация: нет
Всего: нет
Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань
Репутация: нет
Всего: 4
Первое:
Это не вопрос! Парень, видно, хочет, чтобы за него всё сделали! Могу посоветовать искать доки или в виде книг, или в google.ru, потом их читать и разбираться. Затем всё написать и отладить. А если не получится что-то — спросить! Что, хочешь чтобы тепе всё рассказали? А с документацией что, работать не умеешь?
Второе:
А какая разница Delphi или Turbo Pascal? Язык-то один. В чём отличие-то? В наличии канвы? Что, тяжело код что ли переделать? Вместо cnv.LINETO (xc, yc); написать просто LINE(X0, Y0, X1, Y1);
В чём разница-то?
Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону
Репутация: нет
Всего: 78
| Цитата(Bodro @ 4.2.2006, 03:45) |
| Первое: Это не вопрос! Парень, видно, хочет, чтобы за него всё сделали! Могу посоветовать искать доки или в виде книг, или в google.ru, потом их читать и разбираться. Затем всё написать и отладить. А если не получится что-то — спросить! Что, хочешь чтобы тепе всё рассказали? А с документацией что, работать не умеешь? |
Так. Парень показал код и указал точное место, чего ему не под силу. Поэтому не факт, что он хочет, чтобы кто-то все сделал за него.
| Цитата(Bodro @ 4.2.2006, 03:45) |
| Второе: А какая разница Delphi или Turbo Pascal? Язык-то один. В чём отличие-то? В наличии канвы? Что, тяжело код что ли переделать? Вместо cnv.LINETO (xc, yc); написать просто LINE(X0, Y0, X1, Y1); В чём разница-то? |
Разница, дорогой(ая) мой(я), во всем, начиная с того, что TP = Win16, a Delphi = Win32, у дельфи есть визуальная среда и т.д. Я думаю, не стоит сравнивать то, чего не знаешь.
Это сообщение отредактировал(а) Guedda — 4.2.2006, 09:24
Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань
Репутация: нет
Всего: 4
Я имел ввиду код. Никто не сравнивал Delphi и Turbo Pascal.
Синтаксис, ёлки, один и тот же.
Если есть исходники на Делфе, то их не сложно переделать под TP.
Разговор то не о среде и так далее, а о языке. Один хрен — Pascal!
| Цитата |
| Разница, дорогой(ая) мой(я), во всем, начиная с того, что TP = Win16, a Delphi = Win32, у дельфи есть визуальная среда и т.д. Я думаю, не стоит сравнивать то, чего не знаешь. |
Ты что воообще имел ввиду-то?
Вообще, TP разрабатывался под MS DOS. В нём деже нет поддержки защищённого режима. В BP есть, а в TP — нет. При чём тут Win16?
А самое интересное, что это главная проблема форумов — все говорят о чём хотят, только не отвечают на вопрос. Предлагаю закрыть нашу дискуссию и отвечать только по делу. Всё! Пока!
Профиль
Группа: Участник
Сообщений: 92
Регистрация: 27.1.2006
Где: Россия, г. Рязань
Репутация: нет
Всего: 4
Запрещается!
1. Обсуждать и делится взломанными компонентами или программным обеспечением
2. Публиковать ссылки на варез
3. Оффтопить
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Вопросы по реализации алгоритмов рассматриваются здесь
- 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
[ Время генерации скрипта: 0.1211 ] [ Использовано запросов: 21 ] [ GZIP включён ]
