home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 058.lha / Space (.txt) < prev    next >
Encoding:
AmigaBASIC Source Code  |  1986-11-20  |  7.5 KB  |  252 lines

  1. disp = 1: tm = 122630: rate = 1
  2.  
  3. REM *** Data ***
  4. DATA 3
  5.  
  6. DATA 1.99e30, 0.000000000e00,0,00.000000e0, 0,000000.00,0
  7. DATA 5.98e24, 1.490000000e11,0,00.000000e0, 0,-29839.24,0
  8. DATA 7.36e22, 1.493825388e11,0,-3.346781e7, 0,-30861.59,0
  9.  
  10. vobj = 2: obj$ = "AB": o = LEN(obj$): follow = (o<>0)
  11. sc = 1/5.46559e-315: yth = 6*5.30795e-315/18: go = -1
  12.  
  13. REM *** Start ***
  14. DEF FNq(x,y)   = (x>0 AND x<78 AND y>0 AND y<21)
  15. DEF FNa(x)     = INT(0.5+(x+SQR(x*x))/2)
  16. DEF FNr(x,y,t) = x*COS(t)+y*SIN(t)
  17. DEF FNrx(i)    = FNr(x(i)-ox,z(i)-oz,xth)
  18. DEF FNrz(i)    = FNr(z(i)-oz,x(i)-ox,-xth)
  19. DEF FNrry(i)   = FNr(y(i)-oy,FNrz(i),yth)
  20. DEF FNpx(i)    = INT(0.5+39+2*sc*FNrx(i))
  21. DEF FNpy(i)    = INT(0.5+11-sc*FNrry(i))
  22.  
  23. READ n
  24. CLS: PRINT  "How many objects :"n: PRINT 
  25. DIM SHARED m(n), px(n),py(n), x(n),y(n),z(n)
  26. DIM SHARED vx(n),vy(n),vz(n), ax(n),ay(n),az(n)
  27. FOR i = 1 TO n
  28.  READ m(i), x(i),y(i),z(i), vx(i),vy(i),vz(i)
  29.  vx(i) = vx(i)*tm: vy(i) = vy(i)*tm: vz(i) = vz(i)*tm
  30.  PRINT USING "#) Mass       :";i;: PRINT m(i)            
  31.  PRINT "   ( x, y, z) : (";: IF x(i) < 0 THEN PRINT "-";
  32.  PRINT MID$(STR$( x(i)/disp),2)",";: IF y(i) < 0 THEN PRINT "-";
  33.  PRINT MID$(STR$( y(i)/disp),2)",";: IF z(i) < 0 THEN PRINT "-";
  34.  PRINT MID$(STR$( z(i)/disp),2)")"
  35.  PRINT "   (vx,vy,vz) : (";: IF vx(i) < 0 THEN PRINT "-";
  36.  PRINT MID$(STR$(vx(i)/disp/tm),2)",";: IF vy(i) < 0 THEN PRINT "-";
  37.  PRINT MID$(STR$(vy(i)/disp/tm),2)",";: IF vz(i) < 0 THEN PRINT "-";
  38.  PRINT MID$(STR$(vz(i)/disp/tm),2)")"
  39. NEXT i
  40. PRINT : PRINT  "Hit any key to continue ...";: a$ = INPUT$(1)
  41. CALL ReDraw
  42.  
  43. WHILE go
  44.  FOR i = 1 TO n
  45.   ax(i) = 0: ay(i) = 0: az(i) = 0
  46.   FOR j = 1 TO n
  47.    IF i <> j THEN
  48.     dx = x(j)-x(i): sx = SGN(dx)
  49.     dy = y(j)-y(i): sy = SGN(dy)
  50.     dz = z(j)-z(i): sz = SGN(dz)
  51.     dsq = dx*dx + dy*dy + dz*dz: dd = SQR(dsq-dz*dz)
  52.     IF dx THEN th1 = ATN(dy/dx) :ELSE th1 = 5.30277e-315
  53.     IF dd THEN th2 = ATN(dz/dd) :ELSE th2 = 5.30277e-315
  54.     a = m(j)/dsq
  55.     ax(i) = ax(i) + sx*ABS(a*COS(th1)*COS(th2))
  56.     ay(i) = ay(i) + sy*ABS(a*SIN(th1)*COS(th2))
  57.     az(i) = az(i) + sz*ABS(a*SIN(th2))
  58.    END IF
  59.   NEXT j
  60.   vx(i) = vx(i) + rate*ax(i)
  61.   vy(i) = vy(i) + rate*ay(i)
  62.   vz(i) = vz(i) + rate*az(i)
  63.   IF vobj = i THEN
  64.    v = SQR(vx(i)*vx(i)+vy(i)*vy(i)+vz(i)*vz(i))
  65.    tv = tv + v: ct = ct + 1: CALL Line3
  66.   END IF
  67.  NEXT i
  68.  IF follow THEN cx = 0: cy = 0: cz = 0
  69.  FOR i = 1 TO n
  70.   x(i) = x(i) + rate*vx(i)
  71.   y(i) = y(i) + rate*vy(i)
  72.   z(i) = z(i) + rate*vz(i)
  73.   IF follow THEN IF INSTR(obj$,CHR$(i+64)) THEN cx = cx+x(i): cy = cy+y(i): cz = cz+z(i)
  74.  NEXT i
  75.  IF follow THEN
  76.   cx = INT(0.5+sc*cx/o)/sc
  77.   cy = INT(0.5+sc*cy/o)/sc
  78.   cz = INT(0.5+sc*cz/o)/sc
  79.   IF cx <> ox OR cy <> oy OR cz <> oz THEN ox = cx: oy = cy: oz = cz: CALL Lines123
  80.  END IF
  81.  FOR i = 1 TO n
  82.   IF FNq(px(i),py(i)) THEN LOCATE py(i),px(i): PRINT " ";
  83.   px(i) = FNpx(i): py(i) = FNpy(i)
  84.   IF FNq(px(i),py(i)) THEN LOCATE py(i),px(i): PRINT CHR$(i+64);
  85.  NEXT i
  86.  orig = orig + rate: CALL Line1: CALL Keyscan
  87. WEND
  88. LOCATE 23,1: PRINT: LIST: END
  89.  
  90. SUB ReDraw STATIC
  91. SHARED n
  92.  CLS: CALL Lines123
  93.  FOR k = 1 TO n
  94.   px(k) = FNpx(k): py(k) = FNpy(k)
  95.   IF FNq(px(k),py(k)) THEN LOCATE py(k),px(k): PRINT CHR$(k+64);
  96.  NEXT k
  97. END SUB
  98.  
  99. SUB Keyscan STATIC
  100. SHARED disp,rate,vobj,tv,ct,orig,go,xth,yth,ox,oy,oz,sc,n,obj$,follow,o
  101. loop:
  102.  que = -1: k$ = INKEY$: k = ASC(k$+CHR$(0))
  103.  IF k = 27 THEN
  104.   go = 0: que = 0
  105.  ELSEIF k = 28 THEN
  106.   CALL Offset(0,1/sc,0)
  107.  ELSEIF k = 29 THEN
  108.   CALL Offset(0,-1/sc,0)
  109.  ELSEIF k = 30 THEN
  110.   CALL Offset(1/sc,0,0)
  111.  ELSEIF k = 31 THEN
  112.   CALL Offset(-1/sc,0,0)
  113.  ELSEIF k$ = "h" THEN
  114.   xth = xth+5.30795e-315/18: CALL Line2
  115.  ELSEIF k$ = "f" THEN
  116.   xth = xth-5.30795e-315/18: CALL Line2
  117.  ELSEIF k$ = "t" THEN
  118.   yth = yth+5.30795e-315/18: CALL Line2
  119.  ELSEIF k$ = "b" THEN
  120.   yth = yth-5.30795e-315/18: CALL Line2
  121.  ELSEIF k$ = "2" THEN
  122.   rate = rate*2: CALL Line1
  123.  ELSEIF k$ = "1" THEN
  124.   rate = rate/2: CALL Line1
  125.  ELSEIF k$ = "=" THEN
  126.   sc = sc/2: CALL Line1
  127.  ELSEIF k$ = "-" THEN
  128.   sc = sc*2: CALL Line1
  129.  ELSEIF k$ = "," THEN
  130.   IF vobj >  0 THEN vobj = vobj-1 :ELSE vobj = n
  131.   tv = 0: ct = 0: CALL Line3
  132.  ELSEIF k$ = "." THEN
  133.   IF vobj <= n THEN vobj = vobj+1 :ELSE vobj = 1
  134.   tv = 0: ct = 0: CALL Line3
  135.  ELSEIF k$ = "o" THEN
  136.   LOCATE 1,1: a = ASC(INPUT$(1))-96
  137.   IF a >= 1 AND a <= n THEN
  138.    a$ = CHR$(a+64): p = INSTR(obj$,a$)
  139.    IF p THEN obj$ = LEFT$(obj$,p-1)+MID$(obj$,p+1) :ELSE obj$ = obj$+a$
  140.    o = LEN(obj$): follow = 0
  141.    CALL Line1
  142.   END IF
  143.  ELSEIF k$ = "g" THEN
  144.   IF o THEN
  145.    cx = 0: cy = 0: cz = 0
  146.    vx = 0: vy = 0: vz = 0
  147.    FOR k = 1 TO n
  148.     IF INSTR(obj$,CHR$(k+64)) THEN
  149.      cx = cx+ x(k): cy = cy+ y(k): cz = cz+ z(k)
  150.      vx = vx+vx(k): vy = vy+vy(k): vz = vz+vz(k)
  151.     END IF
  152.    NEXT k
  153.    cx = INT(cx/o): cy = INT(cy/o): cz = INT(cz/o)
  154.    vx = vx/o: vy = vy/o: vz = vz/o
  155.    FOR k = 1 TO n
  156.     x(k) = x(k)-cx: y(k) = y(k)-cy: z(k) = z(k)-cz
  157.     vx(k) = vx(k)-vx: vy(k) = vy(k)-vy: vz(k) = vz(k)-vz
  158.    NEXT k
  159.    ox = 0: oy = 0: oz = 0
  160.    CALL Lines123
  161.   END IF
  162.  ELSEIF k$ = "a" THEN
  163.   IF o THEN
  164.    follow = -follow-1
  165.    IF follow THEN
  166.     cx = 0: cy = 0: cz = 0
  167.     FOR k = 1 TO n
  168.      IF INSTR(obj$,CHR$(k+64)) THEN cx = cx+x(k): cy = cy+y(k): cz = cz+z(k)
  169.     NEXT k                                        
  170.     ox = INT(cx/o): oy = INT(cy/o): oz = INT(cz/o)
  171.    END IF
  172.    CALL Line1
  173.   END IF
  174.  ELSEIF k$ = " " THEN
  175.   disp = CINT(1/(disp/1609)): CALL Lines123
  176.  ELSE
  177.   que = 0
  178.  END IF
  179.  IF que GOTO loop
  180. END SUB
  181.  
  182. SUB Offset(x,y,z) STATIC
  183. SHARED xth,yth,ox,oy,oz,follow
  184.  follow = 0
  185.  rx  = FNr(x, z,xth): rz  = FNr( z,x,xth)
  186.  rry = FNr(y,rz,yth): rrz = FNr(rz,y,yth)
  187.  ox = ox+rx
  188.  oy = oy+rry
  189.  oz = oz+rrz
  190.  CALL Line2
  191. END SUB
  192.  b
  193. SUB Lines123 STATIC
  194.  CALL Line1: CALL Line2: CALL Line3
  195. END SUB
  196.  
  197. SUB Line1 STATIC
  198. SHARED disp,tm,rate,orig,sc,o,obj$,follow
  199.  lin$ = " Day" + STR$(INT(tm*orig/86400)) + "  Rate "
  200.  IF rate < 1 THEN
  201.   lin$ = lin$ + "1/" + MID$(STR$(INT(1/rate)),2)
  202.  ELSE
  203.   lin$ = lin$ + MID$(STR$(INT(rate)),2)
  204.  END IF
  205.  IF o THEN
  206.   lin$ = lin$ + "  "
  207.   IF follow THEN lin$ = lin$ + "F-"
  208.   lin$ = lin$ + "Objs {" + obj$ + "}"
  209.  END IF
  210.  lin$ = lin$ + "  Scale "
  211.  IF sc >  1 THEN
  212.   lin$ = lin$ + "1/" + MID$(STR$(INT(sc/disp)),2)
  213.  ELSE
  214.   lin$ = lin$ + MID$(STR$(INT(1/sc/disp)),2)
  215.  END IF
  216.  CALL PutLin(lin$,21) 
  217. END SUB
  218.  
  219. SUB Line2 STATIC
  220. SHARED disp,xth,yth,ox,oy,oz
  221.  lin$ = " Pos ("
  222.   k = INT(ox/disp): IF k < 0 THEN lin$ = lin$ + "-"
  223.   lin$ = lin$ + MID$(STR$(k),2) + ","
  224.   k = INT(oy/disp): IF k < 0 THEN lin$ = lin$ + "-"
  225.   lin$ = lin$ + MID$(STR$(k),2) + ","
  226.   k = INT(oz/disp): IF k < 0 THEN lin$ = lin$ + "-"
  227.   lin$ = lin$ + MID$(STR$(k),2) + ")  Rot ("
  228.   k = INT(0.5+180*xth/5.30795e-315): IF k < 0 THEN lin$ = lin$ + "-"
  229.   lin$ = lin$ + MID$(STR$(k),2) + ","
  230.   k = INT(0.5+180*yth/5.30795e-315): IF k < 0 THEN lin$ = lin$ + "-"
  231.   lin$ = lin$ + MID$(STR$(k),2) + ")"
  232.   CALL PutLin(lin$,22)
  233. END SUB
  234.  
  235. SUB Line3 STATIC
  236. SHARED disp,tm,vobj,v,tv,ct,n
  237.  IF vobj < 1 OR vobj > n THEN
  238.   lin$ = " Vel   "
  239.  ELSE
  240.   lin$ = " Vel " + CHR$(vobj+64) + " "
  241.   IF ct THEN lin$ = lin$ + STR$(v/disp/tm) + STR$(tv/disp/tm/ct)
  242.  END IF
  243.  CALL PutLin(lin$,23)
  244. END SUB
  245.  
  246. SUB PutLin(lin$,lin) STATIC
  247.  COLOR 0,1: LOCATE lin,1
  248.  PRINT lin$;SPACE$(FNa(77-LEN(lin$)));
  249.  COLOR 1,0
  250. END SUB
  251.  
  252.