›100 GRAPHICS 0›110 ? "***************************"›120 ? "* 3-D IMAGE PLOT SYSTEM *"›130 ? "* BY TOM HUDSON *"›140 ? "* ANALOG COMPUTING # 16 *"›150 ? "***************************"›160 DIM A$(5),F$(20),DMA$(1),O$(1),EG$(2),IN$(1),B$(14):EG$=CHR$(27):EG$(2)=CHR$(7)›170 XL=0:XR=319:YT=0:YB=191:OFF=40000›180 ? :? "DMA OFF";:INPUT DMA$:IF DMA$<>"Y" AND DMA$<>"N" THEN 180›190 ? :? "OUTPUT TO PLOTTER";:INPUT O$:IF O$<>"Y" AND O$<>"N" THEN 190›200 IF O$="N" THEN 215›210 TRAP 190:CLOSE #3:OPEN #3,8,0,"P":? #3;EG$;"*H*I*M0,-300*I":PC=0›212 REM *** INPUT SLIDE FILE NAME TO SAVE SCREEN *** ›215 ? :? "ENTER SLIDE FILE TO SAVE";:INPUT B$›220 ? :? "FILE OR KEYBOARD INPUT";:INPUT A$:IF A$="F" THEN 1100›230 IF A$<>"K" THEN 220›240 ? :? "HOW MANY POINTS ARE THERE";:INPUT PS›250 DIM X(PS),Y(PS),Z(PS),P(PS,2),VIS(PS)›260 ? "ENTER X,Y,Z COORDINATES FOR EACH POINT"›270 FOR I=1 TO PS:? "POINT ";I;:INPUT Q1,Q2,Q3:X(I)=Q1:Y(I)=Q2:Z(I)=Q3:NEXT I›280 ? :? "HOW MANY LINES ARE THERE";:INPUT LS:DIM LN(LS,1)›290 ? :? "NOW ENTER POINT INFORMATION"›300 ? "FOR EACH LINE."›310 FOR I=1 TO LS:? :? "LINE ";I:? "FROM POINT";:INPUT Q1:LN(I,0)=Q1:? " TO POINT";:INPUT Q1:LN(I,1)=Q1:NEXT I›320 ? :? "DO YOU WANT TO SAVE THIS OBJECT";:INPUT A$:IF A$="Y" THEN 1250›330 IF A$<>"N" THEN 320›340 REM ***************************›350 REM * TIME FOR NEW PLOT *›360 REM ***************************›370 ? :? "ENTER OBSERVER LOCATION X,Y,Z"›380 ? "OR E FOR EDIT":TRAP 1340›390 ZOOM=1›400 INPUT OX,OY,OZ›410 ? :? "ENTER COORDINATES LOOKED AT X,Y,Z"›420 TRAP 410:INPUT VX,VY,VZ›430 ? :? "ENTER ZOOM FACTOR":TRAP 430:INPUT ZOOM:TRAP OFF›440 X(0)=VX:Y(0)=VY:Z(0)=VZ›450 D0=1:IF DMA$="Y" THEN POKE 559,0›460 REM ***************************›470 REM * CALCULATE PERSPECTIVE *›480 REM ***************************›490 DX=VX-OX:DY=VY-OY:DZ=VZ-OZ›500 U1=SQR(DX*DX+DY*DY+DZ*DZ):IF U1=0 THEN U1=1E-06›510 CX=DX/U1:CY=DY/U1:CZ=DZ/U1›520 S3=SQR(1-CZ*CZ):S2=SQR(1-CY*CY)›530 QX=OX+D0*CX:QY=OY+D0*CY:QZ=OZ+D0*CZ›540 FOR I=0 TO PS:XW=X(I):YW=Y(I):ZW=Z(I):GOSUB 610:NEXT I›550 FOR I=0 TO PS:IF VIS(I)=0 THEN 570›560 XW=X(I):YW=Y(I):ZW=Z(I):GOSUB 610:GOSUB 670›570 NEXT I:GOTO 740›580 REM ***************************›590 REM * IS THE POINT VISIBLE? *›600 REM ***************************›610 VIS(I)=1:VCX=XW-OX:VCY=YW-OY:VCZ=ZW-OZ›620 IF DX*VCX+DY*VCY+DZ*VCZ>0 THEN RETURN ›630 VIS(I)=0:RETURN ›640 REM ***************************›650 REM * NOW CALC PLOT COORDS *›660 REM ***************************›670 K=D0/(VCX*CX+VCY*CY+VCZ*CZ)›680 AX=OX+K*VCX:AY=OY+K*VCY:AZ=OZ+K*VCZ›690 IF S3=0 THEN 720›700 P(I,1)=((AX-QX)*CY-(AY-QY)*CX)/S3›710 P(I,2)=(AZ-QZ)/S3:RETURN ›720 P(I,1)=((QX-AX)*CZ+(AZ-QZ)*CX)/S2›730 P(I,2)=(AY-QY)/S2:RETURN ›740 REM ***************************›750 REM * SCALE THE IMAGE *›760 REM ***************************›770 T=450*ZOOM:FOR I=0 TO PS›780 P(I,1)=P(I,1)*T›790 P(I,2)=P(I,2)*T›800 NEXT I›810 XAD=160-P(0,1):YAD=96-P(0,2):FOR I=1 TO PS:P(I,1)=P(I,1)+XAD:P(I,2)=P(I,2)+YAD:NEXT I›820 REM ***************************›830 REM * NOW DRAW THE IMAGE! *›840 REM ***************************›850 GRAPHICS 24:SETCOLOR 2,0,0:COLOR 1:TRAP OFF›860 IF O$="Y" THEN ? #3;"M0,0*D480,0*D480,288*D0,288*D0,0"›870 FOR I=1 TO LS:TV=VIS(LN(I,0))+VIS(LN(I,1)):IF TV=0 THEN 1010›880 IF TV=2 THEN 980›890 QT=0:ISAVE=I:IF VIS(LN(I,0))=0 THEN I1=LN(I,0):I2=LN(I,1):I=LN(I,0):GOTO 910›900 I1=LN(I,1):I2=LN(I,0):I=LN(I,1)›910 XT1=X(I1):YT1=Y(I1):ZT1=Z(I1):XT2=X(I2):YT2=Y(I2):ZT2=Z(I2):FV=0:FH=0›920 XW=(XT1+XT2)/2:YW=(YT1+YT2)/2:ZW=(ZT1+ZT2)/2:GOSUB 610›930 IF VIS(I)>0 THEN XT2=XW:YT2=YW:ZT2=ZW:GOTO 950›940 XT1=XW:YT1=YW:ZT1=ZW›950 QT=QT+1:IF QT<15 THEN 920›960 XW=XT2:YW=YT2:ZW=ZT2:GOSUB 610›970 GOSUB 670:P(I,1)=P(I,1)*T+XAD:P(I,2)=P(I,2)*T+YAD:VIS(I)=0:I=ISAVE›980 X1=P(LN(I,0),1):Y1=191-P(LN(I,0),2):X2=P(LN(I,1),1):Y2=191-P(LN(I,1),2):GOSUB 1550›990 IF O$="N" OR POK=0 THEN 1010›1000 ? #3;"M";X1*1.5;",";(191-Y1)*1.5;"*D";XW*1.5;",";(191-YW)*1.5:PC=PC+1›1010 NEXT I›1020 IF PC>0 THEN ? #3;"H*M0,-300*I":PC=0›1030 FOR X=15 TO 0 STEP -1:SOUND 0,128,10,X:NEXT X›1032 REM *** HIT SPACE BAR TO SAVE SCREEN *** ›1035 IF PEEK(764)<>33 THEN 1040›1037 POKE 764,255:GOSUB 10000›1040 IF PEEK(53279)=7 AND STRIG(0)=1 THEN 1035›1050 GRAPHICS 0:? "LAST PARAMETERS:"›1060 ? :? "OBSERVER: ";OX;",";OY;",";OZ:? "VIEWPOINT:";VX;",";VY;",";VZ:? "ZOOM:";ZOOM›1065 ? :? "ENTER NEW SLIDE FILE";:INPUT B$›1068 GOTO 340›1070 REM ***************************›1080 REM * LOAD 3-D IMAGE FILE *›1090 REM ***************************›1100 CLOSE #1:? :? "ENTER FILENAME TO LOAD";:INPUT F$:TRAP 1200:OPEN #1,4,0,F$:TRAP 1180›1110 INPUT #1,PS:DIM X(PS),Y(PS),Z(PS),P(PS,2),VIS(PS)›1120 FOR X=1 TO PS:INPUT #1,Q1:X(X)=Q1:NEXT X›1130 FOR X=1 TO PS:INPUT #1,Q1:Y(X)=Q1:NEXT X›1140 FOR X=1 TO PS:INPUT #1,Q1:Z(X)=Q1:NEXT X›1150 INPUT #1,LS:DIM LN(LS,1)›1160 FOR X=1 TO LS:INPUT #1,Q1:LN(X,0)=Q1:INPUT #1,Q1:LN(X,1)=Q1:NEXT X›1170 CLOSE #1:TRAP OFF:GOTO 340›1180 ? :? "}FILE FORMAT ERROR!":GOTO 1210›1190 ? :? "}I/O ERROR - ";PEEK(195):GOTO 1210›1200 ? :? "}CAN'T OPEN FILE!"›1210 ? "PRESS RETURN":INPUT IN$:RUN ›1220 REM ***************************›1230 REM * SAVE 3-D IMAGE FILE *›1240 REM ***************************›1250 CLOSE #1:? "ENTER FILENAME TO SAVE";:INPUT F$:TRAP 1210:OPEN #1,8,0,F$:TRAP 1190›1260 ? #1;PS›1270 FOR X=1 TO PS:? #1;X(X):NEXT X›1280 FOR X=1 TO PS:? #1;Y(X):NEXT X›1290 FOR X=1 TO PS:? #1;Z(X):NEXT X›1300 ? #1;LS:FOR X=1 TO LS:? #1;LN(X,0):? #1;LN(X,1):NEXT X:GOTO 1170›1310 REM ***************************›1320 REM * EDIT THE 3-D IMAGE DATA *›1330 REM ***************************›1340 TRAP OFF:? :? "PRINT, EDIT OR QUIT";:INPUT A$:IF A$="E" THEN 1410›1350 IF A$="Q" THEN 340›1360 IF A$<>"P" THEN 1340›1370 TRAP 1340:LPRINT "POINTS:";PS:LPRINT ›1380 FOR X=1 TO PS:LPRINT "POINT ";X;": ";X(X),Y(X),Z(X):NEXT X:LPRINT ›1390 LPRINT "LINES:";LS:LPRINT ›1400 FOR X=1 TO LS:LPRINT "LINE ";X;": ";LN(X,0);" TO ";LN(X,1):NEXT X:LPRINT :GOTO 1340›1410 TRAP OFF:? :? "EDIT POINT OR LINE OR EXIT";:INPUT A$:IF A$="L" THEN 1480›1420 IF A$="E" THEN 320›1430 IF A$<>"P" THEN 1410›1440 ? :? "ENTER POINT# OR RETURN";:TRAP 1410:INPUT PT:IF PT>PS OR PT<0 THEN 1440›1450 ? :? "X=";X(PT),"Y=";Y(PT),"Z=";Z(PT)›1460 ? :? "ENTER NEW X,Y,Z OR RETURN":TRAP 1410›1470 INPUT Q1,Q2,Q3:X(PT)=Q1:Y(PT)=Q2:Z(PT)=Q3:GOTO 1410›1480 ? :? "ENTER LINE# OR RETURN";:TRAP 1410:INPUT LN:IF LN>LS OR LN<0 THEN 1480›1490 ? :? "FROM POINT:";LN(LN,0):? " TO POINT:";LN(LN,1)›1500 ? :? "ENTER NEW LINE POINTS OR RETURN":TRAP 1410›1510 ? "FROM POINT:";:INPUT Q1:IF Q1>PS THEN 1510›1520 LN(LN,0)=Q1›1530 ? " TO POINT:";:INPUT Q1:IF Q1>PS THEN 1530›1540 LN(LN,1)=Q1:GOTO 1410›1550 REM ***************************›1560 REM * GRAPHICS CLIP ROUTINE *›1570 REM ***************************›1580 L1=0:L2=0:R1=0:R2=0:T1=0:T2=0:B1=0:B2=0:POK=0›1590 IF X1XR THEN R1=1›1610 IF Y1>YB THEN B1=1:GOTO 1630›1620 IF Y1XR THEN R2=1›1650 IF Y2>YB THEN B2=1:GOTO 1670›1660 IF Y2XR OR Y1YB OR XWXR OR YWYB THEN RETURN ›1720 PLOT X1,Y1:DRAWTO XW,YW:POK=1:RETURN ›1730 IF L1+T1+B1+R1=0 THEN XW=X3:YW=Y3:RETURN ›1740 IF L1 THEN XW=XL:YW=Y3+(Y4-Y3)*(XL-X3)/(X4-X3):X3=XW:Y3=YW:IF Y3>=YT AND Y3<=YB THEN RETURN ›1750 IF R1 THEN XW=XR:YW=Y3+(Y4-Y3)*(XR-X3)/(X4-X3):X3=XW:Y3=YW:IF Y3>=YT AND Y3<=YB THEN RETURN ›1760 IF B1 THEN YW=YB:XW=X3+(X4-X3)*(YB-Y3)/(Y4-Y3):X3=XW:Y3=YW:IF X3>=XR AND X3<=XL THEN RETURN ›1770 IF T1 THEN YW=YT:XW=X3+(X4-X3)*(YT-Y3)/(Y4-Y3):X3=XW:Y3=YW›1780 RETURN ›9960 REM ***************************›9970 REM * SAVE LATEST SCREEN TO *›9980 REM * LATEST .PIC FILENAME *›9990 REM ***************************›10000 OPEN #1,8,128,B$›10010 RTOP=256*PEEK(106):BASE=PEEK(88)+256*PEEK(89):BTS=RTOP-BASE:HI=INT(BTS/256):LO=BTS-(HI*256)›10020 POKE 850,11:POKE 852,PEEK(88):POKE 853,PEEK(89):POKE 856,LO:POKE 857,HI›10030 DUM=USR(ADR("hhh*LVd"),16):CLOSE #1›10040 FOR X=15 TO 0 STEP -1:SOUND 0,128,10,X:NEXT X›10050 RETURN ››Current unit: 11 (SOUND/GRAPHICS #2)›Download options: D,E,H,L,R,S,U or ?x›>