Цель: Комбинированные преобразования объектов на плоскости
Задание: На основе разработанных в предыдущих лабораторных работах программах по преобразованию объектов на плоскости, составить программу, которая как поворачивает объект на некоторый угол относительно начала координат, так и масштабирует объект (растяжение/сжатие вдоль оси ОХ/ОУ) т.е. осуществляет комбинированное преобразование объекта на плоскости.
Математическая модель:Разработать алгоритм и программу решения прикладной задачи – моделирование движения брошенных с земли объектов.
Алгоритм: блок-схема
Программа:

Код программы:
const m = 5;
const n = 2;
var a:array[0..m-1,0..n-1] of real = ((10,10),(50,10), (35, 25), (50, 40), (10, 40));
//matrices for multiplying, global
m1:array[0..m-1,0..n-1] of real;
m2:array[0..n-1,0..n-1] of real;
//matric to draw, global
main:array[0..m-1,0..n-1] of real;
//transponent matrix (a,b,c,d)
b:array[0..n-1,0..n-1] of real;
//rotate matrix
d:array[0..n-1,0..n-1] of real;
h,w,h2,w2:integer;
u:real;
//main = m1 x m2
procedure multiplyMatrices();
var i, j, k: integer;
s:real;
begin
for i:=0 to m-1 do
begin
for j:=0 to n-1 do
begin
s:=0;
for k:=0 to n-1 do
begin
s:=s+m1[i][k]*m2[k][j];
end;
main[i][j]:=s;
end;
end;
end;
procedure drawFlag();
var i: integer;
begin;
Image1.Canvas.MoveTo(round(w2+main[0][0]),round(h2-main[0][1]));
for i:=1 to m-1 do
begin
Image1.Canvas.LineTo(round(w2+main[i][0]), round(h2-main[i][1]));
end;
Image1.Canvas.LineTo(round(w2+main[0][0]),round(h2-main[0][1]));
end;
begin
Val(Edit1.Text,b[0][0]);
Val(Edit2.Text,b[0][1]);
Val(Edit3.Text,b[1][0]);
Val(Edit4.Text,b[1][1]);
Val(Edit5.Text,u);
u:= u*pi/180;
d[0][0]:= cos(u);
d[0][1]:= sin(u);
d[1][0]:= -sin(u);
d[1][1]:= cos(u);
h:= Image1.Height;
w:= Image1.Width;
h2:= round(h/2);
w2:= round(w/2);
//ox, oy
Image1.Canvas.Pen.Color:=clgreen;
Image1.Canvas.Rectangle(0,0,w,h);
Image1.Canvas.MoveTo(0, h2);
Image1.Canvas.LineTo(w, h2);
Image1.Canvas.MoveTo(w2, 0);
Image1.Canvas.LineTo(w2, h);
//initial image
Image1.Canvas.Pen.Color:=clgreen;
main:= a;
drawFlag();
//move by OX, OY
Image1.Canvas.Pen.Color:=clblue;
m1:= a;
m2:= b;
multiplyMatrices();
drawFlag();
//rotate by angle u
Image1.Canvas.Pen.Color:=clpurple;
m1:= a;
m2:= d;
multiplyMatrices();
drawFlag();
// move by OX, OY and rotate by angle u
Image1.Canvas.Pen.Color:=clred;
m1:= main;
m2:= b;
multiplyMatrices();
drawFlag();
Алгоритм: блок-схема
Программа:

Код программы:
const m = 5;
const n = 2;
var a:array[0..m-1,0..n-1] of real = ((10,10),(50,10), (35, 25), (50, 40), (10, 40));
//matrices for multiplying, global
m1:array[0..m-1,0..n-1] of real;
m2:array[0..n-1,0..n-1] of real;
//matric to draw, global
main:array[0..m-1,0..n-1] of real;
//transponent matrix (a,b,c,d)
b:array[0..n-1,0..n-1] of real;
//rotate matrix
d:array[0..n-1,0..n-1] of real;
h,w,h2,w2:integer;
u:real;
//main = m1 x m2
procedure multiplyMatrices();
var i, j, k: integer;
s:real;
begin
for i:=0 to m-1 do
begin
for j:=0 to n-1 do
begin
s:=0;
for k:=0 to n-1 do
begin
s:=s+m1[i][k]*m2[k][j];
end;
main[i][j]:=s;
end;
end;
end;
procedure drawFlag();
var i: integer;
begin;
Image1.Canvas.MoveTo(round(w2+main[0][0]),round(h2-main[0][1]));
for i:=1 to m-1 do
begin
Image1.Canvas.LineTo(round(w2+main[i][0]), round(h2-main[i][1]));
end;
Image1.Canvas.LineTo(round(w2+main[0][0]),round(h2-main[0][1]));
end;
begin
Val(Edit1.Text,b[0][0]);
Val(Edit2.Text,b[0][1]);
Val(Edit3.Text,b[1][0]);
Val(Edit4.Text,b[1][1]);
Val(Edit5.Text,u);
u:= u*pi/180;
d[0][0]:= cos(u);
d[0][1]:= sin(u);
d[1][0]:= -sin(u);
d[1][1]:= cos(u);
h:= Image1.Height;
w:= Image1.Width;
h2:= round(h/2);
w2:= round(w/2);
//ox, oy
Image1.Canvas.Pen.Color:=clgreen;
Image1.Canvas.Rectangle(0,0,w,h);
Image1.Canvas.MoveTo(0, h2);
Image1.Canvas.LineTo(w, h2);
Image1.Canvas.MoveTo(w2, 0);
Image1.Canvas.LineTo(w2, h);
//initial image
Image1.Canvas.Pen.Color:=clgreen;
main:= a;
drawFlag();
//move by OX, OY
Image1.Canvas.Pen.Color:=clblue;
m1:= a;
m2:= b;
multiplyMatrices();
drawFlag();
//rotate by angle u
Image1.Canvas.Pen.Color:=clpurple;
m1:= a;
m2:= d;
multiplyMatrices();
drawFlag();
// move by OX, OY and rotate by angle u
Image1.Canvas.Pen.Color:=clred;
m1:= main;
m2:= b;
multiplyMatrices();
drawFlag();
Комментариев нет:
Отправить комментарий