Как строить кривую безье паскаль
Перейти к содержимому

Как строить кривую безье паскаль

Основы программирования

bezie.jpg

Для заданной последовательности точек построить кривую Безье.

Кривая Безье — это параметрическая кривая 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» предназначен для удаления текущей кривой и выбора точек для построения новой.

#include "stdafx.h" // Заголовочный файл проекта, в который включен файл "windows.h" (#include ). #include "Bezier curves.h" #include using namespace std; // Директива, позволяющая обращаться к // средствам пространства имен стандартной библиотеки // без квалификаторов доступа. #define MAX_LOADSTRING 100 HINSTANCE hInst; // Дескриптор экземпляра приложения. TCHAR szTitle[MAX_LOADSTRING]; // Строка, хранящая текст заголовка окна. TCHAR szWindowClass[MAX_LOADSTRING]; // Имя класса окна. ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Функция, вычисляющая значение х и у координат точки на кривой. POINT CalcBezierCurve(vectorPOINT>, const double&); // Процедура отрисовки кривой Безье. void DrawBezier(HDC, vectorPOINT>); // Функция, возвращающая номер точки массива, // по которой пользователь щелкает мышью. int GetNumberOfPoint (int, int, vectorPOINT>); // Главная функция программы, в которой запускается цикл обработки сообщений. int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); MSG msg; LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_BEZIERCURVES, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } // Регистрация класса окна. ATOM MyRegisterClass(HINSTANCE hInstance)  WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW  // Функция, сохраняющая дескриптор экземпляра приложения и // создающая главное окно приложения. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // Функция, вычисляющая значение х и у координат точки на кривой. // Принимает в качестве параметров вектор-массив точек и // параметр t, характеризующий положение на кривой. POINT CalcBezierCurve(vectorPOINT> pts, const double& t) { int i, c; double p; POINT np; int n = static_castint>(pts.size()) - 1; c = 1; for (i = 0; i  n; i++) { pts[i].x = pts[i].x * c; pts[i].y = pts[i].y * c; c = (n-i)*c/(i+1); } p = 1; for (i = 0; i  n; i++) { pts[i].x = pts[i].x * p; pts[i].y = pts[i].y * p; p = p * t; } p = 1; for (i = n; i >= 0; i--) { pts[i].x = pts[i].x * p; pts[i].y = pts[i].y * p; p = p * (1-t); } np.x = 0; np.y = 0; for (i = 0; i  n; i++) { np.x = np.x + pts[i].x; np.y = np.y + pts[i].y; } return np; } // Процедура отрисовки кривой Безье. // Принимает в качестве параметров дескриптор контекста устройства и // вектор-массив точек, по которым ведется построение кривой. void DrawBezier(HDC hdc, vectorPOINT> pts) { double t; // Параметр, по которому будет идти вычисление точек на кривой: t = [0. 1]. HPEN hPen; // Дескриптор пера, которым будем пользоваться для сохранения // разных стилей рисования линий для построения как отрезков, соединяющих // точки массива, так и самой кривой. POINT np = {0, 0}; // Точка, в которую будет заноситься результат выполнения функции CalcBezierCurve. // Перемещаем текущую позицию пера в первую точку массива. MoveToEx(hdc, pts[0].x, pts[0].y, NULL); // Присваиваем перу характеристику: пунктирная линия, толщина - 1 пиксель, синий цвет. hPen = CreatePen(PS_DASH, 1, RGB(0, 10, 170)); SelectObject(hdc, hPen); // Выбираем объект нашего пера в контекст устройства. // Строим пунктирные линии, соединяющие точки массива. for (int i = 0; i  pts.size(); i++) LineTo(hdc, pts[i].x, pts[i].y); // Присваиваем перу характеристику: сплошная линия, толщина - 2 пикселя, темно-красный цвет. hPen = CreatePen(PS_SOLID, 2, RGB(200, 50, 10)); SelectObject(hdc, hPen); // Выбираем объект нашего пера в контекст устройства. // Перемещаем текущую позицию пера в первую точку массива. MoveToEx(hdc, pts[0].x, pts[0].y, NULL); // Цикл отрисовки кривой Безье. // Для параметра t, пробегающего от 0 до 1 с шагом 0.3 (данный шаг обеспечивает умеренную сглаженость кривой) // вычисляем значение новой точки и строим линию, соединяющую предыдущую точку с новой. for (t = 0.0; t  1.0; t += 0.03) { np = CalcBezierCurve(pts, t); LineTo(hdc, np.x, np.y); } LineTo(hdc, pts.back().x, pts.back().y); // Возвращаем стандартное перо в контекст устройства. SelectObject(hdc, (HPEN)GetStockObject(BLACK_PEN)); // Рисуем окружности, выделяющие точки массива. for (int i = 0; i  pts.size(); i++) Ellipse(hdc, pts[i].x-5, pts[i].y-5, pts[i].x+5, pts[i].y+5); } // Функция, возвращающая номер точки массива, // по которой пользователь щелкает мышью. // Принимает в качестве параметров х и у координаты точки щелчка // и вектор-массив точек, задающих кривую. int GetNumberOfPoint (int x, int y, vectorPOINT> P) { int lim = static_castint>(P.size()); // Проходим по массиву точек, for (int i = 0; i  lim; i++) { // Если щелчок произвелся по точке или в непосредственной близости от нее, то if ((x > P[i].x-15 && x  P[i].x+15) && (y > P[i].y-15 && y  P[i].y+15)) // возвращаем номер этой точки (индекс в массиве). return i; } // Если щелчок произвелся не по точке массива, возвращаем отрицательное число. return -1; } // Оконная процедура, обеспечивающая обработку сообщений для основного окна программы. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static bool IsSelected = false; // Булевская переменная, служащая для распознания, выбран ли набор точек // для кривой или еще нет. Начальное значение - "ложь", не выбран. static vectorPOINT> pts; // Вектор-массив точек, по которым будем строить кривую. PAINTSTRUCT ps; HDC hdc; // Контекст устройства. switch (message) // Обработка текущего сообщения. { case WM_LBUTTONDOWN: // Нажата левая кнопка мыши. // Если точки еще не выбраны, заносим координаты точки в массив и // рисуем окружность для выделения места нажатия. if (!IsSelected) { hdc = GetDC(hWnd); POINT tmp; tmp.x = LOWORD(lParam); tmp.y = HIWORD(lParam); pts.push_back(tmp); Ellipse(hdc, pts.back().x-5, pts.back().y-5, pts.back().x+5, pts.back().y+5); ReleaseDC(hWnd, hdc); } break; case WM_MOUSEMOVE: // Сообщение от перемещения мыши, обрабатывается только тогда, когда выбран набор точек и // после отрисовки кривой (выбран пункт меню "Draw curve"). if (IsSelected) { // Если при перемещении мыши нажата левая кнопка, if (wParam && MK_LBUTTON) { hdc = GetDC (hWnd); // то находим номер точки массива, если щелчок произвелся по одной из его точек. int mnp = GetNumberOfPoint(LOWORD(lParam), HIWORD(lParam), pts); if (mnp  0) break; // Заносим в точку массива с номером выбранной точки новые координаты. pts[mnp].x = LOWORD (lParam) ; pts[mnp].y = HIWORD (lParam) ; // Посылаем сообщение для перерисовки клиентской обдасти окна, и, следовательно, самой кривой. SendMessage(hWnd, WM_PAINT, NULL, NULL); ReleaseDC (hWnd, hdc); } } break; case WM_COMMAND: // Обработка сообщений, поступающих при выборе пунктов меню. switch (LOWORD(wParam)) // Обработка значения идентификатора пункта меня. { case IDM_EXIT: // Меню File -> Exit // Выход. DestroyWindow(hWnd); break; case ID_CURVE_DRAWCURVE: // Меню Curve -> Draw curve // Если размер массива точек равен нулю, т. е. пользователь не выбрал ни одной точки, то // выводим сообщение об ошибке. if (pts.size() == 0) { MessageBox(hWnd, "There is necessary to put at least one point to client area of window!", "An error occured!", NULL); break; } // Иначе - присваиваем переменной IsSelected значение "истина" (означающая, что пользователь выбрал набор точек) IsSelected = true; // и осуществляем перерисовку. SendMessage(hWnd, WM_PAINT, NULL, NULL); break; case ID_CURVE_NEWCURVE: // Меню Curve -> New curve // Очищаем массив точек, IsSelected присваиваем "ложь" и осуществляем перерисовку. for (int i = pts.size(); i > 0; i--) pts.pop_back(); IsSelected = false; SendMessage(hWnd, WM_PAINT, NULL, NULL); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: // Перерисовка клиенской области окна. // Объявление всей клиентской области подлежащей перерисовке. InvalidateRect(hWnd, NULL, TRUE); hdc = BeginPaint(hWnd, &ps); // Если массив точек не пуст, то рисуем кривую по данным точкам. if (pts.size() != 0) DrawBezier(hdc, pts) ; EndPaint(hWnd, &ps); break; case WM_DESTROY: // Выход. PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }

Ключевые слова:
кривая Безье, построение кривой Безье, аппроксимация кривой Безье

Вложение Размер
opita.net_Bcurves.rar 1.1 Мб

Как строить кривую безье паскаль

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Кривая Безье
3.05.2007 22:20

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: 0

Здавствуйте,
Подскажите,пожалуйста, алгоритм построения Кривой Безье на Delphi .

Сообщение отредактировано: Глюк — 3.05.2007 22:23

3.05.2007 22:33

Алгоритм? Рекурсивное деление пополам . Если ты имеешь в виду метод построения, то существует функция PolyBezier, которая по заданным точкам строит эту самую кривую Безье.

Сообщение отредактировано: volvo — 3.05.2007 22:34

3.05.2007 22:56

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: 0

Цитата(volvo @ 3.05.2007 18:33)

Алгоритм? Рекурсивное деление пополам . Если ты имеешь в виду метод построения, то существует функция PolyBezier, которая по заданным точкам строит эту самую кривую Безье.

А как это.Просто впервые с таким сталкиваюсь. не понимаю,если честно
Мне надо шоб точки задавались с помощью мыши (щелчком на области отображения).

Сообщение отредактировано: Глюк — 3.05.2007 22:57

4.05.2007 0:13

Смотри. На форму брось TImage и TButton, в классе формы опиши:

type 
TForm1 = class(TForm)
.
private
the_points: array of TPoint;
.
end;

и добавь 2 обработчика:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer);
const sz=3;
begin
Image1.Canvas.Pen.Color := clRed;
Image1.Canvas.Ellipse(X - sz, Y - sz, X + sz, Y + sz);

setlength(the_points, length(the_points) + 1);
the_points[length(the_points)-1].X := X;
the_points[length(the_points)-1].Y := Y;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.Canvas.PolyBezier(the_points);
end;

Теперь щелкни в 4-х местах на Image, этим ты задашь 4 точки. Только внимательно: 2 из них (первая и последняя) — задают начало/конец кривой Безье, а еще 2 — задают ее форму. После того, как 4 точки отмечены — жми кнопку. Вот тебе и кривая.

4.05.2007 21:42

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: 0

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
the_points: array of TPoint;

< Private declarations >
public
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
< Public declarations >
end;

var
Form1: TForm1;

implementation



procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const sz=3;
begin
Image1.Canvas.Pen.Color := clRed;
Image1.Canvas.Ellipse(X - sz, Y - sz, X + sz, Y + sz);

setlength(the_points, length(the_points) + 1);
the_points[length(the_points)-1].X := X;
the_points[length(the_points)-1].Y := Y;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Canvas.PolyBezier(the_points);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

end.

Что я не правильно сделал?

4.05.2007 21:54

Ты вручную прописывал Image1MouseDown? Так нельзя. убери это и в Object Inspector-е 2 раза щелкни на OnMouseDown для TImage — тогда Дельфи будет знать, что такой обработчик сушествует. Сейчас Дельфи просто не знает о нем, потому как то, что прописано в Private и Public — это твое добавление, а не добавление компилятора.

Попробуй изменить, если не получится — присоединю небольшой работающий проект.

4.05.2007 22:23

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: 0

Спасибо большое.Теперь рисует
Я хотел узнать:а можно сделать так,чтобы задавалось более 4 точек?
4.05.2007 22:27

Задавать ты можешь хоть 50, только вот использовать PolyBezier будет только 4 . Если надо больше — придется отрисовывать вручную.

Сообщение отредактировано: volvo — 4.05.2007 22:27

4.05.2007 22:52

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: 0

Значит все надо начинать сначала.
Подскажите,пожалуйста,а как можно будет это сделать?
4.05.2007 23:08
7.05.2007 1:24

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: 0

Ок.Спасибо.
Прога практически готова,тока надо немного подкорректировать. кое-че не то у меня. Ну,думаю,справлюсь

13.05.2007 20:36

Группа: Пользователи
Сообщений: 34
Пол: Мужской

Репутация: 0



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
ComboBox1: TComboBox;
Label1: TLabel;
Edit2: TEdit;
Button3: TButton;
PaintBox2: TPaintBox;
procedure PaintBox2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
x : array [0..49] of integer;
y : array [0..49] of integer;
implementation

uses ConvUtils;



procedure TForm1.PaintBox2Click(Sender: TObject);
var p : tpoint;
i,j : integer;
f: string;
begin
i:=strtoint(edit1.Text);
GetCursorPos(p);
x[i]:=p.X;
y[i]:=p.Y;
paintbox2.Canvas.Pen.Color:=clblue;
paintbox2.Canvas.Pen.Width:=5;
paintbox2.Canvas.moveto(p.x,p.y);
paintbox2.Canvas.LineTo(p.x,p.y);
paintbox2.Canvas.TextOut(p.X-2,p.Y-2,'P'+inttostr(i));
i:=i+1;
edit1.text:=inttostr(i);
with paintbox2.Canvas do begin
pen.Color:=clgreen;
pen.Width:=1;
for j:= 0 to i-2 do
begin
moveto(x[j],y[j]);
lineto(x[j+1],y[j+1]);
end;
end;
end;
function fac(q: integer): integer;
var k,s : integer;
begin
s:=1;
for k:=1 to q do
s:=s*k;
fac:=s;
end;
function step (t:real;i:integer):real;
var k : integer;
s : real;
begin
s:=1;
if i=0 then s:=1 else begin
for k:=1 to i do
s:=s*t;
end;
step:=s;
end;

function vec(n,i : integer): real;
var s : real;
begin
s:=fac(n)/(fac(i)*fac(n-i));
vec:=s;
end;
function polin(t:real;n,i:integer):real;
var s:real;
begin
s:=vec(n,i)*step(t,i)*step(1-t,n-i);
polin:=s;
end;

function bezex (n : integer; t:real):integer;
var i : integer;
s : real;
begin
s:=0;
for i:=0 to n do
s:=s+x[i]*polin(t,n,i);
bezex:=round(s);
end;

function bezey (n : integer; t:real):integer;
var i : integer;
s : real;
begin
s:=0;
for i:=0 to n do
s:=s+y[i]*polin(t,n,i);
bezey:=round(s);
end;

procedure TForm1.Button1Click(Sender: TObject);
var t,a,b:real;
n:integer;
begin
n:=strtoint(edit1.text)-1;
t:=0;

while t begin
with paintbox2.Canvas do begin
pen.Width:=3;
pixels[bezex(n,t),bezey(n,t)]:=edit2.color;
end;
t:=t+0.0001;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
paintbox2.Repaint;
edit1.Text:='0';

end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var s: string;
begin
s:=combobox1.Text;
edit2.color:=StringToColor(s);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

end.

Сообщение отредактировано: Глюк — 13.05.2007 20:38

13.05.2007 21:37

Ты считаешь, что глобальные координаты курсора мыши и оконные координаты, в которых должна появиться точка — это одно и то же, а на самом деле это далеко не так. Я не просто так в четвертом посте сделал обработку события OnMouseDown. Смотри:

var 
Form1: TForm1;

_x : array [0..49] of integer; // Переименовываешь здесь и везде, где имеются в виду массивы
_y : array [0..49] of integer;

и переносишь обработку нажатия из OnClick в OnMouseDown:

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer); // Здесь - именно оконные координаты клика мыши
var i, j: integer;
begin
i := strtoint(edit1.Text);
_x[i]:=X;
_y[i]:=Y;

paintbox1.Canvas.Pen.Color:=clblue;
paintbox1.Canvas.Pen.Width:=5;
paintbox1.Canvas.moveto(x,y);
paintbox1.Canvas.LineTo(x,y);
paintbox1.Canvas.TextOut(X-2,Y-2,'P'+inttostr(i));
i:=i+1;

edit1.text:=inttostr(i);
with paintbox1.Canvas do begin
pen.Color:=clgreen;
pen.Width:=1;
for j:= 0 to i-2 do begin
moveto(_x[j],_y[j]);
lineto(_x[j+1],_y[j+1]);
end;
end;
end;

Как строить кривую безье паскаль

1. Не создавайте несколько одинаковых тем, ибо модератор может расценить их, как спам и удалить все.
2. Для решения задач по GPSS есть отдельная тема. Все задачи по GPSS опубликовывать в этой теме! Перед опубликовыванием вашей задачи просмотрите всю тему, возможно вы сразу найдете решение.
3. Давайте вашим темам ОСМЫСЛЕННЫЕ названия, а также указывайте язык программирования. Пример: [Pascal]:Работа с файлами и записями.
4. Использования тега CODE обязательно при публикации текста программы.

Темы, оформленные с явным игнорированием правил и отсутствием смысла, будут закрыты/удалены!
Вам помогли? Напишите об этом здесь (в портфолио фрилансера)

Фрилансерам:
5. Демпинг цен запрещен (даже если Вы готовы работать бесплатно). Цены обсуждаются в приватном общении. Если вы готовы рещить задачу бесплатно, просто решите ее быстрее, чем возникнет предложение сделать это за деньги.
6. Пользователям, входящим в группу Newbie, запрещается предлагать свои услуги (завуалированно в т.ч.)
7. В посте с предложением выполнить работу, обязательно указывать ссылку на свое портфолио в Отзывы, Благодарности, Портфолио Это правило работает и в том случае, если вы выполняете работу бесплатно.
8. Реклама (даже завуалированная) своих фриланских сайтов запрещена

Нарушение данных пунктов влечет до RO или БАНА (при неоднократом)

Как строить кривую безье паскаль

Рисование кривой Безье по 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//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// Собственно рассчет координат очередной точки для 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);
>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *