5 '3DOBJT.BA by James Yi/Aug. 16,1986 8 'Each coordinate is represented by X(width), Y(length), and Z(depth) 9 'If a new line is drawn at the coordinate, X of that coord. has 1000 or -1000 added to it. 10 CLS:PRINT"Wait 20 seconds.":MAXFILES=2:PI=ATN(1)*4 15 XC=120:YC=64:YM=63:IFPEEK(61983)=PEEK(61983)THENYM=31:YC=32 20 DIMS(360),C(360):FORL=0TO45:A=SIN(L*PI/180):B=COS(L*PI/180):S(L)=A:C(L)=B:S(90-L)=B:C(90-L)=A:S(L+90)=B:C(L+90)=-A 30 S(180-L)=A:C(180-L)=-B:S(180+L)=-A:C(180+L)=-B:S(270-L)=-B:C(270-L)=-A:S(270+L)=-B:C(270+L)=A:S(360-L)=-A:C(360-L)=B:NEXT 40 MG=1:ZF=10 90 GOTO500 100 PRINT"Viewing angles must be 0 to 360":PRINT 105 PRINT"Press enter to use default.":PRINT:INPUT"X axis";XR:INPUT"Y axis";YR:INPUT"Z axis";ZR:GOTO500 108 CLS:REM View 110 ONERRORGOTO180:OPENO$FORINPUTAS1:ONERRORGOTO190 114 IFEOF(1)THENCLOSE:GOTO150 116 INPUT#1,X,Y,Z:IFABS(X)>999THENX=X-SGN(X)*1000:X=X+XH:Y=Y+YH:Z=Z+ZH:GOSUB300:PX=X:PY=Y:GOTO114 120 X=X+XH:Y=Y+YH:Z=Z+ZH:GOSUB300:GOSUB320:PX=X:PY=Y:GOTO114 150 GOSUB697:GOTO500 180 PRINT"Object file not found.":RESUME195 190 PRINT"If number of data items in object file equals 3*number of coordinates and all" 191 PRINT"three rotation angles range from 0-360" 192 PRINT"then there's a program error. Contact James Yi/73327,1653 and describe the symptoms and when they occur.":END 195 BEEP:CLOSE:FORL=0TO700:NEXT:GOTO500 300 F=Z:Z=C(XR)*Z+Y*S(XR):Y=Y*C(XR)-F*S(XR):F=X:X=X*C(YR)+Z*S(YR):Z=Z*C(YR)-F*S(YR):F=X:X=X*C(ZR)+Y*S(ZR):Y=Y*C(ZR)-F*S(ZR) 310 IFABS(Z*ZF/3000)>1THENX=0:Y=0:RETURN 315 X=INT(X-X*Z*ZF/3000)*MG:Y=INT(Y-Y*Z*ZF/3000)*MG:RETURN 320 IFABS(PX)>119ORABS(PY)>YMTHENIFABS(X)>119ORABS(Y)>YMTHEN700ELSEGOSUB450:LINE-(XC+X,YC-Y):RETURN 330 PSET(XC+PX,YC-PY):IFABS(X)>119ORABS(Y)>YMTHEN400ELSELINE-(XC+X,YC-Y):RETURN 400 XL=X-PX:YL=Y-PY:XS=SGN(XL):YS=SGN(YL):IFXS=0THENIFYS=0THENRETURNELSELINE-(XC+X,YC-YS*YM):RETURN 402 IFYS=0THENIFXS=0THENRETURNELSELINE-(XC+XS*119,YC-Y):RETURN 404 XB=XS*119-PX:YB=YS*YM-PY:IFABS(PY+YL*XB/XL)>YMTHENLINE-(XC+PX+XL*YB/YL,YC-YS*YM)ELSELINE-(XC+119*XS,YC-(PY+YL*XB/XL)) 405 RETURN 450 XL=PX-X:YL=PY-Y:XS=SGN(XL):YS=SGN(YL):IFXS=0THENIFYS=0THENRETURNELSE:PSET(XC+PX,YC-YS*YM):RETURN 455 IFYS=0THENIFXS=0THENRETURNELSEPSET(XC+XS*119,YC-PY):RETURN 460 XB=XS*119-X:YB=YS*YM-Y:IFABS(Y+YL*XB/XL)>YMTHENPSET(XC+X+XL*YB/YL,YC-YS*YM)ELSEPSET(XC+119*XS,YC-(Y+YL*XB/XL)) 465 RETURN 500 ONERRORGOTO190:CLS:PRINT"1) View object";TAB(25);":Default:":PRINT"2) Rotate object";TAB(24);XR;YR;ZR 502 PRINT"3) Change magnification";TAB(24);MG:PRINT"4) Change Distance scale";TAB(24);ZF:PRINT"5) Shift object center";TAB(24); 505 PRINTXH;YH;ZH:PRINT"6) Choose object";TAB(25);O$:PRINT"7) Create object":PRINT"8) Edit object";TAB(20);"9) Exit" 510 GOSUB697:IFVAL(K$)=0THEN510 520 ONVAL(K$)GOTO108,100,560,570,580,550,600,650,590:GOTO510 550 FILES:INPUT"Object file";O$:GOTO500 560 INPUT"Magnify how many times(0 to ?)";MG:GOTO500 570 INPUT"Distance per dot(0 to ?)";ZF:GOTO500 580 PRINT"Object's center can be shifted by -? to ?":INPUT"X ";XH:INPUT"Y ";YH:INPUT"Z ";ZH:GOTO500 590 MENU 600 CLS:INPUT"Object name";O$:OPENO$FOROUTPUTAS1:CO=0 610 PRINT"ext egin new line uit" 615 GOSUB697:IFK$="n"ORK$="N"THEN620ELSEIFK$="b"ORK$="B"THEN620ELSEIFK$="q"ORK$="Q"THEN640ELSE615 620 CO=CO+1:PRINT"Coordinate #";CO 630 INPUT"X,Y,Z";X,Y,Z:IFK$="b"ORK$="B"THENIFX=0THENX=1000ELSEX=X+1000*SGN(X) 635 PRINT#1,X;Y;Z:GOTO610 640 CLOSE:GOTO500 650 ONERRORGOTO180:EF$="editfl.do":OPENO$FORINPUTAS1:OPENEF$FOROUTPUTAS2:ONERRORGOTO190:CO=0:GOSUB695:CLOSE 652 OPENO$FOROUTPUTAS2:OPENEF$FORINPUTAS1 653 CO=CO+1 655 IFEOF(1)THEN690ELSEINPUT#1,X,Y,Z 660 PRINT"xt hnge nsrt lete dd t":PRINT"Coordinate #";CO;": "X;Y;Z 665 GOSUB697:IFK$="n"ORK$="N"THEN670ELSEIFK$="C"ORK$="c"THEN675ELSEIFK$="i"ORK$="I"THEN680 667 IFK$="a"ORK$="A"THEN684ELSEIFK$="D"ORK$="d"THEN655ELSEIFK$="q"ORK$="Q"THENPRINT#2,X;Y;Z:GOSUB695:GOTO690 668 GOTO665 670 PRINT#2,X;Y;Z:GOTO653 675 INPUT"X,Y,Z";X,Y,Z:PRINT#2,X;Y;Z:GOTO653 680 INPUT"X,Y,Z";XT,YT,ZT:PRINT#2,XT;YT;ZT:CO=CO+1:GOTO660 684 CO=CO+1:PRINT#2,Z;Y;Z:IFEOF(1)THEN687ELSEINPUT#1,X,Y,Z:GOTO684 685 PRINT"ore uit" 686 GOSUB697:IFK$="m"ORK$="M"THEN687ELSEIFK$="Q"ORK$="q"THEN690 687 PRINT"Coordinate #";CO:INPUT"X,Y,Z";X,Y,Z:PRINT#2,X;Y;Z:CO=CO+1:GOTO685 690 PRINT"End of data.":CLOSE:KILLEF$:GOTO500 695 IFEOF(1)THENRETURNELSEINPUT#1,X,Y,Z:PRINT#2,X;Y;Z:GOTO695 697 K$=INKEY$:IFK$=""THEN697ELSERETURN 700 IFX<-119ANDPX<-119ORX>119ANDPX>119ORY<-YMANDPY<-YMORY>YMANDPY>YMTHENRETURN 702 XL=X-PX:YL=Y-PY:XS=SGN(XL):YS=SGN(YL):XB=-(XS*119+PX):YB=-(PY+YS*YM):IFXS=0ANDYS=0THENRETURN 704 IFXS=0THENLINE(XC+X,YC-YS*YM)-(XC+X,YC+YS*YM):RETURN 706 IFYS=0THENLINE(XC+XS*119,YC-Y)-(XC-XS*119,YC-Y):RETURN 708 IFABS(PX)>119THEN720 710 NX=PX+XL*YB/YL:IFABS(NX)<120THENPSET(XC+NX,YC+YS*YM)ELSERETURN 712 XN=NX+2*YM*XL/ABS(YL):IFABS(XN)<120THENLINE-(XC+XN,YC-YS*YM)ELSELINE-(XC+XS*119,YC-(-YS*YM+(XS*119-NX)*YL/XL)) 714 RETURN 720 NY=PY+YL*XB/XL:IFABS(NY)YMTHEN710ELSERETURN 722 YN=NY+2*119*YL/ABS(XL):IFABS(YN)