Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ Преобразования координат в 2d графике

Автор: Dark 10.05.2003 3:29

Преобразования координат широко ипользуются в машинной графике.

наиболее используемые преобразования- Афинные .
Прямые после преобразования остаются прямыми, паралельные прямые - паралельными и т.д.

вид афинных преобразований:

x2=a1*x1+a2*y1+a3
y2=a4*x1+a5*y1+a6

или в виде матрицы

{ a1 a2 | a3 }
{ a4 a5 | a6 }

так вот при помощи этой матрицы в разных видах можно получить следующие эффекты:

1. Параллельный перенос
{ 1 0 | x0}
{ 0 1 | y0}

2. Масштабирование
{ M 0 | 0}
{ 0 M | 0}

3. Симметрия относительно оси Y
{ -1 0 | 0}
{ 0 1 | 0}

4. Смена осей
{ 0 1 | 0}
{ 1 0 | 0}

5. Поворот на a градусов(у меня реализовано в градусной мере)
{ cos(a) -sin(a) | 0}
{ sin(a) cos(a) | 0}

6. Движение
{ cos(a) -sin(a) | x0}
{ sin(a) cos(a) | y0}

Вот вам пример:

uses graph,crt;
var
grDriver: Integer;
grMode: Integer;
matrix:array[1..2,1..3] of real;
i:integer;
a:real;
b:integer;
const obj:array[1..4,1..2,1..2] of real=
(
((10,10),(20,10)),((20,10),(20,20)),((20,20),(10,20)),((10,20),(10,10))
);
xc=320;
yc=200;


procedure drobj(col:byte;ass:string);
begin
setcolor(col);
for i:=1 to 4 do
line(
round(obj[i,1,1]*matrix[1,1]+obj[i,1,2]*matrix[1,2]+matrix[1,3]+xc),
round(obj[i,1,2]*matrix[2,1]+obj[i,1,2]*matrix[2,2]+matrix[2,3]+yc),
round(obj[i,2,1]*matrix[1,1]+obj[i,2,2]*matrix[1,2]+matrix[1,3]+xc),
round(obj[i,2,2]*matrix[2,1]+obj[i,2,2]*matrix[2,2]+matrix[2,3]+yc)
);
outtextxy(10,10,ass);
end;

procedure domatrix(a1,a2,a3,a4,a5,a6:real);
begin
matrix[1,1]:=a1;
matrix[1,2]:=a2;
matrix[1,3]:=a3;
matrix[2,1]:=a4;
matrix[2,2]:=a5;
matrix[2,3]:=a6;
end;

begin
grDriver := Detect;
InitGraph(grDriver, grMode,'c:bpbgi');
domatrix(1,0,0,0,1,0); {нет преобразования}
drobj(15,'Ishodnui');
readkey;
drobj(0,'Ishodnui');
domatrix(1,0,10,0,1,10); {перенос с.к.}
drobj(15,'Perenos s.k.');
readkey;
drobj(0,'Perenos s.k.');
domatrix(5,0,0,0,5,0); {Масштабирование}
drobj(15,'Masshtab');
readkey;
drobj(0,'Masshtab');
domatrix(1,0,0,0,1,0); {Симметрия относительно оси Y}
drobj(15,'Simmetria po y');
domatrix(-1,0,0,0,1,0);
drobj(15,'Simmetria po y');
readkey;
setfillstyle(solidfill,0);
bar(0,0,getmaxx,getmaxy);
repeat
b:=(b+360-5) mod 360;
a:=(b*pi)/180;
domatrix(cos(a),-sin(a),0,sin(a),cos(a),0);
drobj(15,'Povorot');
delay(1000);
drobj(0,'Povorot');
until keypressed;
CloseGraph;
end.