Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Системы автоматизированного проектирования. Моделирование в машиностроении. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
procedure TForm1.RadioGroup1Click(Sender: TObject); begin if radiogroup1.ItemIndex=1 then dec(count_points) else inc(count_points); end;
Рисунок 5.19 – Настройка свойств таймера
Создаём в классе Form1 обработчик события изменения номера индек­са в RadioGroup:
Инициализировать обработчики событий OnMouseMove, On­MouseDown, OnMouseUp, OnClick. Для этого необходимо в Object Inspector
перейти на вкладку Events, где щелкнуть по вышеперечисленным событиям
два раза.
Обработка события мыши будут решать две задачи: при перемещении курсора, интерактивная (т.е. еще не зафиксированная точка) будет создавать эффект создания сплайна на ходу. Но если установлен режим редактирования
сплайна, то в этом случае, если какая либо из точек захвачена, т.е. на нее
наведен курсор и зажата левая клавиша мыши, то до тех пор пока пользова-
71
тель не отпустит клавишу мыши, будут вноситься изменения в координаты
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var _lastX,_lastY: real; begin if radiogroup1.ItemIndex=0 then begin
//Сохраняем координаты мыши
Mcoord_X := X; Mcoord_Y := Y;
//Вычисляем параметры для будущей дорисовки линий от указателя
мыши координатным осям
lineX := devX * X; lineY := ScreenH - devY * Y; DrawingArray[count_points, 0] := lineX; DrawingArray[count_points, 1] := lineY; end else begin Mcoord_X := X; Mcoord_Y := Y;
//Вычисляем параметры для будущей дорисовки линий от указателя
мыши координатным осям
_lastX := lineX; _lastY := lineY; lineX := devX * X; lineY := ScreenH - devY * Y; if captured<>-1 then begin DrawingArray[captured, 0] := DrawingArray[captured, 0]-_lastX +
lineX;
DrawingArray[captured, 1] := DrawingArray[captured, 1]-_lastY +
lineY;
end;
данной (захваченной) вершины.
Эта разность определяется как разница между последними сохранен­ными координатами в данном режиме и текущими координатами указателя. Таким образом, начав на вершину пользователь может передвинуть ее, при этом наблюдая в реальном времени как изменяются геометрия данного
сплайна.
В обработчики событий добавить следующий код:
OnMouseMove:
72
end; end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouse-
Button;
Shift: TShiftState; X, Y: Integer); var ax:integer; begin if radiogroup1.ItemIndex=1 then begin Mcoord_X := X; Mcoord_Y := Y; lineX := devX * X; lineY := ScreenH - devY * Y; for ax:=0 to count_points do begin if ((lineX < DrawingArray[ax, 0] + 5)and(lineX > DrawingArray[ax, 0]
- 5)and (lineY < DrawingArray[ax, 1] + 5)and(lineY > DrawingArray[ax, 1] -
5)) then begin captured := ax; break; end; end; end; end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseBut-
ton;
Shift: TShiftState; X, Y: Integer); begin captured := -1;end;
procedure TForm1.FormClick(Sender: TObject); var X,Y:integer; begin X:=Mouse.CursorPos.X-form1.Left-8; Y:=Mouse.CursorPos.Y-form1.Top-31;
OnMouseDown:
OnMouseUp:
OnClick:
73
if radiogroup1.ItemIndex=0 then begin Mcoord_X := X; Mcoord_Y := Y;
lineX := devX * X; lineY := ScreenH - devY * Y;
DrawingArray[count_points, 0] := lineX; DrawingArray[count_points, 1] := lineY;
inc(count_points); end; end;
Результаты работы программы изображены на рисунке 5.20.
Рисунок 5.20 – Пример работы приложения
5.5.4 Задание на выполнение работы
Проверить работу программного кода и выполнить изменения в нем, по
указанию преподавателя.
Содержание отчета: – название работы; – цель работы;
74
– перечень используемых команд; – экранные формы; – листинг программы.
5.6 Поверхность Кунса
5.6.1 Цель работы
Целью работы является приобретение навыков построения поверхно-
стей Кунса используя функции графической библиотеки OpenGL.
5.6.2 Уравнение и свойства поверхности Кунса
Поверхность Кунса – это бикубическая (то есть обладающая кубиче­ской кривизной как в направлении М, так и в направлении N) поверхность, «натянутая» на четыре пространственные кривые (рисунок 5.21).
Рисунок 5.21 – Поверхность Кунса
В случае конструирования поверхности методом Кунса необходимо за-
дать два семейства граничных кривых (в u — и v —направлениях). Уравне­ние поверхности Кунса имеет вид:
(5.12)
75
Граничные кривые представляют собой рациональные кривые Безье,
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OpenGL, StdCtrls;
private
{ Private declarations }
DC : HDC; //контекст устройства hrc: HGLRC; //контекст воспроизведения ps : TPaintStruct;
управляющие точки которых получены с помощью методов интерполяции исходных точек поверхности, внутренние точки порции поверхности вычис-
ляются с помощью билинейной интерполяции в двух направлениях.
Поверхность Кунса по 4-м линиям контура будет состоять из суммы двух линейчатых, минус косая плоскость (рисунок 5.22):
Рисунок 5.22 – Этапы построения поверхности Кунса
При построении поверхности предполагается, что исходные данные в
виде массивов точек, характерных линий поверхности или определяющих их
функций получены в результате физических экспериментов, решения при-
кладных задач, сняты с натурных макетов или выполнены дизайнерами.
5.6.3 Ход работы
В разделе uses программы подключаем библиотеку OpenGL:
В разделе private инициализировать следующие переменные и проце­дуры:
В разделе объявления глобальных переменных инициализировать сле-
дующие переменные:
76
var Form1: TForm1; mass,mass2,mass3: array[0..10] of integer; // массивы в которых будут хранится
координаты точек, по которым будет строится поверхность Кунса
procedure TForm1.FormCreate(Sender: TObject); var i:integer; begin DC:=GetDC(Handle); SetDCPixelFormat(DC); hrc:=wglCreateContext(DC); wglMakeCurrent(DC, hrc); glClearColor (0.0, 0.0, 0.75, 1.0); glMatrixMode (GL_PROJECTION); glLoadIdentity; glFrustum (-1, 1, -1, 1, 3, 10); // задаем перспективу glTranslatef(-0.7, 0, -5); // перенос объекта по оси x левее и по оси z ниже отно-
сительно точки 0,0,0
glMatrixMode (GL_MODELVIEW); glLoadIdentity; end;
procedure TForm1.SetDCPixelFormat; var nPixelFormat: Integer; pfd: TPixelFormatDescriptor; begin FillChar(pfd, SizeOf(pfd), 0); pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; // множество битовых флагов,определяющих устрой-
ство и интерфейс
nPixelFormat := ChoosePixelFormat(DC, @pfd); // устанавливаем формат пиксе-
лей в контексте устройства
SetPixelFormat(DC, nPixelFormat, @pfd); end;
Перейдите к конструктору и сделайте двойной щелчок клавишей мыши на форме – создастся функция обработчика события загрузки формы FormCreate. В ней пропишите следующий код:
Зададим формат пиксела:
77
Создайте форму с необходимыми компонентами, как показано на ри-
procedure TForm1. Button1Click(Sender: TObject); var i:integer; begin for i:=0 to 10 do mass[i]:=random(10); button3.Enabled:=true; end;
сунке 5.23. Используйте компоненты GroupBox, Form, Button и Label с вкладки Standart. У всех компонентов измените свойство Caption согласно рисунку 5.23.
Для кнопок «Визуализировать», в Object Inspector измените свойство Enabled c true на false.
Для расчета координат первой поверхности в обработчик события
OnClick кнопки «Просчитать» необходимо вписать следующий код:
Рисунок 5.23 – Экранная форма создаваемого приложения
78
Для визуализации первой поверхности в обработчик события OnClick
procedure TForm1. Button3Click(Sender: TObject); var i,j:integer; begin glPushMatrix; glRotatef(120, 1, 0, 0); // поворот объекта - ось X glRotatef(180, 0, 1, 0); // поворот объекта - ось Y glRotatef(120, 0, 0, 1); // поворот объекта - ось Z glClearColor (255, 255, 255, 1); glClear (GL_COLOR_BUFFER_BIT) ; glColor3f(0,0,0);
for i:=0 to 9 do begin glBegin(GL_LINE_STRIP); for j:=0 to 10 do glVertex3d(j/10,i/10,mass[j]/10); glEnd(); end; for i:=0 to 10 do begin glBegin(GL_LINE_STRIP); glVertex3d(i/10,0,mass[i]/10); glVertex3d(i/10,0.9,mass[i]/10); glEnd(); end; glPopMatrix; SwapBuffers (Canvas.Handle); end;
procedure TForm1. Button4Click(Sender: TObject); var i,j:integer; begin glPushMatrix; glRotatef(120, 1, 0, 0); // поворот объекта - ось X glRotatef(180, 0, 1, 0); // поворот объекта - ось Y glRotatef(120, 0, 0, 1); // поворот объекта - ось Z
кнопки «Визуализировать» необходимо вписать следующий код:
кнопки «Визуализировать» необходимо вписать следующий код:
Для визуализации второй поверхности в обработчик события OnClick
79
glClearColor (255, 255, 255, 1); glClear (GL_COLOR_BUFFER_BIT) ; glColor3f(0,0,0);
for i:=0 to 9 do begin glBegin(GL_LINE_STRIP); for j:=0 to 10 do glVertex3d(j/10,i/10,mass2[j]/10); glEnd(); end; for i:=0 to 10 do begin glBegin(GL_LINE_STRIP); glVertex3d(i/10,0,mass2[i]/10); glVertex3d(i/10,0.9,mass2[i]/10); glEnd(); end; glPopMatrix; SwapBuffers (Canvas.Handle); button5.Enabled:=true; end;
procedure TForm1. Button5Click(Sender: TObject); var i,j:integer; begin glPushMatrix; glRotatef(120, 1, 0, 0); // поворот объекта - ось X glRotatef(180, 0, 1, 0); // поворот объекта - ось Y glRotatef(120, 0, 0, 1); // поворот объекта - ось Z glClearColor (255, 255, 255, 1); glClear (GL_COLOR_BUFFER_BIT) ; glColor3f(0,0,0);
for i:=0 to 9 do begin glBegin(GL_LINE_STRIP); for j:=0 to 10 do begin
Для визуализации поверхности, получившейся в процессе объединения
двух поверхностей, в обработчик события OnClick кнопки «Визуализиро­вать» необходимо вписать следующий код:
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]