home *** CD-ROM | disk | FTP | other *** search
/ RBBS in a Box Volume 1 #3.1 / RBBSIABOX31.cdr / 720k / 3_dpltrt.bas < prev    next >
BASIC Source File  |  1984-07-24  |  6KB  |  171 lines

  1. 1000 '*** 3-DPLTRT.BAS *** WRITTEN FOR AN IBM PC W/GRAPHICS BOARD, ADV. BASIC
  2. 1010 '
  3. 1020 '   PLOTS THE FUNCTION Z=Z(X,Y) AND ROTATES THE SURFACE
  4. 1030 '
  5. 1040 '   NOMENCLATURE:
  6. 1050 '
  7. 1060 '   X,Y,Z      3-D COORDINATE SYSTEM; POSITIVE X RUNS HORIZONTALLY TO THE
  8. 1070 '              RIGHT; POSITIVE Z RUNS VERTICALLY UPWARD; POSITIVE Y RUNS
  9. 1080 '              PERPENDICULAR FROM THE SCREEN AND TOWARD YOU.  THE ANGLE
  10. 1090 '              OF THE Y-AXIS IN THE 2-D PLANE IS SET BY YANGLE.  THE
  11. 1100 '              ANGLE IS INITIALLY 15 DEGREES AND CORRESPONDS TO APPROX.
  12. 1110 '              THE 8 O'CLOCK POSITION.  HOWEVER, THE 2-D PLOTTING
  13. 1120 '              SUBROUTINE SCALES THE U,V COORDINATES, IE THE FINAL ANGLE
  14. 1130 '              THAT APPEARS ON YOUR SCREEN MAY NOT BE EQUAL TO YANGLE.
  15. 1140 '   U,V        2-D COORDINATE SYSTEM TO WHICH X,Y,Z ARE MAPPED INTO.
  16. 1150 '   (XMIN,YMIN), (XMAX,YMAX)   POINTS WHICH DEFINE THE EXTREMITIES OF THE
  17. 1160 '              RECTANGLE OVER WHICH FUNCTION Z IS TO BE PLOTTED.  SIMILAR
  18. 1170 '              TO DEFINING A RECTANGLE WITH BASICA: LINE(A,B)-(C,D),,B
  19. 1180 '   ZEE        FUNCTION Z.  NAMED TO PREVENT CONFUSION WITH Z COORDINATE.
  20. 1190 '   YANGLE     ANGLE OF THE Y-AXIS WITH RESPECT TO THE X-AXIS AS IT
  21. 1200 '              APPEARS IN THE 2-D PLANE.
  22. 1210 '
  23. 1220 '*** BY W. CHUCK, (7-24-84), UNDER PC-DOS V2.0, NO COMPILE W/V1.00 ***
  24. 1230 '
  25. 1240 '
  26. 1250 '--- DEFINE Z AS A FUNCTION OF X AND Y ---
  27. 1260 '
  28. 1270 '   THE FOLLOWING FUNCTION LOOKS NICE WITH XMIN=-2,YMIN=-2,XMAX=2,YMAX=2
  29. 1280 '   IGRID, JGRID=25, "Y" TO CONNECT POINTS
  30. 1290 '
  31. 1300 DEF FNZEE(X,Y)=EXP(-X*X-Y*Y)*COS(2!*(X*X+Y*Y))
  32. 1310 '
  33. 1320 '   PARAMETERS
  34. 1330 '
  35. 1340 PI=3.14159
  36. 1350 MAXMEMORY=INT(.95*FRE(0)/20)
  37. 1360 '
  38. 1370 '--- INPUTS ---
  39. 1380 '
  40. 1390 INPUT "XMIN"; XMIN
  41. 1400 INPUT "YMIN"; YMIN
  42. 1410 INPUT "XMAX"; XMAX
  43. 1420 INPUT "YMAX"; YMAX
  44. 1430 INPUT "NO. OF GRID LINES PARALLEL TO Y-AXIS"; IGRID
  45. 1440 INPUT "NO. OF GRID LINES PARALLEL TO X-AXIS"; JGRID
  46. 1450 M=IGRID*JGRID
  47. 1460 IF (M > MAXMEMORY) THEN PRINT "TOO MANY GRID LINES": GOTO 1430
  48. 1470 DIM U(M),V(M),X(M),Y(M),Z(M)
  49. 1480 INPUT "CONNECT THE POINTS (Y/N)";YN$
  50. 1490 IF (YN$="Y") OR (YN$="N") OR (YN$="y") OR (YN$="n") THEN GOTO 1530 ELSE GOTO 1480
  51. 1500 '
  52. 1510 '--- GENERATE Z=ZEE(X,Y) ---
  53. 1520 '
  54. 1530 PRINT: PRINT "PLEASE WAIT ... I'LL BEEP YOU WHEN I'M READY TO PLOT."
  55. 1540 DX=(XMAX-XMIN)/(IGRID-1): DY=(YMAX-YMIN)/(JGRID-1)
  56. 1550 N=0
  57. 1560 XA=XMIN
  58. 1570 FOR I=1 TO IGRID
  59. 1580      YA=YMIN
  60. 1590      FOR J=1 TO JGRID
  61. 1600           N=N+1
  62. 1610           X(N)=XA
  63. 1620           Y(N)=YA
  64. 1630           Z(N)=FNZEE(XA,YA)
  65. 1640           YA=YA+DY
  66. 1650      NEXT
  67. 1660      XA=XA+DX
  68. 1670 NEXT
  69. 1680 '
  70. 1690 '*** ROTATE THE SURFACE -- INCREMENT YANGLE ***
  71. 1700 '
  72. 1710 FOR YANGLE=15 TO 180 STEP 15
  73. 1720 SNY=SIN(PI*YANGLE/180): CSY=COS(PI*YANGLE/180)
  74. 1730 '
  75. 1740 '--- MAP X,Y,Z TO U,V SYSTEM ---
  76. 1750 '
  77. 1760 FOR I=1 TO M
  78. 1770      U(I)=X(I)-CSY*Y(I)
  79. 1780      V(I)=Z(I)-SNY*Y(I)
  80. 1790 NEXT
  81. 1800 '
  82. 1810 '--- CALL 2-D PLOTTING ROUTINE ---
  83. 1820 '
  84. 1830 GOSUB 2230
  85. 1840 LOCATE 25,52: PRINT "ANGLE OF Y-AXIS: ";YANGLE;
  86. 1850 '
  87. 1860 '--- CONNECT THE POINTS IF YN$="Y" ---
  88. 1870 '
  89. 1880 IF (YN$="N") OR (YN$="n") THEN GOTO 2160
  90. 1890 '
  91. 1900 '--- LINES ALONG Y-AXIS ---
  92. 1910 '
  93. 1920 FOR I=1 TO IGRID
  94. 1930      K=JGRID*(I-1)+1
  95. 1940      X1=U(K): Y1=V(K)
  96. 1950      L=K
  97. 1960      FOR J=2 TO JGRID
  98. 1970           L=L+1
  99. 1980           X2=U(L): Y2=V(L)
  100. 1990           LINE (X1,Y1)-(X2,Y2)
  101. 2000           X1=X2: Y1=Y2
  102. 2010      NEXT
  103. 2020 NEXT
  104. 2030 '
  105. 2040 '--- LINES ALONG X-AXIS ---
  106. 2050 '
  107. 2060 FOR J=1 TO JGRID
  108. 2070     X1=U(J): Y1=V(J)
  109. 2080     L=J
  110. 2090     FOR I=2 TO IGRID
  111. 2100          L=L+JGRID
  112. 2110          X2=U(L): Y2=V(L)
  113. 2120          LINE(X1,Y1)-(X2,Y2)
  114. 2130          X1=X2: Y1=Y2
  115. 2140     NEXT
  116. 2150 NEXT
  117. 2160 NEXT YANGLE
  118. 2170 LOCATE 25,20: PRINT "FINISHED";
  119. 2180 '
  120. 2190 '--- START ENDLESS LOOP ---
  121. 2200 '
  122. 2210 GOTO 2210
  123. 2220 '
  124. 2230 '*** 2-D PLOTTING SUBROUTINE ***
  125. 2240 '
  126. 2250 '   INPUT M VALUES OF U,V  NOTE: U(M) AND V(M) MUST BE PREV. DIM
  127. 2260 '
  128. 2270 '--- SEARCH FOR THE LARGEST AND SMALLEST VALUES OF U,V ---
  129. 2280 '
  130. 2290 UMAX=U(1): UMIN=U(1)
  131. 2300 VMAX=V(1): VMIN=V(1)
  132. 2310 FOR INDEX=2 TO M
  133. 2320     IF(U(INDEX) > UMAX) THEN UMAX=U(INDEX) ELSE IF(U(INDEX) < UMIN) THEN UMIN=U(INDEX)
  134. 2330     IF(V(INDEX) > VMAX) THEN VMAX=V(INDEX) ELSE IF(V(INDEX) < VMIN) THEN VMIN=V(INDEX)
  135. 2340 NEXT INDEX
  136. 2350 '
  137. 2360 '--- FORM WINDOW, SET SCREEN PARAMETERS ---
  138. 2370 '
  139. 2380 '   MODES AVAILABLE:
  140. 2390 '        IF ORIGIN=0, THEN (0,0) IS ALWAYS PLOTTED.
  141. 2400 '           ORIGIN=1, WINDOW IS DETERMINED BY THE DATA
  142. 2410 '
  143. 2420 ORIGIN=1
  144. 2430 AUX1=SGN(UMAX*UMIN)
  145. 2440 AUX2=SGN(VMAX*VMIN)
  146. 2450 IF(ORIGIN=1) GOTO 2480
  147. 2460     IF(AUX1=1) THEN IF(UMAX > 0) THEN UMIN=0 ELSE UMAX=0
  148. 2470     IF(AUX2=1) THEN IF(VMAX > 0) THEN VMIN=0 ELSE VMAX=0
  149. 2480 UMEAN=.5*(UMAX+UMIN)
  150. 2490 DU=.55*(UMAX-UMIN)
  151. 2500 VMEAN=.5*(VMAX+VMIN)
  152. 2510 DV=.55*(VMAX-VMIN)
  153. 2520 U1=UMEAN-DU: V1=VMEAN-DV
  154. 2530 U2=UMEAN+DU: V2=VMEAN+DV
  155. 2540 CLS: KEY OFF
  156. 2550 SCREEN 2
  157. 2560 VIEW
  158. 2570 WINDOW (U1,V1)-(U2,V2)
  159. 2580 '
  160. 2590 '--- DRAW U,V AXES ---
  161. 2600 '
  162. 2610 BEEP
  163. 2620 IF(ORIGIN=0 OR (AUX1 < 0 AND AUX2 < 0)) THEN LINE(U1,0)-(U2,0): LINE(0,V1)-(0,V2) ELSE LINE(U1,V1)-(U2,V1): LINE(U1,V1)-(U1,V2)
  164. 2630 '
  165. 2640 '--- PLOT POINTS ---
  166. 2650 '
  167. 2660 FOR INDEX=1 TO M
  168. 2670     PSET(U(INDEX),V(INDEX))
  169. 2680 NEXT INDEX
  170. 2690 RETURN
  171.