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 X1<XL THEN L1=1:GOTO 16101600 IF X1>XR THEN R1=11610 IF Y1>YB THEN B1=1:GOTO 16301620 IF Y1<YT THEN T1=11630 IF X2<XL THEN L2=1:GOTO 16501640 IF X2>XR THEN R2=11650 IF Y2>YB THEN B2=1:GOTO 16701660 IF Y2<YT THEN T2=11670 IF L1+L2=2 OR R1+R2=2 OR T1+T2=2 OR B1+B2=2 THEN RETURN 1680 X3=X1:Y3=Y1:X4=X2:Y4=Y2:GOSUB 17301690 L1=L2:R1=R2:T1=T2:B1=B21700 X1=XW:Y1=YW:X3=X2:Y3=Y2:X4=X1:Y4=Y1:GOSUB 17301710 IF X1<XL OR X1>XR OR Y1<YT OR Y1>YB OR XW<XL OR XW>XR OR YW<YT OR YW>YB 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>