BASIC2\3D-VIEW.BAS ·
BAS ·
7 KB ·
1980-01-01 ·
from PCPlus_Issue-20_May-1988
' *****************************************
' * 3d viewing program VERSION 4.0 *
' * *
' * Peter K Scott 1988 *
' *****************************************
LABEL initialise
DIM x(500),y(500),z(500),a(500),b(500)
scale=5:xx=4000:yy=2500
one=0:two=45:three=45
WINDOW OPEN :WINDOW FULL
SCREEN #1 GRAPHICS 8500 FIXED,5000 FIXED
ratio=YDEVICE/350
LABEL menu
GOSUB new_screen
WINDOW TITLE "** 3D VIEWING PROGRAM VERSION 4.0....P.K.SCOTT 1987 **"
SET MODE 2
SET FONT 3:SET COLOR 4
PRINT AT (10;3)POINTS (18) "OPTION 1 * ENTER A NEW SET OF DATA "
PRINT AT (10;5)POINTS (18) "OPTION 2 * LOAD AN IMAGE FROM DISC"
PRINT AT (10;7)POINTS (18) "OPTION 3 * SAVE AN IMAGE TO DISC"
PRINT AT (10;9)POINTS (18) "OPTION 4 * VIEW THE CURRENT IMAGE"
PRINT AT (10;11)POINTS(18) "OPTION 5 * PRINT-OUT COORDINATES"
PRINT AT (10;13)POINTS(18) "OPTION 6 * ADD TO COORDINATES"
PRINT AT (10;15)POINTS(18) "OPTION 7 * CHANGE COORDINATES"
PRINT AT (10;17)POINTS(18) "OPTION 8 * QUIT PROGRAM"
SET FONT 1
PRINT AT(20;19) COLOUR (1) "Please select one of the options 1-8"
PRINT AT(18;20) COLOUR (1) "Locate the pointer on the star and click"
SET MODE 1
LABEL mouse_point
WHILE BUTTON=-1:WEND
PRINT CHR$(7);
ym=YMOUSE/ratio
IF ym>=274 AND ym<=294 THEN GOTO new_data
IF ym>=245 AND ym<=265 THEN GOTO load_image
IF ym>=218 AND ym<=238 THEN GOTO save_image
IF ym>=190 AND ym<=210 THEN GOTO view_image
IF ym>=162 AND ym<=182 THEN GOTO print_coordinates
IF ym>=134 AND ym<=154 THEN GOTO add_to
IF ym>=106 AND ym<=126 THEN GOTO change_data
IF ym>=80 AND ym<=100 THEN END
GOTO mouse_point
LABEL view_image
OPTION DEGREES
IF total=0 THEN GOSUB no_data:GOTO mouse_point
WINDOW TITLE "bigger..smaller..rc..ra..higher..lower..right..left..up..down..flip..menu"
PRINT AT (1;2)
FOR i=1 TO total
IF x(i)=999 THEN a(i)=999:GOTO 2
GOSUB calculate
2 NEXT i
GOSUB new_screen
i=0
3 i=i+1
GOSUB check_screen
IF i=1 THEN MOVE a(i);b(i):GOTO 3
IF a(i)=999 THEN i=i+1:GOSUB check_screen:MOVE a(i);b(i):IF i=total+1 THEN GOTO the_end ELSE GOTO 3
GOSUB check_screen
LINE a(i-1);b(i-1),a(i);b(i)
IF i=total THEN GOTO the_end ELSE GOTO 3
4 GOTO the_end
LABEL calculate
k=x(i)-xrc
l=y(i)-yrc
n=z(i)-zrc
o=k*COS(two)+l*SIN(two)
p=-k*SIN(two)+l*COS(two)
q=-o*SIN(three)+n*COS(three)
a(i)=(p*COS(one)+q*SIN(one))*scale
b(i)=(-p*SIN(one)+q*COS(one))*scale
a(i)=xx+(a(i)*10)
b(i)=yy+(b(i)*10)
RETURN
LABEL new_data
FOR i=1 TO total
x(i)=0
y(i)=0
x(i)=0
NEXT
total=0
i=1
LABEL add_to
IF i=0 THEN GOSUB no_data:GOTO mouse_point
i=total+1
CLS
WINDOW TITLE "Press 'f' to finish and 'n' for no line"
PRINT
PRINT" PLEASE ENTER YOUR COORDINATES"
5 PRINT" Coordinate number ";i;
PRINT TAB(35);
INPUT "x=";z$;
IF z$="f" OR z$="F" THEN total=i-1:GOTO 7
IF z$="n" OR z$="N" THEN x(i)=999:PRINT:GOTO 6
x(i)=VAL(z$)
PRINT TAB(50);:INPUT "y=";y(i);
PRINT TAB(65);:INPUT "z=";z(i)
6 i=i+1
GOTO 5
7 CLS
PRINT
PRINT " ENTER THE X Y and Z VALUES FOR THE CENTRE OF ROTATION"
INPUT" x=";xrc
INPUT" y=";yrc
INPUT" z=";zrc
GOTO menu
LABEL the_end
SET COLOR 1
WHILE BUTTON=-1:WEND
PRINT CHR$(7);
IF XMOUSE>=30 AND XMOUSE <=95 THEN scale=scale+2
IF XMOUSE>=96 AND XMOUSE <=167 THEN scale=scale-2
IF scale<1 THEN scale=1
IF XMOUSE>=168 AND XMOUSE <=199 THEN two=two+15
IF XMOUSE>=200 AND XMOUSE <=230 THEN two=two-15
IF XMOUSE>=231 AND XMOUSE <=295 THEN three=three+15
IF XMOUSE>=296 AND XMOUSE <=351 THEN three=three-15
IF XMOUSE>=352 AND XMOUSE <=407 THEN xx=xx+500
IF XMOUSE>=408 AND XMOUSE <=453 THEN xx=xx-500
IF XMOUSE>=454 AND XMOUSE <=485 THEN yy=yy+500
IF XMOUSE>=486 AND XMOUSE <=534 THEN yy=yy-500
IF XMOUSE>=535 AND XMOUSE <=564 THEN two=two+180
IF XMOUSE>=565 AND XMOUSE <=614 THEN GOTO menu
GOTO view_image
LABEL check_screen
SET COLOR 2
IF a(i)<0 OR a(i)>8500 THEN GOSUB too_big:GOTO the_end
IF b(i)<0 OR b(i)>5000 THEN GOSUB too_big:GOTO the_end
RETURN
LABEL save_image
IF total=0 THEN GOSUB no_data:GOTO mouse_point
CLS
PRINT
INPUT" What do you want to call your image";name$
OPEN #3 OUTPUT name$
PRINT #3,total
FOR i=1 TO total
PRINT #3,x(i),y(i),z(i)
NEXT i
PRINT #3,xx,yy,one,two,three,xrc,yrc,zrc,scale
CLOSE
GOTO menu
LABEL load_image
CLS
FILES
PRINT
INPUT" Please type in the name of the image and press return";name$
ON ERROR GOTO error_check
OPEN #3 INPUT name$
INPUT #3,total
FOR i=1 TO total
INPUT #3,x(i),y(i),z(i)
NEXT i
INPUT #3,xx,yy,one,two,three,xrc,yrc,zrc,scale
CLOSE
GOTO view_image
LABEL print_coordinates
IF total=0 THEN GOSUB no_data:GOTO mouse_point
FOR i = 1 TO total
LPRINT "Coordinate number ";i;
IF x(i)=999 THEN LPRINT TAB(35) "NO LINE ":GOTO 8
LPRINT TAB (35) "x=";x(i);
LPRINT TAB (50) "y=";y(i);
LPRINT TAB (65) "z=";z(i)
8 NEXT i
GOTO mouse_point
LABEL change_data
IF total=0 THEN GOSUB no_data:GOTO mouse_point
CLS
PRINT
INPUT" PLEASE ENTER THE NUMBER OF THE POINT YOU WANT TO CHANGE";i
PRINT" COORDINATE NUMBER";i;" IS PRESENTLY SET AT"
IF x(i)=999 THEN PRINT " NO LINE":GOTO 9
PRINT
PRINT " x=";x(i),"y=";y(i),"z=";z(i)
9 PRINT
PRINT " ENTER THE NEW VALUES or press 'n' for NO LINE"
INPUT" x=";z$
IF z$="n" THEN x(i)=999:GOTO 10
x(i)=VAL (z$)
INPUT" y=";y(i)
INPUT" z=";z(i)
10 PRINT:PRINT" DO YOU WANT TO CHANGE ANY MORE"
11 a$=INKEY$:IF a$="" THEN 11
IF a$="y" THEN GOTO change_data
IF a$="n" THEN GOTO menu
GOTO 11
LABEL error_check
CLS
PRINT CHR$(7)
PRINT" SORRY THERE IS NO IMAGE STORED UNDER THAT NAME"
PRINT CHR$(7)
GOSUB delay
CLOSE
RESUME load_image
LABEL delay
FOR x=1 TO 5000
NEXT
RETURN
LABEL no_data
PRINT CHR$(7);
GOSUB delay
RETURN
LABEL too_big
PRINT AT (2;2) " COORDINATE OUTSIDE VIRTUAL SCREEN"
PRINT CHR$(7)
GOSUB delay
RETURN
LABEL new_screen
BOX 0;0,8500,5000 COLOUR 6 FILL WITH 5
RETURN