You are on page 1of 8

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
"ЛЬВІВСЬКА ПОЛІТЕХНІКА”

МЕТОДИЧНІ ВКАЗІВКИ ДО ЛАБОРАТОРНОЇ РОБОТИ № 3


з курсу "Компютерна графіка"

Для студентів бакалаврського рівня


підготовки по спеціальності
«Видавничо-поліграфічна справа»

Затверджено на засіданні
кафедри АСУ. Протокол № 3
від 10.05.2004.

Львів – 2010
Проекції та площини: Методичні вказівки до лабораторної роботи № 3 з
курсу "Комп’ютерна графіка" для студентів спеціальності «Видавничо-
поліграфічна справа» / Укл.: О.Я. Різник, М.А. Назаркевич, Д. Скрибайло-
Леськів - Львів: Видавництво Національного університету "Львівська
політехніка", 2004. - 12 с.

Укладач О.Я. Різник,


М.А. Назаркевич,
Д. Скрибайло-Леськів

Відповідальний за випуск Шпак З.Я., канд. техн. наук, доц.

Рецензент Вальковський В.А., д-р техн. наук, проф.


Лабораторна робота №3

Тема: Основи комп‘ютерної графіки. Проекції та площини.

Теоретичні основи

3.1 Паралельні проекції


Метою розділу є ознайомлення з елементарним математичним апаратом
плоских геометричних проекцій. Для простоти будемо вважати, що при
центральному проектуванні картинна площина перпендикулярна осі z і
збігається з площиною z = d, а при паралельному збігається з площиною z = 0.
Проекції розглядаються в системі координат спостерігача, що є
лівосторонньою. Система координат, в якій вісь х спрямована вправо, вісь у -
вгору, а вісь z - усередину екрана, природньо погоджується з екраном дисплея.

Проекційна площина

Проекційна
площина

Вид звер ху
вздовж осі y

Вид збоку
вздовж осі x

Проекційна площина

мал.3.1. Центральна проекція


На мал.3.1 наведені три зображення лівосторонньої системи координат, у
яких точка P проектується на проекційну площину, розташовану на відстані d
від початку координат. Для обчислення координат Xр і Yp проекції точки (x, у,
z) напишемо співвідношения, отримані з подібності трикутників (рис.4.14):
X P x YP y
 ,  .
d z d z
Перемножуючи обидві сторони кожного співвідношення на d, одержимо
dx x dy y
XP   , YP   .
z z/d z z/d
Відстань d є в даному випадку масштабним множником, застосованим до
координат Xp і Yp. Фактором, що приводить до того, що на центральній
проекції більш віддалені об'єкти виглядають дрібніше, ніж ближчі, є ділення на
z. Відзначимо, що допустимі всі значення z, крім z = 0. Точки можуть розташо-
вуватися як за центром проекції на від’ємній частині осі z, так і між центром
проекції і проекційною площиною.
Проекційна площина

мал.3.2. Інша схема побудови центральної проекції


При іншому представленні центрального проектування, застосовуваному в
деяких роботах, проекційна площина сполучається з площиною 2 = 0, а центр
проекції розташовується в точці 2 = - с (мал.3.2). З подібності трикутників
випливає
XP x Y y
 , P  .
d zd d zd
Звідси одержуємо
dx x dy y
XP   , YP   .
z  d z / d   1 z  d z / d   1
Ортографічне проектування на площину z = 0 очевидне. Напрямок проек-
тування збігається з нормаллю до площини проекції, тобто в нашому випадку з
віссю z. Таким чином, точка Р має координати:
X P  x, YP  y, Z P  0 .
Тепер розглянемо довільну точку x, у, z і визначимо її косокутну
проекцію (Хр,Ур) на площину ху. На мал.3.4 показані два зображення точки і
проектор, що рівнобіжний проектору, приведеному на мал.3.3 Рівняння для x- і
y-координат проектора як функцій z мають вид у=mz+b. Вирішуючи два
рівняння относительно Хр і Yр, відзначених на мал.3.4 одержуємо
X P  x  z  l cos a, YP  y  z  l sin a .
Проектор

мал.3.3 Косокутна паралельна проекція Р'(l соsа, l sinа, 0)


є проекцією точки P (0, 0, 1).

мал.3.4. Косокутна паралельна проекція (Xp, Yp, 0) точки (x, y, z).


Для проекції кавальє l=1, тому кут р, показаний на мал.3.3, складає 45°.
Для проекції кабіні l=1/2, а b=агtg (2) =63,4°. У випадку ортографічної проекції l
= 0 і b = 90°.

ЗМІСТ ЗВІТУ
Звіт повинен містити:
1) назву роботи;
2) мету роботи;
3) короткий теоретичний вступ;
4) завдання до лабораторної роботи;
5) тексти розроблених і відлагоджених програм
6) малюнки з реалізацією програми
7) висновки
Код програми
unit Unit1;
interface {$R *.DFM}

uses function X_ (a:real):integer;


Windows, Messages, SysUtils, Classes, Graphics, begin
Controls, Forms, Dialogs, result:=round((form1.P.Width div 2)+(a*x_temp));
StdCtrls, ExtCtrls,math; end;

const function y_ (a:real):integer;


qw=2; begin
fon= clPurple; result:=round((form1.P.height div 2)-a*(x_temp ));
end;
type
b=array[1..6] of Extended;
procedure getparam;
TForm1 = class(TForm)
begin
Button1: TButton;
with form1 do
P: TPaintBox;
begin
Button2: TButton;
for i:=1 to 6 do
C: TCheckBox;
Button3: TButton; box[i]:=StrToFloat(TEdit(FindComponent('Edit'+IntTo
edit5: TEdit; Str(i))).Text);

Edit1: TEdit; end;

Edit2: TEdit; form1.p.Canvas.brush.Style:=bsSolid;

Edit3: TEdit; form1.p.Canvas.brush.Color:=fon;

Edit4: TEdit; end;

Label2: TLabel;
edit6: TEdit;
procedure PPaint(Sender: TObject); procedure TForm1.PPaint(Sender: TObject);

procedure FormCreate(Sender: TObject); begin

procedure Button1Click(Sender: TObject); with p.Canvas do

procedure Button2Click(Sender: TObject); begin

procedure Button3Click(Sender: TObject); p.Canvas.Brush.Color:=clPurple;

private p.Canvas.FillRect(rect(0,0,p.width,p.height));

{ Private declarations } pen.Color:=clwhite;

public moveto(p.Width div 2,0);

{ Public declarations } lineto(p.Width div 2,(p.Height div 2));

end; moveto(p.Width div 2,p.Height div 2);


lineto(p.Width ,p.Height div 2);

var moveto(p.Width div 2,p.Height div 2);

Form1: TForm1; lineto(70,p.Height-70);

z,y2,x2,x,y,i,j,k,kk,x_temp:integer; i:=(p.width div 2)+x_temp;

box:b; while i<p.Width do

cikl:boolean=false; begin

implementation moveto(i,(p.Height div 2)-10);


lineto(i,(p.height div 2)+10);
i:=i+x_temp ;
end; box[3]/2));
i:=0; box_[1]:=box[4]*box[1]/box[3];
while i<(p.Height div 2)-x_temp do box_[2]:=box[4]*box[2]/box[3];
begin box_[3]:=box[4];
moveto((p.width div 2)-10,i); box_[4]:=box[4];
lineto((p.width div 2)+10,i); p.Canvas.Pen.Color:=clyellow;
i:=i+x_temp; p.Canvas.Pen.Width:=p.Canvas.Pen.Width+6;
end; p.Canvas.MoveTo(x_(box_[1]-box_[3]/2),y_(box_[2]-
i:=52+x_temp; box_[3]/2));

j:=p.Height-i; p.Canvas.LineTo(x_(box_[1]-box_[3]/2),y_(box_[2]-
box_[3]/2));
while i<(p.Width div 2) do
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-6;
begin
p.Canvas.brush.Color:=clwhite;
moveto(i-14,j);
p.Canvas.brush.Style:=bsFDiagonal;
lineto(i+1,j+10);
p.Canvas.Pen.Color:=clwhite;
i:=i+x_temp div 2;
p.Canvas.Polygon([point(x_(box_[4]),y_(box_[3]*2)),
j:=j-x_temp div 2; point(x_(box_[4]),y_(0)),
end; point(x_(box_[4]-box_[3]*4),y_(-
end; box_[3]*4)),

end; point(x_(box_[4]-box_[3]*4),y_(box_[2]-
box_[3]/2))
]);
procedure TForm1.FormCreate(Sender: TObject);
p.Canvas.Font.Color:=cllime;
var t,tt:integer;
p.Canvas.TextOut(p.width div 2,p.Height-80,'Xp =
begin '+FloatToStr(box_[1]));
x_temp:=p.Width div 20; p.Canvas.TextOut(p.width div 2,p.Height-60,'Yp =
t:=1; '+FloatToStr(box_[2]));
tt:=1; end;
label2.Caption:=' X Y Z
D'+#10+#13+#10+#13+#10+#13+ procedure TForm1.Button2Click(Sender: TObject);
'L'+#10+#13+'Alpha'; var box_:b;
end; begin
getparam;
procedure TForm1.Button1Click(Sender: TObject); if c.Checked then ppaint(form1);
var box_:b; p.Canvas.Pen.Width:=p.Canvas.Pen.Width+6;
begin p.Canvas.MoveTo(x_(box[1]-box[3]/2),y_(box[2]-
getparam; box[3]/2));
p.Canvas.LineTo(x_(box[1]-box[3]/2),y_(box[2]-
box[3]/2));
if c.Checked then ppaint(form1);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-6;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+6;
p.Canvas.MoveTo(x_(0),y_(0));
p.Canvas.MoveTo(x_(box[1]-box[3]/2),y_(box[2]-
box[3]/2)); p.Canvas.LineTo(x_(box[1]-box[3]/2),y_(box[2]-
box[3]/2));
p.Canvas.LineTo(x_(box[1]-box[3]/2),y_(box[2]-
box[3]/2)); box_[1]:=box[4]*box[1]/(box[3]+box[4]);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-6; box_[2]:=box[4]*box[2]/(box[3]+box[4]);
p.Canvas.MoveTo(x_(0),y_(0)); box_[3]:=box[4];
p.Canvas.LineTo(x_(box[1]-box[3]/2),y_(box[2]- box_[4]:=box[4];
p.Canvas.Pen.Color:=clyellow;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+6; p.Canvas.Pen.Width:=p.Canvas.Pen.Width-6;
p.Canvas.MoveTo(x_(box_[1]-box_[3]/2),y_(box_[2]- p.Canvas.brush.Color:=clwhite;
box_[3]/2));
p.Canvas.LineTo(x_(box_[1]-box_[3]/2),y_(box_[2]- p.Canvas.MoveTo(x_(box[1]-box[3]/2),y_(box[2]-
box_[3]/2));
box[3]/2));
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-6;
p.Canvas.LineTo(x_(box_[1]-box_[3]/2),y_(box_[2]-
p.Canvas.brush.Color:=clwhite; box_[3]/2));
p.Canvas.brush.Style:=bsFDiagonal;
p.Canvas.Pen.Color:=clwhite; p.Canvas.brush.Style:=bsFDiagonal;
p.Canvas.Polygon([point(x_(box_[4]),y_(box_[3]*2)), p.Canvas.Pen.Color:=clwhite;
point(x_(box_[4]),y_(0)), p.Canvas.Polygon([point(x_(box_[4]),y_(box[3]*4)),p
point(x_(box_[4]-box_[3]*4),y_(- oint(x_(box_[4]),y_(0)),
box_[3]*4)),
point(x_(box_[4]-box_[3]*4),y_(-
point(x_(box_[4]-box_[3]*4),y_(box_[2]- box_[3]*4)),
box_[3]/2)) point(x_(box_[4]-box_[3]*4),y_(box_[2]-
]); box_[3]/2))
p.Canvas.Font.Color:=cllime; ]);
p.Canvas.TextOut(p.width div 2,p.Height-80,'Xp = p.Canvas.Font.Color:=cllime;
'+FloatToStr(box_[1])); p.Canvas.TextOut(p.width div 2,p.Height-80,'Xp =
p.Canvas.TextOut(p.width div 2,p.Height-60,'Yp = '+FloatToStr(box_[1]));
'+FloatToStr(box_[2]));
p.Canvas.TextOut(p.width div 2,p.Height-60,'Yp =
'+FloatToStr(box_[2]));
end; end;
end.
procedure TForm1.Button3Click(Sender: TObject);
var box_:b;
begin
getparam;
if c.Checked then ppaint(form1);
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+6;
p.Canvas.MoveTo(x_(box[1]-box[3]/2),y_(box[2]-
box[3]/2));
p.Canvas.LineTo(x_(box[1]-box[3]/2),y_(box[2]-
box[3]/2));
p.Canvas.Pen.Width:=p.Canvas.Pen.Width-6;

box_[1]:=box[1]+box[3]*box[5]*cos(DegToRad(box[6
]));
box_[2]:=box[2]+box[3]*box[5]*sin(DegToRad(box[6
]));
box_[3]:=1;
p.Canvas.Pen.Color:=clyellow;
p.Canvas.Pen.Width:=p.Canvas.Pen.Width+6;
p.Canvas.MoveTo(x_(box_[1]-box_[3]/2),y_(box_[2]-
box_[3]/2));
p.Canvas.LineTo(x_(box_[1]-box_[3]/2),y_(box_[2]-
box_[3]/2));

You might also like