Лабораторна робота №1
Тема: Основи комп’ютерної графіки. Робота в декартовій системі координат
Мета: Ознайомлення з основами комп’ютерної графіки.
Теоретичні основи
Представления точок
Точка задається за допомогою двох значень (х у), наприклад, (2 3) .
Перетворення точок
Розглянемо результати матричного множення (x, y) , що визначає точку, і матриці перетворення 2х2 загального виду
Дослідимо декілька часткових випадків:
1) a=d=1, b=c=0. Змін не відбувається.
2) d=1, b=c=0 Зміна масштабу по осі x
3) b=c=0 Зміна масштабу по осях x і y.
4) b=c=0, d=1, a=-1. Відображення координат відносно осі y.
5) b=c=0, d=a<0. Відображення відносно початку координат.
6) d=a =l, c=0. Зсув
1.3 Перетворення прямих ліній (відрізків)
Будь-яка пряма будується за допомогою двох точок, наприклад, АВ. Нехай точки À i В задані координатами - А (0, l) i В (2, 3). Матриця ж перетворення, задана такими значеннями:
В результаті декартового добутку вектора-точки на матрицю перетворення одержимо:
Обертання
Розглянемо плоскийтрикутник АВС.Нехай координати трикутника задані такими значеннями: А(3,1), В(6,1) та С(6,4)
Матриця перетворення для повороту на 90° проти годинникової стрілки виглядає так:
Після декартового добутку одержимо матрицю:
Матриця перетворення для повороту на 180° проти годинникової стрілки виглядає так:
Після декартового добутку одержимо матрицю:
Матриця перетворення для повороту на 270° проти годинникової стрілки виглядає так:
Після декартового добутку одержимо матрицю:
Відображення
Відображення визначається поворотом на 180° навколо осі, що лежить в площині х,y.
1)Обертання навколо прямої х=у задається матрицею:
Після декартового добутку одержимо матрицю:
2)Обертання навколо осі у=0 задається матрицею:
Після декартового добутку одержимо:
Зміна масштабу.
Зміна масштабу визначається значениям 2-х елементів головної діагоналі матриці. Якщо використовуємо матрицю
то маємо збільшення в 2 рази. Якщо значения елементів не pівні, то мае місце спотворення.
Збільшимо трикутник в 3 рази. Після декартового добутку одержимо матрицю:
Двовимірний зсув i однорідні координати
Введемо третій компонент у вектори точок (x,y) і (х*,у*).
(x,y,1) і (х*,у*,1)
Матриця перетворення матиме вигляд:
Таким чином:
Константи m і n викликають зсув х*,у*, відносно x,y.
Порядок роботи
Побудуйте декартову систему координат.
Виведіть на панель можливість задания координат тонок та матриці перетворення.
Здійсніть масштабування однієї поділки по осях ОХ та OY.
Побудуйте точку у декартовій системі координат. Здійсніть yci перетворення точок за допомогою матричних перетворень.
Побудуйте відрізок. Виведіть на панель можливість введения координат відрізка та матриці перетворення. Здійсніть перетворення відрізків.
Побудуйте трикутник 3дійсніть перетворення трикутника: обертання, відображення, масштабування, зсув.
Хід роботи
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, ToolWin;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
Button1: TButton;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
LabeledEdit6: TLabeledEdit;
Button2: TButton;
LabeledEdit7: TLabeledEdit;
LabeledEdit8: TLabeledEdit;
Button3: TButton;
LabeledEdit9: TLabeledEdit;
LabeledEdit10: TLabeledEdit;
LabeledEdit11: TLabeledEdit;
LabeledEdit12: TLabeledEdit;
Button4: TButton;
LabeledEdit13: TLabeledEdit;
LabeledEdit14: TLabeledEdit;
LabeledEdit15: TLabeledEdit;
LabeledEdit16: TLabeledEdit;
LabeledEdit17: TLabeledEdit;
LabeledEdit18: TLabeledEdit;
Button5: TButton;
LabeledEdit19: TLabeledEdit;
LabeledEdit20: TLabeledEdit;
LabeledEdit21: TLabeledEdit;
LabeledEdit22: TLabeledEdit;
Button6: TButton;
LabeledEdit23: TLabeledEdit;
LabeledEdit24: TLabeledEdit;
LabeledEdit25: TLabeledEdit;
LabeledEdit26: TLabeledEdit;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
ComboBox3: TComboBox;
function y(a:integer):integer;
procedure draw_axises();
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure ComboBox3Change(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure Button11Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
xc,yc:integer;
llength,wwidth:integer;
implementation
{$R *.dfm}
function TForm1.y(a:integer):integer;
begin
y:=((PaintBox1.Height div 2)-a);
end;
procedure TForm1.draw_axises();
var
x,y,i:integer;
begin
with PaintBox1.Canvas do
begin
PaintBox1.Refresh;
Pen.Color:=clBlack;
MoveTo(0,yc);
LineTo(PaintBox1.Width,yc);
MoveTo(xc,0);
LineTo(xc,(PaintBox1.Width));
x:=xc;
while (x>0) do
begin
MoveTo(x,yc-wwidth);
LineTo(x,yc+wwidth);
x:=x-llength;
end;
x:=xc;
while (x<PaintBox1.Width) do
begin
MoveTo(x,yc-wwidth);
LineTo(x,yc+wwidth);
x:=x+llength;
end;
y:=yc;
while (y>0) do
begin
MoveTo(xc-wwidth,y);
LineTo(xc+wwidth,y);
y:=y-llength;
end;
y:=yc;
while (y<PaintBox1.Height) do
begin
MoveTo(xc-wwidth,y);
LineTo(xc+wwidth,y);
y:=y+llength;
end;
TextOut(round(PaintBox1.Width*0.98),round(yc*1.1),'X');
TextOut(round(xc*1.05),round(PaintBox1.Height*0.02),'Y');
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
xp,yp:integer;
point_size:integer;
begin
draw_axises();
point_size:=2;
xp:=strtoint(LabeledEdit1.Text);
yp:=strtoint(LabeledEdit2.Text);
with PaintBox1.Canvas do
begin
Pen.Color:=clRed;
Ellipse(xp*llength+xc-point_size,yc-yp*llength-point_size,
xc+xp*llength+point_size,yc-yp*llength+point_size);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
xp,yp:integer;
point_size:integer;
a,b,c,d:double;
begin
Button1.Click;
point_size:=2;
a:=strtofloat(LabeledEdit3.Text);
b:=strtofloat(LabeledEdit4.Text);
c:=strtofloat(LabeledEdit5.Text);
d:=strtofloat(LabeledEdit6.Text);
xp:=strtoint(LabeledEdit1.Text);
yp:=strtoint(LabeledEdit2.Text);
xp:=round(xp*a+yp*c);
yp:=round(xp*b+yp*d);
with PaintBox1.Canvas do
begin
Pen.Color:=clGreen;
Ellipse(xp*llength+xc-point_size,yc-yp*llength-point_size,
xc+xp*llength+point_size,yc-yp*llength+point_size);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
xp1,yp1,xp2,yp2:integer;
point_size:integer;
begin
draw_axises();
point_size:=2;
xp1:=strtoint(LabeledEdit7.Text);
yp1:=strtoint(LabeledEdit8.Text);
xp2:=strtoint(LabeledEdit13.Text);
yp2:=strtoint(LabeledEdit14.Text);
with PaintBox1.Canvas do
begin
Pen.Color:=clRed;
Ellipse(xp1*llength+xc-point_size,yc-yp1*llength-point_size,
xc+xp1*llength+point_size,yc-yp1*llength+point_size);
MoveTo(xp1*llength+xc,yc-yp1*llength);
LineTo(xc+xp2*llength,yc-yp2*llength);
Ellipse(xp2*llength+xc-point_size,yc-yp2*llength-point_size,
xc+xp2*llength+point_size,yc-yp2*llength+point_size);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
xp1,yp1,xp2,yp2:integer;
x1,x2,y1,y2:integer;
point_size:integer;
a,b,c,d:double;
begin
Button3.Click;
point_size:=2;
a:=strtofloat(LabeledEdit9.Text);
b:=strtofloat(LabeledEdit11.Text);
c:=strtofloat(LabeledEdit10.Text);
d:=strtofloat(LabeledEdit12.Text);
x1:=strtoint(LabeledEdit7.Text);
y1:=strtoint(LabeledEdit8.Text);
x2:=strtoint(LabeledEdit13.Text);
y2:=strtoint(LabeledEdit14.Text);
xp1:=round(x1*a+y1*c);
yp1:=round(x1*b+y1*d);
xp2:=round(x2*a+y2*c);
yp2:=round(x2*b+y2*d);
with PaintBox1.Canvas do
begin
Pen.Color:=clGreen;
Ellipse(xp1*llength+xc-point_size,yc-yp1*llength-point_size,
xc+xp1*llength+point_size,yc-yp1*llength+point_size);
MoveTo(xp1*llength+xc,yc-yp1*llength);
LineTo(xc+xp2*llength,yc-yp2*llength);
Ellipse(xp2*llength+xc-point_size,yc-yp2*llength-point_size,
xc+xp2*llength+point_size,yc-yp2*llength+point_size);
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
xp1,yp1,xp2,yp2,xp3,yp3:integer;
point_size:integer;
a,b,c,d,n,m:double;
begin
draw_axises();
point_size:=2;
a:=strtofloat(LabeledEdit19.Text);
b:=strtofloat(LabeledEdit20.Text);
c:=strtofloat(LabeledEdit21.Text);
d:=strtofloat(LabeledEdit22.Text);
xp1:=strtoint(LabeledEdit15.Text);
yp1:=strtoint(LabeledEdit17.Text);
xp2:=strtoint(LabeledEdit16.Text);
yp2:=strtoint(LabeledEdit18.Text);
xp3:=strtoint(LabeledEdit23.Text);
yp3:=strtoint(LabeledEdit24.Text);
with PaintBox1.Canvas do
begin
Pen.Color:=clRed;
Ellipse(xp1*llength+xc-point_size,yc-yp1*llength-point_size,
xc+xp1*llength+point_size,yc-yp1*llength+point_size);
MoveTo(xp1*llength+xc,yc-yp1*llength);
LineTo(xc+xp2*llength,yc-yp2*llength);
Ellipse(xp2*llength+xc-point_size,yc-yp2*llength-point_size,
xc+xp2*llength+point_size,yc-yp2*llength+point_size);
MoveTo(xp2*llength+xc,yc-yp2*llength);
LineTo(xc+xp3*llength,yc-yp3*llength);
Ellipse(xp3*llength+xc-point_size,yc-yp3*llength-point_size,
xc+xp3*llength+point_size,yc-yp3*llength+point_size);
MoveTo(xp3*llength+xc,yc-yp3*llength);
LineTo(xc+xp1*llength,yc-yp1*llength);
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
xp1,yp1,xp2,yp2,xp3,yp3:integer;
x1,x2,x3,y1,y2,y3:integer;
point_size:integer;
a,b,c,d,n,m:double;
begin
Button5.Click;
point_size:=2;
a:=strtofloat(LabeledEdit19.Text);
b:=strtofloat(LabeledEdit20.Text);
c:=strtofloat(LabeledEdit21.Text);
d:=strtofloat(LabeledEdit22.Text);
m:=strtofloat(LabeledEdit25.Text);
n:=strtofloat(LabeledEdit26.Text);
x1:=strtoint(LabeledEdit15.Text);
y1:=strtoint(LabeledEdit17.Text);
x2:=strtoint(LabeledEdit16.Text);
y2:=strtoint(LabeledEdit18.Text);
x3:=strtoint(LabeledEdit23.Text);
y3:=strtoint(LabeledEdit24.Text);
xp1:=round(x1*a+y1*c+m);
yp1:=round(x1*b+y1*d+n);
xp2:=round(x2*a+y2*c+m);
yp2:=round(x2*b+y2*d+n);
xp3:=round(x3*a+y3*c+m);
yp3:=round(x3*b+y3*d+n);
with PaintBox1.Canvas do
begin
Pen.Color:=clGreen;
Ellipse(xp1*llength+xc-point_size,yc-yp1*llength-point_size,
xc+xp1*llength+point_size,yc-yp1*llength+point_size);
MoveTo(xp1*llength+xc,yc-yp1*llength);
LineTo(xc+xp2*llength,yc-yp2*llength);
Ellipse(xp2*llength+xc-point_size,yc-yp2*llength-point_size,
xc+xp2*llength+point_size,yc-yp2*llength+point_size);
MoveTo(xp2*llength+xc,yc-yp2*llength);
LineTo(xc+xp3*llength,yc-yp3*llength);
Ellipse(xp3*llength+xc-point_size,yc-yp3*llength-point_size,
xc+xp3*llength+point_size,yc-yp3*llength+point_size);
MoveTo(xp3*llength+xc,yc-yp3*llength);
LineTo(xc+xp1*llength,yc-yp1*llength);
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
var
itemname:integer;
begin
itemname:=ComboBox1.ItemIndex;
case itemname of
0:begin
LabeledEdit3.Text:='3';
LabeledEdit4.Text:='0';
LabeledEdit5.Text:='0';
LabeledEdit6.Text:='1';
end;
1:begin
LabeledEdit3.Text:='1';
LabeledEdit4.Text:='0';
LabeledEdit5.Text:='0';
LabeledEdit6.Text:='3';
end;
2:begin
LabeledEdit3.Text:='3';
LabeledEdit4.Text:='0';
LabeledEdit5.Text:='0';
LabeledEdit6.Text:='3';
end;
3:begin
LabeledEdit3.Text:='1';
LabeledEdit4.Text:='0';
LabeledEdit5.Text:='0';
LabeledEdit6.Text:='-1';
end;
4:begin
LabeledEdit3.Text:='-1';
LabeledEdit4.Text:='0';
LabeledEdit5.Text:='0';
LabeledEdit6.Text:='1';
end;
5:begin
LabeledEdit3.Text:='-1';
LabeledEdit4.Text:='0';
LabeledEdit5.Text:='0';
LabeledEdit6.Text:='-1';
end;
6:begin
LabeledEdit3.Text:='1';
LabeledEdit4.Text:='0';
LabeledEdit5.Text:='1';
LabeledEdit6.Text:='1';
end;
7:begin
LabeledEdit3.Text:='1';
LabeledEdit4.Text:='1';
LabeledEdit5.Text:='0';
LabeledEdit6.Text:='1';
end;
8:begin
LabeledEdit3.Text:='1';
LabeledEdit4.Text:='2';
LabeledEdit5.Text:='2';
LabeledEdit6.Text:='1';
end;
end;
Button2.Click;
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
var
itemname:integer;
begin
itemname:=ComboBox2.ItemIndex;
case itemname of
0:begin
LabeledEdit9.Text:='3';
LabeledEdit11.Text:='0';
LabeledEdit10.Text:='0';
LabeledEdit6.Text:='1';
end;
1:begin
LabeledEdit9.Text:='1';
LabeledEdit11.Text:='0';
LabeledEdit10.Text:='0';
LabeledEdit12.Text:='3';
end;
2:begin
LabeledEdit9.Text:='3';
LabeledEdit4.Text:='0';
LabeledEdit10.Text:='0';
LabeledEdit12.Text:='3';
end;
3:begin
LabeledEdit9.Text:='1';
LabeledEdit11.Text:='0';
LabeledEdit10.Text:='0';
LabeledEdit12.Text:='-1';
end;
4:begin
LabeledEdit9.Text:='-1';
LabeledEdit11.Text:='0';
LabeledEdit10.Text:='0';
LabeledEdit12.Text:='1';
end;
5:begin
LabeledEdit9.Text:='-1';
LabeledEdit11.Text:='0';
LabeledEdit10.Text:='0';
LabeledEdit12.Text:='-1';
end;
6:begin
LabeledEdit9.Text:='1';
LabeledEdit11.Text:='0';
LabeledEdit10.Text:='1';
LabeledEdit12.Text:='1';
end;
7:begin
LabeledEdit9.Text:='1';
LabeledEdit11.Text:='1';
LabeledEdit10.Text:='0';
LabeledEdit12.Text:='1';
end;
8:begin
LabeledEdit9.Text:='1';
LabeledEdit11.Text:='2';
LabeledEdit10.Text:='2';
LabeledEdit12.Text:='1';
end;
end;
Button4.Click;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
l,w:integer;
begin
l:=llength;
llength:=round(llength*1.1);
if (llength-l)<1 then
llength:=llength+2;
w:=wwidth;
if (wwidth<10) then
begin
wwidth:=round(wwidth*1.1);
if (wwidth-w)<1 then
wwidth:=wwidth+1;
end;
Button2.Click;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
xc:=PaintBox1.Width div 2;
yc:=PaintBox1.Height div 2;
llength:=PaintBox1.Height div 40;
wwidth:=6;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
llength:=round(llength*0.9);
wwidth:=round(wwidth*0.9);
Button2.Click;
end;
procedure TForm1.ComboBox3Change(Sender: TObject);
var
itemname:integer;
begin
itemname:=ComboBox3.ItemIndex;
case itemname of
0:begin
LabeledEdit19.Text:='0';
LabeledEdit20.Text:='1';
LabeledEdit21.Text:='-1';
LabeledEdit22.Text:='0';
LabeledEdit25.Text:='0';
LabeledEdit26.Text:='0';
end;
1:begin
LabeledEdit19.Text:='-1';
LabeledEdit20.Text:='0';
LabeledEdit21.Text:='0';
LabeledEdit22.Text:='-1';
LabeledEdit25.Text:='0';
LabeledEdit26.Text:='0';
end;
2:begin
LabeledEdit19.Text:='0';
LabeledEdit20.Text:='-1';
LabeledEdit21.Text:='1';
LabeledEdit22.Text:='0';
LabeledEdit25.Text:='0';
LabeledEdit26.Text:='0';
end;
3:begin
LabeledEdit19.Text:='0';
LabeledEdit20.Text:='1';
LabeledEdit21.Text:='1';
LabeledEdit22.Text:='0';
LabeledEdit25.Text:='0';
LabeledEdit26.Text:='0';
end;
4:begin
LabeledEdit19.Text:='1';
LabeledEdit20.Text:='0';
LabeledEdit21.Text:='0';
LabeledEdit22.Text:='-1';
LabeledEdit25.Text:='0';
LabeledEdit26.Text:='0';
end;
5:begin
LabeledEdit19.Text:='2';
LabeledEdit20.Text:='0';
LabeledEdit21.Text:='0';
LabeledEdit22.Text:='2';
LabeledEdit25.Text:='0';
LabeledEdit26.Text:='0';
end;
6:begin
LabeledEdit19.Text:='1';
LabeledEdit20.Text:='0';
LabeledEdit21.Text:='0';
LabeledEdit22.Text:='1';
LabeledEdit25.Text:='4';
LabeledEdit26.Text:='6';
end;
end;
Button6.Click;
end;
procedure TForm1.Button10Click(Sender: TObject);
var
l,w:integer;
begin
l:=llength;
llength:=round(llength*1.1);
if (llength-l)<1 then
llength:=llength+2;
w:=wwidth;
if (wwidth<10) then
begin
wwidth:=round(wwidth*1.1);
if (wwidth-w)<1 then
wwidth:=wwidth+1;
end;
Button4.Click;
end;
procedure TForm1.Button11Click(Sender: TObject);
var
l,w:integer;
begin
l:=llength;
llength:=round(llength*1.1);
if (llength-l)<1 then
llength:=llength+2;
w:=wwidth;
if (wwidth<10) then
begin
wwidth:=round(wwidth*1.1);
if (wwidth-w)<1 then
wwidth:=wwidth+1;
end;
Button6.Click;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
llength:=round(llength*0.9);
wwidth:=round(wwidth*0.9);
Button4.Click;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
llength:=round(llength*0.9);
wwidth:=round(wwidth*0.9);
Button6.Click;
end;
end.
Рис.1.Результат роботи програми
Висновок: На даній лабораторній роботі я ознайомився з основами комп’ютерної графіки. Побудував точку у декартовій системі координат і здійснив yci перетворення точок за допомогою матричних перетворень.Також побудував відрізок та трикутник, здійснивши такі його перетворення,як: обертання, відображення, масштабування , зсув і двовимірний зсув.