REM Solar System Simulation REM By Scott Teresi, www.teresi.us REM July 5, 1996 REM August 5, 1996 - got random orbits and magnitudes working CLS leftedge = 1 rightedge = 639 topedge = 1 bottomedge = 479 RANDOMIZE TIMER PLANETS = 8 DRAWCIRCLE = 1: REM 1 DRAWS PLANETS AS CIRCLES, 0 DRAWS DOTS RESIST = 20: REM 200 works better for asteroid cloud DIM MASS(PLANETS), CLR(PLANETS), POSX(PLANETS), POSY(PLANETS), SPDX(PLANETS), SPDY(PLANETS), ACCX(PLANETS), ACCY(PLANETS) SCREEN 12 REM Sun MASS(1) = 100000 CLR(1) = 6 POSX(1) = 320 POSY(1) = 240 SPDX(1) = 0 SPDY(1) = 0 REM Generic planet MASS(2) = 3 CLR(2) = 15 POSX(2) = 15 POSY(2) = 200 SPDX(2) = 3 SPDY(2) = -3 REM Binary planets MASS(3) = 300 CLR(3) = 15 POSX(3) = 440 POSY(3) = 240 SPDX(3) = 0 SPDY(3) = 5.8 MASS(4) = 300 CLR(4) = 3 POSX(4) = 430 POSY(4) = 240 SPDX(4) = 0 SPDY(4) = 7.5 REM Orbiting moon around earth MASS(5) = 1000 CLR(5) = 15 POSX(5) = 200 POSY(5) = 240 SPDX(5) = 0 SPDY(5) = -6.5 MASS(6) = 1 CLR(6) = 15 POSX(6) = 212 POSY(6) = 240 SPDX(6) = 0 SPDY(6) = -8.5 REM Two planets starting at similar positions MASS(7) = 1 CLR(7) = 15 POSX(7) = 400 POSY(7) = 300 SPDX(7) = 4 SPDY(7) = -4 MASS(8) = 1 CLR(8) = 15 POSX(8) = 400 POSY(8) = 300 SPDX(8) = 4.1 SPDY(8) = -4 GOTO 50: REM (to bypass the following routine) REM TRY TO GET AN ORBITING CLOUD REM only specify mass and magnitude of speed; see below MASS(1) = 20000 FOR I = 2 TO PLANETS CLR(I) = 15 MASS(I) = 3000 MAG(I) = 2: REM MAGNITUDE OF SPEED NEXT I REM RANDOMLY CHOOSE PLACEMENT OF PLANET WITHIN CERTAIN RADIUS OF SUN FOR I = 2 TO PLANETS 20 POSX(I) = RND * 640 POSY(I) = RND * 480 DIST = SQR((POSX(I) - POSX(1)) ^ 2 + (POSY(I) - POSY(1)) ^ 2) IF DIST < 140 OR DIST > 150 THEN GOTO 20 NEXT I REM FIGURE OUT VECTOR FOR CIRCULAR ORBIT (CORRECT MAGNITUDE MUST BE SET ABOVE) FOR I = 2 TO PLANETS DIST = SQR((POSX(I) - POSX(1)) ^ 2 + (POSY(I) - POSY(1)) ^ 2) UNITX = (POSX(I) - POSX(1)) / DIST UNITY = (POSY(I) - POSY(1)) / DIST SPDY(I) = MAG(I) * UNITX * -1 SPDX(I) = MAG(I) * UNITY NEXT I 50 BLACK = 0: GOSUB 1000 FOR I = 1 TO 20000: NEXT I 100 REM *** MAIN PROGRAM *** FOR SOURCE = 2 TO PLANETS IF MASS(SOURCE) = 0 THEN GOTO 300 ACCX(SOURCE) = 0 ACCY(SOURCE) = 0 FOR TARGET = 1 TO PLANETS IF TARGET = SOURCE OR MASS(TARGET) = 0 THEN GOTO 200 DIST = SQR((POSX(SOURCE) - POSX(TARGET)) ^ 2 + (POSY(SOURCE) - POSY(TARGET)) ^ 2) IF DIST < 1 THEN DIST = 1 REM THE LINE BELOW WILL COMBINE PLANETS' MASSES IF THEY COME TO CLOSE TOGETHER REM IF DIST < 1 THEN MASS(SOURCE) = MASS(SOURCE) + MASS(TARGET): MASS(TARGET) = 0: GOTO 200 UNITX = (POSX(TARGET) - POSX(SOURCE)) / DIST UNITY = (POSY(TARGET) - POSY(SOURCE)) / DIST ACCX(SOURCE) = ACCX(SOURCE) + 1 / (DIST ^ 2) * MASS(TARGET) * UNITX / RESIST ACCY(SOURCE) = ACCY(SOURCE) + 1 / (DIST ^ 2) * MASS(TARGET) * UNITY / RESIST 200 NEXT TARGET SPDX(SOURCE) = SPDX(SOURCE) + ACCX(SOURCE) SPDY(SOURCE) = SPDY(SOURCE) + ACCY(SOURCE) 300 NEXT SOURCE BLACK = 1: GOSUB 1000 FOR I = 1 TO PLANETS POSX(I) = POSX(I) + SPDX(I) POSY(I) = POSY(I) + SPDY(I) IF POSX(I) > rightedge THEN POSX(I) = rightedge: REM SPDX(I) = SPDX(I) - 1 IF POSX(I) < leftedge THEN POSX(I) = leftedge: REM SPDX(I) = SPDX(I) + 1 IF POSY(I) < topedge THEN POSY(I) = topedge: REM SPDY(I) = SPDY(I) + 1 IF POSY(I) > bottomedge THEN POSY(I) = bottomedge: REM SPDY(I) = SPDY(I) - 1 NEXT I BLACK = 0: GOSUB 1000 GOTO 100 REM DRAW OR ERASE A PLANET 1000 FOR I = 1 TO PLANETS IF BLACK = 1 THEN COLOR 0 ELSE COLOR CLR(I) IF DRAWCIRCLE THEN diameter = MASS(I) / 200 IF diameter < 1 THEN diameter = 1 IF diameter > 20 THEN diameter = 20 CIRCLE (POSX(I), POSY(I)), diameter ELSE PSET (POSX(I), POSY(I)) PSET (POSX(I) + 1, POSY(I)) END IF NEXT I RETURN