Страница 1 из 1
Если кто помнит Паскаль
Добавлено: 20 окт 2005, 12:58
Frits
Здравствуйте, Подскажите пожалуйста как отображать фигуру одновременно относительно плоскостей XOZ и YOZ, XOZ и XOY, XOY и YOZ.Отражение должно быть реализовано с использованием матричных преобразовании над объектом. Спасибо за помощь.
Добавлено: 20 окт 2005, 14:22
Eugie
А при чем здесь Паскаль?
Добавлено: 20 окт 2005, 14:55
Frits
Задание целиком звучит так: Составить программу на языке Паскаль, реализующую трехмерное преобразование с фигурой(фигура - Параллелепипед, преобразование - Отражение одновременно относительно плоскостей XOZ и YOZ, XOZ и XOY, XOY и YOZ.) Отражение должно быть реализовано с использованием матричных преобразовании над объектом.
Добавлено: 20 окт 2005, 21:01
Хыиуду
Матрица преобразований:
Относительно плоскости ХО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)
Множим вектор координат на эту матрицу, получаем новые координаты. Их отображаем.
Добавлено: 21 окт 2005, 09:58
Frits
Спасибо, а можно это в виде кода изобразить, а то я совсем Паскаль забыл, если не сложно конечно.Заранее спасибо.
Добавлено: 22 окт 2005, 12:21
Хыиуду
Матрицы можно задать приблизительно так:
Код: Выделить всё
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));
Вектора координат - исходный и модифицированный:
Потом в программе множишь vect на одну из матриц, получаешь vectmod. Как это сделать, уже не подскажу, благо с первого курса линейную алгебру забыл напрочь.
Добавлено: 22 окт 2005, 13:11
Frits
Спасибо, попробую осуществить
Добавлено: 08 дек 2005, 11:20
Frits
Есть вот такая программа по этой теме
Код: Выделить всё
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.
И все вроде в ней работает, но почему-то фигура раздваивается.
Не могу это исправить. Помогите пожалуйста.