- •Липецкий государственный технический университет
- •1 Математическая модель
- •1.1 Определение кривой Безье.
- •1.2 Частные случаи кривой Безье
- •1.3 Вычисление длины кривой
- •1.4 Условие непрерывности соседних кривых Безье
- •2 Описание алгоритмов
- •2.1 Построение кривой по четырем заданным точкам
- •2.2 Построение составной кривой
- •2.3 Выбор пользователем точки на составной кривой
- •3 Описание структуры по
- •3.1 Структура по
- •5 Контрольный пример
2 Описание алгоритмов
2.1 Построение кривой по четырем заданным точкам
-
Вычислить приближенную длину кривой по формуле (1).
-
Принять шаг параметра
,
параметр t = 0. -
Получить значение следующей точки, принадлежащей кривой, из уравнения (2).
-
Соединить прямой предыдущую точку с новой. Если t = 1 – закончить, иначе, увеличить t на dt и перейти к шагу 3.
2.2 Построение составной кривой
-
Определить количество точек в массиве. Если оно делится на три с остатком единица, то перейти к шагу 2, иначе закончить.
-
Взять первые четыре точки массива.
-
Построить кривую по четырем точкам.
-
Если достигнут конец массива, то закончить, иначе перейти к шагу 5.
-
Взять четвертую точку предыдущего сегмента и три следующие за ней точки массива и перейти к шагу 3.
2.3 Выбор пользователем точки на составной кривой
-
Считать координаты курсора в момент щелчка левой кнопкой мыши, сохранив как точку pt.
-
Взять точки начального сегмента составной кривой
-
Выполнить пункты 1-3 алгоритма 2.1.
-
Если t = 1, рассмотрен последний сегмент кривой и разность координат pt и рассчитанной точки, принадлежащей кривой, больше 2, то закончить. Иначе если t = 1, разность координат pt и рассчитанной точки больше 2, но рассмотрен не последний сегмент кривой, то взять точки следующего сегмента и перейти к шагу 3. Иначе если t < 1 и разность координат pt и рассчитанной точки больше 2, то перейти к шагу 5. Иначе если t < 1 и разность координат pt и рассчитанной точки меньше 2, то перейти к шагу 6.
-
Увеличить t на dt и, получив значение следующей точки, принадлежащей кривой, из уравнения (2), перейти к шагу 4.
-
Закрасить прямоугольник в окрестности двух пикселей от выбранной точки, принадлежащей кривой.
-
Вычислить направляющие точки по формулам:
;
,
где P0 – выбранная
пользователем точка, P1 –
правая точка сегмента кривой, P2
– левая точка.
-
В массиве определяющих кривую точек сместить все элементы, начиная с третьей точки выбранного сегмента, на 3 позиции вправо и записать в освободившиеся ячейки последовательно C, P0, B.
-
Построить составную кривую по новому массиву определяющих точек.
3 Описание структуры по
3.1 Структура по

Рисунок 3. Структура программы
int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) – точка входа в программу. В данной функции приложение выполняет необходимые действия по собственной инициализации, созданию и отображению главного окна.
Параметры: hInstance - дескриптор текущего экземпляра окна;
hPrevInstance – дескриптор предыдущего экземпляра окна;
lpCmdLine – указатель на командную строку;
nCmdShow – показывает состояние окна (режим отображения).
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) – функция, обрабатывающая сообщения, поступающие окну.
Параметры: hwnd – дескриптор окна;
uMsg – сообщение;
wParam и lParam – параметры, задающие дополнительную информацию о сообщении, точное значение зависит от сообщения.
Вызываемые функции: при выборе пользователем пункта «Выход» - DestroyWindow; при поступлении сообщения завершения программы – PostQuitMessage; при движении мыши – OnMouseMove; при сообщении перерисовки окна – DrawTestScene.
BOOL DestroyWindow(HWND hWnd) – функция разрушающая окно.
Параметр: hWnd – дескриптор окна.
void PostQuitMessage(int nExitCode) - указывает системе, что поток сделал запрос на то, чтобы завершить свою работу.
Параметр: nExitCode – код завершения прикладной программы.
void DrawTestScene(DrawingContext* ctx, HWND hwnd, POINT pt) – функция рисования окна. Функция очищает окно, рисует кривую и ее определяющие точки.
Параметры: ctx – контекст рисования;
hwnd – дескриптор окна;
pt – положение курсора.
Вызываемые функции: для вычисления длины кривой – GetLenght; для последовательного определения координат точек, принадлежащих кривой – BCoord, для вычисления направляющих точек узла, выбранного пользователем, – QUAD.
void OnMouseMove(HWND hwnd, POINT pt, DWORD dwFlags, DrawingContext* ctx) – функция, обрабатывающая изменение мышью положения определяющих точек кривой.
Параметры: hwnd – дескриптор окна;
pt – положение курсора;
dwFlags – параметры перемещения мыши;
ctx – контекст рисования.
double GetLenght(Point* points) – функция возвращает длину кривой.
Параметр: points – массив определяющих точек сегмента кривой.
int BCoord(int x0, int x1, int x2, int x3, double t) – возвращает координаты принадлежащей кривой точки, соответствующей заданному значению параметра.
Параметры: x0, x1, x2, x3 – координата определяющих точек сегмента кривой;
t – параметр кривой.
void QUAD(DrawingContext* ctx, Point* p) – функция вычисляет направляющие точки выбранного пользователем узла и записывает их в массив определяющих точек кривой.
Параметры: ctx – контекст рисования;
p – точка, выбранная пользователем.
