1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Нужно построить 3d модели на TP. Пошарил по сети, нашел этот пример. Помогите разобраться (хоть откомментировать), а то с процедурным не оч, а сдавать скоро, копипаст не хотелось бы нести.
Uses Graph, Crt;
Const N=8; M=12;
Type Coord = record X,Y,Z : Real; End;
Rebro = record B,E,C : Word; End;
Var grDriver : Integer; grMode : Integer; A : Array [1..N] of Coord; B : Array [1..M] of Rebro; Key : Char; I : Byte; L,C : Coord; Ux, Uy, Uz : Real;
Procedure Tr3d(P,T:Coord; Var R:Coord); Type Matrix = Array [1..4,1..4] Of Real; Var I,J : Byte; O : Matrix; Begin For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1 Else O[I,J] := 0;
Procedure Sr3d(P,S:Coord; Var R:Coord); Type Matrix = Array [1..4,1..4] Of Real; Var I,J : Byte; O : Matrix; Begin For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1 Else O[I,J] := 0;
Procedure UX3d(P:Coord; Teta:Real; Var R:Coord); Type Matrix = Array [1..4,1..4] Of Real; Var I,J : Byte; O : Matrix; Begin For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1 Else O[I,J] := 0; O[2,2] := COS(Teta); O[2,3] := -SIN(Teta); O[3,2] := SIN(Teta); O[3,3] := COS(Teta);
Procedure UY3d(P:Coord; Teta:Real; Var R:Coord); Type Matrix = Array [1..4,1..4] Of Real; Var I,J : Byte; O : Matrix; Begin For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1 Else O[I,J] := 0; O[1,1] := COS(Teta); O[1,3] := -SIN(Teta); O[3,1] := SIN(Teta); O[3,3] := COS(Teta);
Procedure UZ3d(P:Coord; Teta:Real; Var R:Coord); Type Matrix = Array [1..4,1..4] Of Real; Var I,J : Byte; O : Matrix; Begin For I := 1 To 4 Do For J := 1 To 4 Do If I = J Then O[I,J] := 1 Else O[I,J] := 0; O[1,1] := COS(Teta); O[1,2] := -SIN(Teta); O[2,1] := SIN(Teta); O[2,2] := COS(Teta);
Procedure Draw3D; Var I : Byte; XB, YB, XE, YE : Real; Begin For I := 1 To M Do Begin SetColor(B[I].C); XB := A[B[I].B].X; YB := A[B[I].B].Y; XE := A[B[I].E].X; YE := A[B[I].E].Y; Line( Trunc(XB), Trunc(YB), Trunc(XE), Trunc(YE) ); End; End;
Procedure Hide3D; Var I : Byte; XB, YB, XE, YE : Real; Begin SetColor(Black); For I := 1 To M Do Begin XB := A[B[I].B].X; YB := A[B[I].B].Y; XE := A[B[I].E].X; YE := A[B[I].E].Y; Line( Trunc(XB), Trunc(YB), Trunc(XE), Trunc(YE) ); End; End;
Begin ClrScr;
WriteLn('1-2 ‚вращение по оси OZ'); WriteLn('3-4 ‚вращение по оси OY'); WriteLn('5-6 ‚вращение по оси OX'); WriteLn('7-8 приблизить\отдалить');
ReadLn;
Fig;
C.X := 5; C.Y := 5; C.Z := 5; For I := 1 To N Do Sr3d(A[I], C, A[I]); L.X := 200; L.Y := 200; L.Z := 200; For I := 1 To N Do Tr3d(A[I], L, A[I]);
Это не очень удачный пример. Глупо преобразовывать всё пространство, когда все преобразования можно хранить в специальной матрице. Тут были попытки так сделать (матрица заводится и заполняется внутри процедуры), но они абсолютно бессмысленные, видимо автор "слышал звон, да не знает где он". В общем, на эту тему лучше почитайте http://pmg.org.ru/basic3d/index.html
а хоть какой-то комментарий к коду можно? а то я балдею от разбора, графикой в принципе никогда не занимался ЗЫ за ссылку спасиб, довольно просто написано, сижу, изучаю)