- •1. Трёхмерная интерактивная визуализация каркасной модели полусферы с применением Delphi 7.0
- •Анализ предметной области
- •Анализ требований
- •Анализ требований к структуре данных
- •Анализ требований к интерфейсу пользователей
- •Анализ требований к программному средству
- •2. Технология разработки
- •3. Проектирование
- •3.1. Проектирование интерфейса.
- •3.2. Проектирование структуры данных.
- •3.3. Проектирование программного средства.
- •4. Реализация
- •5. Схема программы
- •6. Тестирование программы
- •Тест №1
- •Тест №2
- •Тест №3
Тест №3
Цель: проверить функционирование программы в исключительных ситуациях.
Ожидаемый результат: вывод сообщения об исключительной ситуации.
Методика тестирования: «белый (прозрачный) ящик».
Объект тестирования: процедуры, при выполнении которых могут возникнуть исключительные ситуации.
Полученный результат: адекватная реакция на действия пользователя, вызывающие исключительные ситуации. См. рис. 13.
Рис. 12. Искажение формы каркаса поверхности при вращении вокруг оси OY.
Рис. 13. Реакция программы на исключительную ситуацию
Заключение
В соответствии с заданием на учебную практику проведён анализ предметной области, выбрана технология разработки ПО и на её основе реализован программный продукт. В рамках методы класса реализуют математическое обеспечение трёхмерной машинной графики. Проведено тестирование созданного программного продукта.
Список использованных источников
Гурьянов Л.В. Алгоритмические языки и программирование: Курс лекций, 2006/2007.
Аммерал Л. Принципы программирования в машинной графике. – М.: «Сол Систем», 1992.
Карпов Е.В. Геометрическое моделирование и машинная графика в САПР: Метод. указания к курсовому проектированию. - Пенза: ПГТУ, 1994.
Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся втузов. - М.: «Наука», 1980.
Гурьянов Л.В., Гурьянова Л.С., Самуйлов С.В. Введение в программирование. Pascal и Delphi: Лабораторный практикум. - Пенза: ПГУ, 2006.
Фаронов В.В. Delphi. Программирование на языке высокого уровня: учебник для студентов вузов. - СПб. : «Питер», 2005.
ПРИЛОЖЕНИЕ А.
Исходный текст модулей SurfaceUnit, Moya_graphica4.
unit SurfaceUnit;
interface
uses Graphics;
const
Nx =20;
Ny =8;
razmer = 850;
type
TSurface = class
private
v, f, r, d, rad: integer; // Переменные определяющие точку наблюдения
shift: integer; // Переменная задающая сдвиг осей
color : TColor; // Цвет линий
width : integer; // Толщина линий
public
Xw, Yw, Zw: array[0..(Nx+1)*(Ny+1)-1] of real; // Массивы координат
Bmp1: TBitMap;
constructor Create;
destructor Destroy; override;
procedure world; // Процедура инициализации координат
// 1. Преобразование мировых координат в видовые
// 2. Преобразование видовых координат в экранные
// 3. Вычерчивание поверхности
procedure transform_draw(Xw, Yw, Zw: array of real);
// Перенос
procedure transfer(var Xw, Yw, Zw: array of real; m, n, l: integer);
// Симметрия относительно координатных плоскостей
procedure simmetr_OXY(Xw, Yw, Zw: array of real); // OXY
procedure simmetr_OXZ(Xw, Yw, Zw: array of real); // OXZ
procedure simmetr_OYZ(Xw, Yw, Zw: array of real); // OYZ
// Масштабирование
procedure scale(Xw, Yw, Zw: array of real; kx, ky, kz: real);
// Вращение относительно координатных осей
procedure rotate_OZ(Xw, Yw, Zw: array of real; alpha: real); // OZ
procedure rotate_OY(Xw, Yw, Zw: array of real; beta: real); // OY
procedure rotate_OX(Xw, Yw, Zw: array of real; gamma: real); // OX
// Вращение отностельно оси, параллельной оси OZ
procedure rotate_OZp(Xw, Yw, Zw: array of real; delta: real; dx, dy: integer);
property FirstAngle : integer read v write v;
property SecondAngle : integer read f write f;
property Vector : integer read r write r;
property Radius : integer read rad write rad;
property Axis : integer read shift write shift;
property ScrLength : integer read d write d;
property Colors : TColor read color write color;
property Widths : integer read width write width;
end;
implementation
constructor TSurface.Create;
begin
inherited Create;
Bmp1:=TBitMap.Create;
Bmp1.Width:=razmer;
Bmp1.Height:=razmer;
end;
destructor TSurface.Destroy;
begin
Bmp1.Free;
inherited;
end;
procedure TSurface.world;
var
i, j, k: integer;
begin
for i:=0 to Nx do
begin
for j:=0 to Ny do
begin
k :=j*(Nx+1)+i;
Xw[k] := Radius/Ny*j*cos(2*pi/Nx*i);
Yw[k] := Radius/Ny*j*sin(2*pi/Nx*i);
Zw[k] := sqrt(abs(sqr(Radius)-sqr(Xw[k])-sqr(Yw[k])));
end;
end;
end;
procedure TSurface.transform_draw(Xw, Yw, Zw: array of real);
var
Xe, Ye, Ze :array[0..(Nx+1)*(Ny+1)-1] of real;
Xs, Ys :array[0..(Nx+1)*(Ny+1)-1] of integer;
k:integer;
begin
Bmp1.Canvas.Pen.Style := psSolid;
Bmp1.Canvas.Pen.Color := Colors;
Bmp1.Canvas.Pen.Width := Widths;
for k:=0 to (Nx+1)*(Ny+1)-1 do
begin
Xe[k] :=-Xw[k]*sin(FirstAngle)+Yw[k]*cos(FirstAngle);
Ye[k] :=-Xw[k]*cos(SecondAngle)*cos(FirstAngle)-Yw[k]*cos(SecondAngle)*
sin(FirstAngle)+Zw[k]*sin(SecondAngle);
Ze[k] :=-Xw[k]*sin(SecondAngle)*cos(FirstAngle)-Yw[k]*sin(SecondAngle)
*sin(FirstAngle)-Zw[k]*cos(SecondAngle)+ Vector;
end;
for k:=0 to (Nx+1)*(Ny+1)-1 do
begin
Xs[k] :=round(ScrLength*(Xe[k]/Ze[k]))+ Axis;
Ys[k] :=round(ScrLength*(Ye[k]/Ze[k]))+ Axis;
end;
for k:=0 to (Nx+1)*(Ny+1)-2 do
begin
Bmp1.Canvas.moveto(Xs[k], Ys[k]);
Bmp1.Canvas.lineto(Xs[k+1], Ys[k+1]);
end;
for k:=0 to (Nx+1)*(Ny+1)-Nx-2 do
begin
Bmp1.Canvas.moveto(Xs[k], Ys[k]);
Bmp1.Canvas.lineto(Xs[k+Nx+1], Ys[k+Nx+1]);
end;
end;
procedure TSurface.transfer(var Xw, Yw, Zw: array of real; m, n, l: integer);
var
k: integer;
begin
for k:=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k] :=Xw[k]+m;
Yw[k] :=Yw[k]+n;
Zw[k] :=Zw[k]+l;
transform_draw(Xw, Yw, Zw);
end;
end;
procedure TSurface.simmetr_OXY(Xw, Yw, Zw: array of real);
var
k: integer;
begin
for k:=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k]:=Xw[k];
Yw[k]:=Yw[k];
Zw[k] :=-1*Zw[k];
end;
transform_draw(Xw, Yw, Zw);
end;
procedure TSurface.simmetr_OXZ(Xw, Yw, Zw: array of real);
var
k: integer;
begin
for k:=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k]:=Xw[k];
Yw[k] :=-1*Yw[k];
Zw[k]:=Zw[k];
end;
transform_draw(Xw, Yw, Zw);
end;
procedure TSurface.simmetr_OYZ(Xw, Yw, Zw: array of real);
var
k: integer;
begin
for k:=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k] :=-1*Xw[k];
Yw[k]:=Yw[k];
Zw[k]:=Zw[k];
end;
transform_draw(Xw, Yw, Zw);
end;
procedure TSurface.scale(Xw, Yw, Zw: array of real; kx, ky, kz: real);
var
k: integer;
begin
for k :=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k] :=Xw[k]*kx;
Yw[k] :=Yw[k]*ky;
Zw[k] :=Zw[k]*kz;
end;
transform_draw(Xw, Yw, Zw);
end;
procedure TSurface.rotate_OZ(Xw, Yw, Zw: array of real; alpha: real);
var
k: integer;
begin
for k :=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k] :=Xw[k]*cos(alpha)-Yw[k]*sin(alpha);
Yw[k] :=Xw[k]*sin(alpha)+Yw[k]*cos(alpha);
end;
transform_draw(Xw, Yw, Zw);
end;
procedure TSurface.rotate_OY(Xw, Yw, Zw: array of real; beta: real);
var
k: integer;
begin
for k :=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k] :=Xw[k]*cos(beta)+Zw[k]*sin(beta);
Zw[k] :=-Xw[k]*sin(beta)+Zw[k]*sin(beta);
end;
transform_draw(Xw, Yw, Zw);
end;
procedure TSurface.rotate_OX(Xw, Yw, Zw: array of real; gamma: real);
var
k: integer;
begin
for k :=0 to (Nx+1)*(Ny+1)-1 do
begin
Yw[k] :=Yw[k]*cos(gamma)-Zw[k]*sin(gamma);
Zw[k] :=Yw[k]*sin(gamma)+Zw[k]*cos(gamma);
end;
transform_draw(Xw, Yw, Zw);
end;
procedure TSurface.rotate_OZp(Xw,Yw,Zw: array of real;delta:real;dx,dy:integer);
var
k: integer;
begin
for k :=0 to (Nx+1)*(Ny+1)-1 do
begin
Xw[k] :=Xw[k]*cos(delta)-Yw[k]*sin(delta)-dx*(cos(delta)-1)+dy*sin(delta);
Yw[k] :=Xw[k]*sin(delta)+Yw[k]*cos(delta)-dx*sin(delta)-dy*(cos(delta)-1);
end;
transform_draw(Xw, Yw, Zw);
end;
end.
unit Moya_graphica4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, SurfaceUnit;
type
TMainForm = class(TForm)
BtnCreate: TButton;
BtnRotOZ: TButton;
BtnRotOY: TButton;
BtnRotOX: TButton;
BtnRotOZp: TButton;
BtnTrans: TButton;
BtnSimOXY: TButton;
BtnSimOXZ: TButton;
BtnSimOYZ: TButton;
BtnScale: TButton;
BtnExit: TButton;
EditScX: TEdit;
EditScY: TEdit;
EditScZ: TEdit;
KoefLabel: TLabel;
EditTrX: TEdit;
EditTrY: TEdit;
EditTrZ: TEdit;
TrXLabel: TLabel;
TrYLabel: TLabel;
TrZLabel: TLabel;
ScaleLabel: TLabel;
ScXLabel: TLabel;
ScYLabel: TLabel;
ScZLabel: TLabel;
TransLabel: TLabel;
BtnShow: TButton;
procedure BtnCreateClick(Sender: TObject);
procedure BtnRotOZClick(Sender: TObject);
procedure BtnRotOYClick(Sender: TObject);
procedure BtnRotOXClick(Sender: TObject);
procedure BtnRotOZpClick(Sender: TObject);
procedure BtnTransClick(Sender: TObject);
procedure BtnSimOXYClick(Sender: TObject);
procedure BtnSimOXZClick(Sender: TObject);
procedure BtnSimOYZClick(Sender: TObject);
procedure BtnScaleClick(Sender: TObject);
procedure BtnExitClick(Sender: TObject);
procedure BtnShowClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
Saddle:TSurface;
implementation
uses Serious_unit2;
{$R *.dfm}
procedure TMainForm.BtnCreateClick(Sender: TObject);
begin
MainForm.Hide;
SettingsForm.Show;
end;
procedure TMainForm.BtnRotOZClick(Sender: TObject);
var
i:real;
begin
try
i:=0;
while i<10 do
begin
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.rotate_OZ(Saddle.Xw,Saddle.Yw,Saddle.Zw,i);
canvas.draw(0,0,Saddle.Bmp1);
i:=i+(pi/180);
end;
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnRotOYClick(Sender: TObject);
var
i:real;
begin
try
i:=0;
while i<10 do
begin
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.rotate_OY(Saddle.Xw,Saddle.Yw,Saddle.Zw,i);
canvas.draw(0,0,Saddle.Bmp1);
i:=i+(pi/180);
end;
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnRotOXClick(Sender: TObject);
var
i:real;
begin
try
i:=0;
while i<10 do
begin
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.rotate_OX(Saddle.Xw,Saddle.Yw,Saddle.Zw,i);
canvas.draw(0,0,Saddle.Bmp1);
i:=i+(pi/180);
end;
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnRotOZpClick(Sender: TObject);
var
i:real;
begin
try
i:=0;
while i<10 do
begin
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.rotate_OZp(Saddle.Xw,Saddle.Yw,Saddle.Zw,i, 2, 2);
canvas.draw(0,0,Saddle.Bmp1);
i:=i+(pi/180);
end;
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnTransClick(Sender: TObject);
var
m, n, l:integer;
begin
try
if (EditTrX.Text<>'')and(EditTrY.Text<>'')and(EditTrZ.Text<>'')then
begin
try
m:=StrToInt(EditTrX.Text);
n:=StrToInt(EditTrY.Text);
l:=StrToInt(EditTrZ.Text);
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.Create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.transfer(Saddle.Xw, Saddle.Yw, Saddle.Zw, m, n, l);
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.Create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.transfer(Saddle.Xw, Saddle.Yw, Saddle.Zw, 0, 0, 0);
canvas.Draw(0,0, Saddle.Bmp1);
except
on EConvertError
do
MessageDlg('Ошибка! Введите целое число',mtWarning,[mbOK],0);
end;
end;
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnSimOXYClick(Sender: TObject);
begin
try
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.Create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.simmetr_OXY(Saddle.Xw, Saddle.Yw, Saddle.Zw);
canvas.Draw(0,0,Saddle.Bmp1);
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnSimOXZClick(Sender: TObject);
begin
try
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.Create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.simmetr_OXZ(Saddle.Xw, Saddle.Yw, Saddle.Zw);
canvas.Draw(0,0,Saddle.Bmp1);
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnSimOYZClick(Sender: TObject);
begin
try
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.Create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.simmetr_OYZ(Saddle.Xw, Saddle.Yw, Saddle.Zw);
canvas.Draw(0,0,Saddle.Bmp1);
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnScaleClick(Sender: TObject);
var
kx, ky, kz:real;
begin
try
if (EditScX.Text <> '')and(EditScY.Text <> '')and (EditScZ.Text <> '') then
begin
try
kx:=StrToFloat(EditScX.Text);
ky:=StrToFloat(EditScY.Text);
kz:=StrToFloat(EditScZ.Text);
Saddle.Bmp1.Free;
Saddle.Bmp1:=TBitMap.Create;
Saddle.Bmp1.Width:=razmer;
Saddle.Bmp1.Height:=razmer;
Saddle.scale(Saddle.Xw, Saddle.Yw, Saddle.Zw, kx, ky, kz);
canvas.Draw(0,0,Saddle.Bmp1);
except
on EConvertError
do
MessageDlg('Ошибка! Введите число', mtWarning, [mbOK], 0);
end;
end;
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
procedure TMainForm.BtnExitClick(Sender: TObject);
begin
try
MainForm.Close;
SettingsForm.Close;
Saddle.Free;
except
on EAbort
do
end;
end;
procedure TMainForm.BtnShowClick(Sender: TObject);
begin
try
Canvas.Draw(0, 0, Saddle.Bmp1);
except
on EAccessViolation
do
MessageDlg('Ошибка! Объект не создан', mtWarning, [mbOk], 0);
end;
end;
end.