Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Рисование кривой Безье по 4 точкам

Поиск:

Алгоритм можно легко понять по исходнику для функции рисования кривой Безье по 4 точкам:
(вообще-то в приведенной функции две средние точки совмещены, так что получается дуга)
Функция готова к употреблению для C++ Builder

Код

// Hарисовать кривую Безье

//R(t) = P0*(1-t)^3 + P1 * t * (1-t)^2 + P2 * t^2 * (1-t) + P3 * t^3 ,

//   где 0<=t<=1

//P0,P2 - опорные точки

//P1,P3 -  управляющие точки

void DrawBezier
(TImage *Image,int x0,int y0,int x,int y,int x1,int y1,int Count)

{

TPoint points[900];  // Массив точек для полигона

Extended Step = 1.0/Extended(x1-x0) ;  // Шаг изменения параметра t

Count = 0 ;

for (int i=x0;i<x1&& i-x0<900;i++){

Extended t = Extended(i-x0)*Step ; // Очередное значение параметра t

// Собственно рассчет координат очередной точки для 2D

// Это считаются коэффициенты q1,q2,q3,q4  
         
Extended q1 = t*t*t*-1 + t*t*3 + t*(-3) + 1;

Extended q2 = t*t*t*3 + t*t*(-6) + t*3;

Extended q3 = t*t*t*(-3) + t*t*3;

Extended q4 = t*t*t;

// Здесь подставляются координаты опорных точек
Extended qx = q1*x0 + q2*x + q3*x + q4*x1;  

// для q2 и q3 одинаковые x,y , это для совмещения двух средних точек
Extended qy = q1*y0 + q2*y + q3*y + q4*y1;  

points[i-x0].x = qx ;

points[i-x0].y = qy ;

// Живой подсчет количества точек в полигоне
// (гурманы могут его вычислить до цикла)
Count++ ;  
   }

// Очистка площади для рисования

Image->Canvas->Brush->Color= clWhite ;

Image->Canvas->FillRect(Rect(0,0,Image->Width,Image->Height));

Image->Canvas->Brush->Color= clRed ;

Image->Canvas->Pen->Color= clBlack ;

// Замыкаем полигон

points[Count].x = points[0].x ;

points[Count].y = points[0].y ;
Polyline (Image->Canvas->Handle,points,Count+1);

// И ВОТ ОHА КРИВАЯ БЕЗЬЕ, красная такая,
// а заодно и проверка попадания x,y в ее тело

HRGN Rgn ;

    // Создать регион из точек
if ((Rgn = CreatePolygonRgn (points,Count,WINDING))!=NULL) {

if (PtInRegion (Rgn,x,y)) AForm->Label->Caption= "Мышка в норке" ;

// Проверить попадание точки в регион

else AForm->Label->Caption= "" ;
PaintRgn (Image->Canvas->Handle,Rgn);   // Отобразить регион

DeleteObject (Rgn) ;  // Удалить регион

}

// Hарисовать две прямые из крайних точек в точку x,y для эффекта

Image->Canvas->Pen->Color= clGreen ;

Image->Canvas->MoveTo(x0,y0);

Image->Canvas->LineTo(x,y);

Image->Canvas->Pen->Color= clBlue ;

Image->Canvas->MoveTo(x1,y1);

Image->Canvas->LineTo(x,y);

}







Просмотров: 3493

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную