Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по учебной практике.doc
Скачиваний:
6
Добавлен:
27.09.2019
Размер:
565.76 Кб
Скачать

Тест №3

Цель: проверить функционирование программы в исключительных ситуациях.

Ожидаемый результат: вывод сообщения об исключительной ситуации.

Методика тестирования: «белый (прозрачный) ящик».

Объект тестирования: процедуры, при выполнении которых могут возникнуть исключительные ситуации.

Полученный результат: адекватная реакция на действия пользователя, вызывающие исключительные ситуации. См. рис. 13.

Рис. 12. Искажение формы каркаса поверхности при вращении вокруг оси OY.

Рис. 13. Реакция программы на исключительную ситуацию

Заключение

В соответствии с заданием на учебную практику проведён анализ предметной области, выбрана технология разработки ПО и на её основе реализован программный продукт. В рамках методы класса реализуют математическое обеспечение трёхмерной машинной графики. Проведено тестирование созданного программного продукта.

Список использованных источников

  1. Гурьянов Л.В. Алгоритмические языки и программирование: Курс лекций, 2006/2007.

  2. Аммерал Л. Принципы программирования в машинной графике. – М.: «Сол Систем», 1992.

  3. Карпов Е.В. Геометрическое моделирование и машинная графика в САПР: Метод. указания к курсовому проектированию. - Пенза: ПГТУ, 1994.

  4. Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся втузов. - М.: «Наука», 1980.

  5. Гурьянов Л.В., Гурьянова Л.С., Самуйлов С.В. Введение в программирование. Pascal и Delphi: Лабораторный практикум. - Пенза: ПГУ, 2006.

  6. Фаронов В.В. 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.

3