IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Преобразования координат в 2d графике
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


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

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

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

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.


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.10.2020 3:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name