Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/47: Рейтинг темы: голосов - 47, средняя оценка - 4.98
 Аватар для TGrey[WoLf]
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683

Кривая Безье

16.10.2010, 11:59. Показов 9435. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, подскажите пожалуйста, как реализовать отрисовку Кривых Безье. Нашел кучу теории, но не понять, как же его рисовать. По пикселям в цикле или как?
http://ru.wikipedia.org/wiki/%... 1%8C%D0%B5
Там записано уравнение в матричном виде. Так вот я и не пойму, если я подставлю t постоянное значение, то что оно отрисует? А если брать у примеру цикл 0<=t<=1 с маленьким шагом, то где брать координаты, по которым рисовать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.10.2010, 11:59
Ответы с готовыми решениями:

Кривая Безье
Вооружился статейкой на википедии https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B0%D1%8F_%D0%91%D0%B5%D0%B7%D1%8C%D0%B5 и...

Кривая Безье по 4 точкам
Доброго времени суток. В общем зада стоит написать програмку где будет рисоваться кривая Безье, но меня уже берет поплава по этому поводу....

Кривая Безье на основе N точек
Доброго времени суток! Вопрос такой, существует n(допустим 500) точек, по ней нужно построить кривую Безье для сглаживания точек я...

5
Эксперт С++
 Аватар для Phantom
3189 / 869 / 39
Регистрация: 29.12.2008
Сообщений: 951
16.10.2010, 13:03
TGrey[WoLf], эта формализация из Википедии конечно навороченная, но разобраться можно попробовать, это совсем нетрудно.
Думаю, самое лучшее здесь просто подставить впрямую третье выражение во второе и потом второе - в самое первое. В результате получаем вот такую конструкцию:
https://www.cyberforum.ru/cgi-bin/latex.cgi?B(t)=\sum_{i=1}^{n}{P}_{i}*  \frac{n!}{i!(n-i)!}*{t}^{i}{(1-t)}^{i}
которая несмотря на то что здоровая, намного понятнее, чем собирать в голове три формулы.
Для дальнейшего удобства пусть эта дура будет так записана: B(t) = F(Pi; t) = F(P1, P2, ..., Pn; t)

Итак, что мы тут имеем: B(t) - это просто точка с координатами, например (Bx(t), By(t)).
P1, ..., Pn - тоже точки, заданные своими координатами (P1x, P1y), ..., (Pnx, Pny). Количество их мы тоже знаем - n.

Собственно теперь цикл, который Вы предложили имеет примерный вид:
Code
1
2
3
4
5
6
for t=0 to 1, с шагом 0,001 do
{
Bx(t) = F(P1x, ..., Pnx; t);
By(t) = F(P1y, ..., Pny; t);
рисуем точку (Bxt, Byt);
}
Просто вот так Каждая координата (отдельно абсцисса и отдельно ордината) рисуемой в цикле точки получается как сумма соответствующих координат заданных точек, помноженных на некоторый вычисляемый коэффициент. Коэффициент этот зависит от t, соответственно и положение точки будет меняться в зависимости от t и на каждом шаге мы (при фиксированном t) мы получаем новое положение точки. Так и рисуется кривая Безье.

Ну и внутри F тоже будет цикл по всем точкам, это понятно, там же сумма.
1
 Аватар для TGrey[WoLf]
42 / 42 / 4
Регистрация: 14.09.2008
Сообщений: 683
16.10.2010, 13:07  [ТС]
Да, спасибо. Я уже разобрался, все намного проще чем я думал.
Пока сделал вот для 3х мерного пространства.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void bezier (int x[4], int y[4], int z[4])
{
    int i;
    double t;
 
    for (t = 0.0; t < 1.0; t += 0.0005)
    {
    double xt = pow (1-t, 3) * x[0] + 3 * t * pow (1-t, 2) * x[1] +
            3 * pow (t, 2) * (1-t) * x[2] + pow (t, 3) * x[3];
 
    double yt = pow (1-t, 3) * y[0] + 3 * t * pow (1-t, 2) * y[1] +
            3 * pow (t, 2) * (1-t) * y[2] + pow (t, 3) * y[3];
 
    double zt = pow (1-t, 3) * z[0] + 3 * t * pow (1-t, 2) * z[1] +
            3 * pow (t, 2) * (1-t) * z[2] + pow (t, 3) * z[3];
 
    Form1->Im->Canvas->Pixels[XD(xt, yt, zt)][YD(xt, yt, zt)] = clRed;
    }
 
    for (i=0; i<4; i++)
    Form1->Im->Canvas->Pixels[XD(x[i], y[i], z[i])][YD(x[i], y[i], z[i])] = clBlue;
 
    return;
}
3
0 / 0 / 0
Регистрация: 16.11.2010
Сообщений: 61
16.11.2010, 17:55
Ты кривая безье сдела?
0
0 / 0 / 0
Регистрация: 20.11.2010
Сообщений: 21
15.12.2012, 12:27
TGrey [WoLf], что именно у тебя хранится в массивах x [4], y [4], z [4]?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.12.2012, 15:48
Цитата Сообщение от TGrey Посмотреть сообщение
Добрый день, подскажите пожалуйста, как реализовать отрисовку Кривых Безье.
В классе канвы уже реализовано.
C++
1
2
Canvas->PolyBezier( /*...*/ );
Canvas->PolyBezierTo( /*...*/ );
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.12.2012, 15:48
Помогаю со студенческими работами здесь

Кривая в C++ Builder
Ребята как по задным иксам и игрекам построить кривую x1=4,y1=-4,x2=5.18,y2=2, x3=6,y3=5; x4=6.33,y4=5,8; И нужно что бы математические...

Кривая Эрмита
Доброго времени суток =) Не мог бы кто нибудь помочь с написание программы для построение &quot; кривой Эрмита &quot;. Либо скинуть...

Кривая сортировка пузырьком StringGrid
Есть код сортировки писал сам может что не учел но не могу понять кода жму на кнопку пропадает значения в 1 строке и сортирует другие...

кривой Безье
написать проектную процедуру создания кривой Безье, Желательно в С++ Добавлено через 17 часов 16 минут помогайте срочно надо(( я не...

Кривая Безье в сплайн Безье
Здравствуйте. Я по специальности программист и мне нужно генерировать замкнутую кривую не пересекающую себя. Наткнулся на кривую Безье, на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru