![]() |
![]() ![]() |
![]() |
Dark |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
Преобразования координат широко ипользуются в машинной графике.
наиболее используемые преобразования- Афинные . Прямые после преобразования остаются прямыми, паралельные прямые - паралельными и т.д. вид афинных преобразований: 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.
-------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 1:46 |