home *** CD-ROM | disk | FTP | other *** search
AmigaBASIC Source Code | 1986-11-20 | 7.5 KB | 252 lines |
- disp = 1: tm = 122630: rate = 1
-
- REM *** Data ***
- DATA 3
-
- DATA 1.99e30, 0.000000000e00,0,00.000000e0, 0,000000.00,0
- DATA 5.98e24, 1.490000000e11,0,00.000000e0, 0,-29839.24,0
- DATA 7.36e22, 1.493825388e11,0,-3.346781e7, 0,-30861.59,0
-
- vobj = 2: obj$ = "AB": o = LEN(obj$): follow = (o<>0)
- sc = 1/5.46559e-315: yth = 6*5.30795e-315/18: go = -1
-
- REM *** Start ***
- DEF FNq(x,y) = (x>0 AND x<78 AND y>0 AND y<21)
- DEF FNa(x) = INT(0.5+(x+SQR(x*x))/2)
- DEF FNr(x,y,t) = x*COS(t)+y*SIN(t)
- DEF FNrx(i) = FNr(x(i)-ox,z(i)-oz,xth)
- DEF FNrz(i) = FNr(z(i)-oz,x(i)-ox,-xth)
- DEF FNrry(i) = FNr(y(i)-oy,FNrz(i),yth)
- DEF FNpx(i) = INT(0.5+39+2*sc*FNrx(i))
- DEF FNpy(i) = INT(0.5+11-sc*FNrry(i))
-
- READ n
- CLS: PRINT "How many objects :"n: PRINT
- DIM SHARED m(n), px(n),py(n), x(n),y(n),z(n)
- DIM SHARED vx(n),vy(n),vz(n), ax(n),ay(n),az(n)
- FOR i = 1 TO n
- READ m(i), x(i),y(i),z(i), vx(i),vy(i),vz(i)
- vx(i) = vx(i)*tm: vy(i) = vy(i)*tm: vz(i) = vz(i)*tm
- PRINT USING "#) Mass :";i;: PRINT m(i)
- PRINT " ( x, y, z) : (";: IF x(i) < 0 THEN PRINT "-";
- PRINT MID$(STR$( x(i)/disp),2)",";: IF y(i) < 0 THEN PRINT "-";
- PRINT MID$(STR$( y(i)/disp),2)",";: IF z(i) < 0 THEN PRINT "-";
- PRINT MID$(STR$( z(i)/disp),2)")"
- PRINT " (vx,vy,vz) : (";: IF vx(i) < 0 THEN PRINT "-";
- PRINT MID$(STR$(vx(i)/disp/tm),2)",";: IF vy(i) < 0 THEN PRINT "-";
- PRINT MID$(STR$(vy(i)/disp/tm),2)",";: IF vz(i) < 0 THEN PRINT "-";
- PRINT MID$(STR$(vz(i)/disp/tm),2)")"
- NEXT i
- PRINT : PRINT "Hit any key to continue ...";: a$ = INPUT$(1)
- CALL ReDraw
-
- WHILE go
- FOR i = 1 TO n
- ax(i) = 0: ay(i) = 0: az(i) = 0
- FOR j = 1 TO n
- IF i <> j THEN
- dx = x(j)-x(i): sx = SGN(dx)
- dy = y(j)-y(i): sy = SGN(dy)
- dz = z(j)-z(i): sz = SGN(dz)
- dsq = dx*dx + dy*dy + dz*dz: dd = SQR(dsq-dz*dz)
- IF dx THEN th1 = ATN(dy/dx) :ELSE th1 = 5.30277e-315
- IF dd THEN th2 = ATN(dz/dd) :ELSE th2 = 5.30277e-315
- a = m(j)/dsq
- ax(i) = ax(i) + sx*ABS(a*COS(th1)*COS(th2))
- ay(i) = ay(i) + sy*ABS(a*SIN(th1)*COS(th2))
- az(i) = az(i) + sz*ABS(a*SIN(th2))
- END IF
- NEXT j
- vx(i) = vx(i) + rate*ax(i)
- vy(i) = vy(i) + rate*ay(i)
- vz(i) = vz(i) + rate*az(i)
- IF vobj = i THEN
- v = SQR(vx(i)*vx(i)+vy(i)*vy(i)+vz(i)*vz(i))
- tv = tv + v: ct = ct + 1: CALL Line3
- END IF
- NEXT i
- IF follow THEN cx = 0: cy = 0: cz = 0
- FOR i = 1 TO n
- x(i) = x(i) + rate*vx(i)
- y(i) = y(i) + rate*vy(i)
- z(i) = z(i) + rate*vz(i)
- IF follow THEN IF INSTR(obj$,CHR$(i+64)) THEN cx = cx+x(i): cy = cy+y(i): cz = cz+z(i)
- NEXT i
- IF follow THEN
- cx = INT(0.5+sc*cx/o)/sc
- cy = INT(0.5+sc*cy/o)/sc
- cz = INT(0.5+sc*cz/o)/sc
- IF cx <> ox OR cy <> oy OR cz <> oz THEN ox = cx: oy = cy: oz = cz: CALL Lines123
- END IF
- FOR i = 1 TO n
- IF FNq(px(i),py(i)) THEN LOCATE py(i),px(i): PRINT " ";
- px(i) = FNpx(i): py(i) = FNpy(i)
- IF FNq(px(i),py(i)) THEN LOCATE py(i),px(i): PRINT CHR$(i+64);
- NEXT i
- orig = orig + rate: CALL Line1: CALL Keyscan
- WEND
- LOCATE 23,1: PRINT: LIST: END
-
- SUB ReDraw STATIC
- SHARED n
- CLS: CALL Lines123
- FOR k = 1 TO n
- px(k) = FNpx(k): py(k) = FNpy(k)
- IF FNq(px(k),py(k)) THEN LOCATE py(k),px(k): PRINT CHR$(k+64);
- NEXT k
- END SUB
-
- SUB Keyscan STATIC
- SHARED disp,rate,vobj,tv,ct,orig,go,xth,yth,ox,oy,oz,sc,n,obj$,follow,o
- loop:
- que = -1: k$ = INKEY$: k = ASC(k$+CHR$(0))
- IF k = 27 THEN
- go = 0: que = 0
- ELSEIF k = 28 THEN
- CALL Offset(0,1/sc,0)
- ELSEIF k = 29 THEN
- CALL Offset(0,-1/sc,0)
- ELSEIF k = 30 THEN
- CALL Offset(1/sc,0,0)
- ELSEIF k = 31 THEN
- CALL Offset(-1/sc,0,0)
- ELSEIF k$ = "h" THEN
- xth = xth+5.30795e-315/18: CALL Line2
- ELSEIF k$ = "f" THEN
- xth = xth-5.30795e-315/18: CALL Line2
- ELSEIF k$ = "t" THEN
- yth = yth+5.30795e-315/18: CALL Line2
- ELSEIF k$ = "b" THEN
- yth = yth-5.30795e-315/18: CALL Line2
- ELSEIF k$ = "2" THEN
- rate = rate*2: CALL Line1
- ELSEIF k$ = "1" THEN
- rate = rate/2: CALL Line1
- ELSEIF k$ = "=" THEN
- sc = sc/2: CALL Line1
- ELSEIF k$ = "-" THEN
- sc = sc*2: CALL Line1
- ELSEIF k$ = "," THEN
- IF vobj > 0 THEN vobj = vobj-1 :ELSE vobj = n
- tv = 0: ct = 0: CALL Line3
- ELSEIF k$ = "." THEN
- IF vobj <= n THEN vobj = vobj+1 :ELSE vobj = 1
- tv = 0: ct = 0: CALL Line3
- ELSEIF k$ = "o" THEN
- LOCATE 1,1: a = ASC(INPUT$(1))-96
- IF a >= 1 AND a <= n THEN
- a$ = CHR$(a+64): p = INSTR(obj$,a$)
- IF p THEN obj$ = LEFT$(obj$,p-1)+MID$(obj$,p+1) :ELSE obj$ = obj$+a$
- o = LEN(obj$): follow = 0
- CALL Line1
- END IF
- ELSEIF k$ = "g" THEN
- IF o THEN
- cx = 0: cy = 0: cz = 0
- vx = 0: vy = 0: vz = 0
- FOR k = 1 TO n
- IF INSTR(obj$,CHR$(k+64)) THEN
- cx = cx+ x(k): cy = cy+ y(k): cz = cz+ z(k)
- vx = vx+vx(k): vy = vy+vy(k): vz = vz+vz(k)
- END IF
- NEXT k
- cx = INT(cx/o): cy = INT(cy/o): cz = INT(cz/o)
- vx = vx/o: vy = vy/o: vz = vz/o
- FOR k = 1 TO n
- x(k) = x(k)-cx: y(k) = y(k)-cy: z(k) = z(k)-cz
- vx(k) = vx(k)-vx: vy(k) = vy(k)-vy: vz(k) = vz(k)-vz
- NEXT k
- ox = 0: oy = 0: oz = 0
- CALL Lines123
- END IF
- ELSEIF k$ = "a" THEN
- IF o THEN
- follow = -follow-1
- IF follow THEN
- cx = 0: cy = 0: cz = 0
- FOR k = 1 TO n
- IF INSTR(obj$,CHR$(k+64)) THEN cx = cx+x(k): cy = cy+y(k): cz = cz+z(k)
- NEXT k
- ox = INT(cx/o): oy = INT(cy/o): oz = INT(cz/o)
- END IF
- CALL Line1
- END IF
- ELSEIF k$ = " " THEN
- disp = CINT(1/(disp/1609)): CALL Lines123
- ELSE
- que = 0
- END IF
- IF que GOTO loop
- END SUB
-
- SUB Offset(x,y,z) STATIC
- SHARED xth,yth,ox,oy,oz,follow
- follow = 0
- rx = FNr(x, z,xth): rz = FNr( z,x,xth)
- rry = FNr(y,rz,yth): rrz = FNr(rz,y,yth)
- ox = ox+rx
- oy = oy+rry
- oz = oz+rrz
- CALL Line2
- END SUB
- b
- SUB Lines123 STATIC
- CALL Line1: CALL Line2: CALL Line3
- END SUB
-
- SUB Line1 STATIC
- SHARED disp,tm,rate,orig,sc,o,obj$,follow
- lin$ = " Day" + STR$(INT(tm*orig/86400)) + " Rate "
- IF rate < 1 THEN
- lin$ = lin$ + "1/" + MID$(STR$(INT(1/rate)),2)
- ELSE
- lin$ = lin$ + MID$(STR$(INT(rate)),2)
- END IF
- IF o THEN
- lin$ = lin$ + " "
- IF follow THEN lin$ = lin$ + "F-"
- lin$ = lin$ + "Objs {" + obj$ + "}"
- END IF
- lin$ = lin$ + " Scale "
- IF sc > 1 THEN
- lin$ = lin$ + "1/" + MID$(STR$(INT(sc/disp)),2)
- ELSE
- lin$ = lin$ + MID$(STR$(INT(1/sc/disp)),2)
- END IF
- CALL PutLin(lin$,21)
- END SUB
-
- SUB Line2 STATIC
- SHARED disp,xth,yth,ox,oy,oz
- lin$ = " Pos ("
- k = INT(ox/disp): IF k < 0 THEN lin$ = lin$ + "-"
- lin$ = lin$ + MID$(STR$(k),2) + ","
- k = INT(oy/disp): IF k < 0 THEN lin$ = lin$ + "-"
- lin$ = lin$ + MID$(STR$(k),2) + ","
- k = INT(oz/disp): IF k < 0 THEN lin$ = lin$ + "-"
- lin$ = lin$ + MID$(STR$(k),2) + ") Rot ("
- k = INT(0.5+180*xth/5.30795e-315): IF k < 0 THEN lin$ = lin$ + "-"
- lin$ = lin$ + MID$(STR$(k),2) + ","
- k = INT(0.5+180*yth/5.30795e-315): IF k < 0 THEN lin$ = lin$ + "-"
- lin$ = lin$ + MID$(STR$(k),2) + ")"
- CALL PutLin(lin$,22)
- END SUB
-
- SUB Line3 STATIC
- SHARED disp,tm,vobj,v,tv,ct,n
- IF vobj < 1 OR vobj > n THEN
- lin$ = " Vel "
- ELSE
- lin$ = " Vel " + CHR$(vobj+64) + " "
- IF ct THEN lin$ = lin$ + STR$(v/disp/tm) + STR$(tv/disp/tm/ct)
- END IF
- CALL PutLin(lin$,23)
- END SUB
-
- SUB PutLin(lin$,lin) STATIC
- COLOR 0,1: LOCATE lin,1
- PRINT lin$;SPACE$(FNa(77-LEN(lin$)));
- COLOR 1,0
- END SUB
-
-