Если кто помнит Паскаль

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Frits
Сообщения: 6
Зарегистрирован: 20 окт 2005, 12:51

Здравствуйте, Подскажите пожалуйста как отображать фигуру одновременно относительно плоскостей XOZ и YOZ, XOZ и XOY, XOY и YOZ.Отражение должно быть реализовано с использованием матричных преобразовании над объектом. Спасибо за помощь.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

А при чем здесь Паскаль?
Frits
Сообщения: 6
Зарегистрирован: 20 окт 2005, 12:51

Задание целиком звучит так: Составить программу на языке Паскаль, реализующую трехмерное преобразование с фигурой(фигура - Параллелепипед, преобразование - Отражение одновременно относительно плоскостей XOZ и YOZ, XOZ и XOY, XOY и YOZ.) Отражение должно быть реализовано с использованием матричных преобразовании над объектом.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Матрица преобразований:
Относительно плоскости ХОY:
(1 0 0)
(0 1 0)
(0 0 -1)
Относительно ХОZ
(1 0 0)
(0 -1 0)
(0 0 1)
Относительно YOZ:
(-1 0 0)
(0 1 0)
(0 0 1)
Множим вектор координат на эту матрицу, получаем новые координаты. Их отображаем.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Frits
Сообщения: 6
Зарегистрирован: 20 окт 2005, 12:51

Спасибо, а можно это в виде кода изобразить, а то я совсем Паскаль забыл, если не сложно конечно.Заранее спасибо.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Матрицы можно задать приблизительно так:

Код: Выделить всё

const mat_XOY:array[1..3,1..3] of shortint=((1,0,0),(0,1,0),(0,0,-1));
mat_XOZ:array[1..3,1..3] of shortint=((1,0,0),(0,-1,0),(0,0,1));
mat_YOZ:array[1..3,1..3] of shortint=((-1,0,0),(0,1,0),(0,0,1));
Вектора координат - исходный и модифицированный:

Код: Выделить всё

var vect, vectmod: array[1..3] of integer;
Потом в программе множишь vect на одну из матриц, получаешь vectmod. Как это сделать, уже не подскажу, благо с первого курса линейную алгебру забыл напрочь.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Frits
Сообщения: 6
Зарегистрирован: 20 окт 2005, 12:51

Спасибо, попробую осуществить
Frits
Сообщения: 6
Зарегистрирован: 20 окт 2005, 12:51

Есть вот такая программа по этой теме

Код: Выделить всё

uses Graph,crt;
const
cube: array[0..23] of real = 
(-80,-50,-50,-80,-50,50,-80,50,-50,
-80,50,50,80,-50,-50,80,-50,50,
80,50,-50,80,50,50);
lindex: array[0..23] of integer = 
(0,1,0,4,0,2,1,3,1,5,2,3, 
2,6,3,7,4,5,4,6,5,7,6,7); 

var xt,yt,zt:real; 
xan,yan,zan:real;
sx,sy,sx1,sy1,p,gd,gm: integer;
t:char;

procedure draw(color:byte);
begin
for p:=0 to 11 do begin 
sx:=round(cube[lindex[p*2]*3])+250;
sy:=round(cube[lindex[p*2]*3+1])+200;
sx1:=round(cube[lindex[p*2+1]*3])+250;
sy1:=round(cube[lindex[p*2+1]*3+1])+200;
setcolor(color);
line(SX,SY,sx1,sy1);
end;
end;

procedure rotate;
begin
for p:=0 to 7 do begin
Yt := cube[p*3+1] * COS(Xan) - cube[p*3+2] * SIN(Xan);
Zt := cube[p*3+1] * SIN(Xan) + cube[p*3+2] * COS(Xan);
cube[p*3+1] := Yt;
cube[p*3+2] := Zt;

Xt := cube[p*3] * COS(Yan) - cube[p*3+2] * SIN(Yan);
Zt := cube[p*3] * SIN(Yan) + cube[p*3+2] * COS(Yan);
cube[p*3] := Xt;
cube[p*3+2] := Zt;

Xt := cube[p*3] * COS(Zan) - cube[p*3+1] * SIN(Zan);
Yt := cube[p*3] * SIN(Zan) + cube[p*3+1] * COS(Zan);
cube[p*3] := Xt;
cube[p*3+1] := Yt;
end;
end;

procedure xoy_xoz;
begin
for p:=0 to 7 do begin
Yt:=cube[p*3+1]*-1;
Zt:=cube[p*3+2]*-1;
cube[p*3+1]:=Yt;
cube[p*3+2]:=Zt;
end;
end;
procedure xoz_yoz;
begin
for p:=0 to 7 do begin
Yt:=cube[p*3+1]*-1;
Xt:=cube[p*3]*-1;
cube[p*3+1]:=Yt;
cube[p*3]:=Xt;
end;
end;
procedure xoy_yoz;
begin
for p:=0 to 7 do begin
Zt:=cube[p*3+2]*-1;
Xt:=cube[p*3]*-1;
cube[p*3+2]:=Zt;
cube[p*3]:=Xt;
end;
end;

begin
gd:=detect; initgraph(gd,gm,'');
Zan := 0.05;
Yan := 0.05;
Xan := 0.05;
repeat
draw(15);
delay(10000);
draw(0);
rotate;
if keypressed then begin
t:=readkey;
end;  
if t='1' then xoy_xoz; if t='2' then xoz_yoz; if t='3' then xoy_yoz;
until t=#13;
closegraph;
end.
И все вроде в ней работает, но почему-то фигура раздваивается.
Не могу это исправить. Помогите пожалуйста.
Ответить