среда, 8 декабря 2010 г.

Лабораторная работа No 10

Тема: Комбинированные преобразования

Цель: Комбинированные преобразования объектов на плоскости

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

Математическая модель:Разработать алгоритм и программу решения прикладной задачи – моделирование движения брошенных с земли объектов.


Алгоритм: блок-схема

Программа:





Код программы:

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();

Комментариев нет:

Отправить комментарий