Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Системы автоматизированного проектирования. Моделирование в машиностроении. Учебное пособие
.pdf
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
if radiogroup1.ItemIndex=1 then
dec(count_points)
else
inc(count_points);
end;
Рисунок 5.19 – Настройка свойств таймера
Создаём в классе Form1 обработчик события изменения номера индекса в RadioGroup:
Инициализировать обработчики событий OnMouseMove, OnMouseDown, 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
