BEGIN "SIMPLE PERSPECTIVE" DEFINE EP="EXTERNAL PROCEDURE",EIP="EXTERNAL INTEGER PROCEDURE"; DEFINE CRLF="('15&'12)",REF="REFERENCE",INT="INTEGER"; EIP DINI(INT N,CH;REF INT AR;INT S); EIP DGET; EP DOPEN(INT N); EIP DPOST(INT N); EP DDONE; EIP DVECT3(REAL X1,Y1,Z1,X2,Y2,Z2); EIP DMOVE3(REAL X1,Y1,Z1); EIP DDRAW3(REAL X1,Y1,Z1); EP DPUSH(INT NAME); EP DPOP(INT NAME); EP DAPPLY(REF REAL AR;INT NAME); EP DCOMPOSE(REF REAL AR;INT NAME); REQUIRE "REL:DISSAI" LOAD!MODULE; INTEGER B;; REAL EYEX,EYEY,EYEZ,CX,CY,CZ,T,X,Y,Z; REAL ARRAY M,IDENTITY[1:4,1:4]; INTEGER ARRAY D[1:1]; OPEN(1,"TTY",0,1,1,100,B,B); DINI(4,10,D[1],0); DGET; COMMENT SET UP IDENTITY MATRIX; FOR B_1 STEP 1 UNTIL 4 DO IDENTITY[B,B]_1; COMMENT GO ROUND IN AN INFINITE LOOP; WHILE TRUE DO BEGIN "WIEV" ARRTRAN(M,IDENTITY); "THE 'P' MATRIX" M[1,1]_M[2,2]_COSD(30)/SIND(30); DAPPLY(M[1,1],0); "AND MAKE IT CURRENT TRANSFORM" COMMENT INPUT THE WIEVING POINT AND THE DIRECTION COSINES; OUTSTR("WIEVPOINT: "); EYEX_REALIN(1); EYEY_REALIN(1); EYEZ_REALIN(1); OUTSTR("LOOKING TOWARDS POINT: "); CX_REALIN(1)-EYEX; CY_REALIN(1)-EYEY; CZ_REALIN(1)-EYEZ; T_SQRT(CX*CX+CY*CY+CZ*CZ); "LENGTH OF THE VECTOR" CX_CX/T; CY_CY/T; CZ_CZ/T; T_SQRT(CX*CX+CZ*CZ); COMMENT NOW MAKE R1; ARRTRAN(M,IDENTITY); "THIS IS ACTUALLY R2" M[2,2]_M[3,3]_T; M[3,2]_-(M[2,3]_CY); DCOMPOSE(M[1,1],0); COMMENT THIS IS R1 THOUGH; ARRTRAN(M,IDENTITY); M[1,1]_M[3,3]_-CZ/T; M[3,1]_-(M[1,3]_CX/T); DCOMPOSE(M[1,1],0); COMMENT THE CONCATENATION OF T AND L; ARRTRAN(M,IDENTITY); M[3,3]_-1; M[4,1]_-EYEX; M[4,2]_-EYEY; M[4,3]_EYEZ; DCOMPOSE(M[1,1],0); "COCLUDES THE TRANSFORMS" BEGIN "FIGURE" DOPEN(1); FOR Z_-1,0 DO BEGIN DMOVE3(-0.5,-1,Z); DDRAW3(-0.5,1,Z); DDRAW3(0,2,Z); DDRAW3(0.5,1,Z); DDRAW3(0.5,-1,Z); DDRAW3(-0.5,-1,Z); END; FOR X_-0.5,0.5 DO FOR Y_-1,1 DO BEGIN DMOVE3(X,Y,-1); DDRAW3(X,Y,0); END; DVECT3(0,2,-1,0,2,0); COMMENT NEXT BODY OF THE CHURCH; FOR Z_0,1.5 DO BEGIN DMOVE3(-1,-1,Z); DDRAW3(-1,0,Z); DDRAW3(0,0.5,Z); DDRAW3(1,0,Z); DDRAW3(1,-1,Z); DDRAW3(-1,-1,Z); END; FOR X_-1,1 DO FOR Y_-1,0 DO BEGIN DMOVE3(X,Y,0); DDRAW3(X,Y,1.5); END; DVECT3(0,0.5,0,0,0.5,1.5); FOR X_1,1.5 DO BEGIN DMOVE3(X,-1,0.5); DDRAW3(X,-0.5,0.5); DDRAW3(X,-0.25,0.75); DDRAW3(X,-0.5,1); DDRAW3(X,-1,1); DDRAW3(X,-1,0.5); END; FOR Z_0.5,1 DO FOR Y_-1,-0.5 DO BEGIN DMOVE3(1,Y,Z); DDRAW3(1.5,Y,Z); END; DVECT3(1,-0.25,0.75,1.5,-0.25,0.75); DPOST(1); DDONE; END "FIGURE"; END "WIEV"; END;