'P L A N E T A R I U M - S P 4 C E B A R 'IDEAS 'SAMPLE FEWER POINTS AND CONNECT THEM WITH DIAGONAL-LINE SPRITES (NOPE) 'FIXED NUMBER OF ITTERATIONS, KEEP A TRAIL, USE CELLS 'THIS ORBIT SIMULATOR USES VECTORS 'IN THIS PROGRAM A VECTOR CONCISTS OF TWO VARIABLES '- THE X PART OF THE VECTOR ENDS WITH X '- THE Y PART OF THE VECTOR ENDS WITH Y ABBREVIATIONS: 'F MEANS FORCE 'M MEANS MASS 'R MEANS RADIUS 'A MEANS ACCELERATION 'V MEANS VELOCITY 'C IS A CONSTANT 'G IS THE GRAVITATIONAL CONSTANT 'IF THIS IS AT THE END OF A VARIABLE: 'E MEANS EARTH 'M MEANS MOON 'S A T E L L I T E C O N S T A N T S DIM GLOBAL SATELLITES(15,4) 'SATELLITES(ID,TYPE) 'TYPE: X,Y,RADIUS (*10^6 M) (MAY BE OBSOLETE), RADIUS OF ORBIT (*10^12 M), MASS (*10^24 KG) 'WRITE DATA TO ARRAY FOR I=0 TO 15 FOR J=0 TO 2 READ V IF V<0 THEN EXIT V=V*10^(6*2^J) SATELLITES(I,J+2)=V NEXT J IF V=-2 THEN EXIT NEXT I 'SATELLITE DATA: RADIUS,RADIUS OF ORBIT,MASS 'STARS DATA 696.3, 0, 1988400 'PLANETS DATA 2.440, 0.0579, 0.330 DATA 6.052, 0.1082, 4.87 DATA 6.371, 0.1496, 5.972 DATA 3.390, 0.228 , 0.642 DATA 69.91, 0.7883, 1900 DATA 58.2 , 1.427 , 568 DATA 25.4 , 2.871 , 86.8 DATA 24.6 , 4.498 , 102.4 'MOONS DATA 1.738, 0.0003844, 0.0735 'MANMADE SPACE OBJECTS DATA -2 'V A R I A B L E S 'GRAVITATIONAL CONSTANT GLOBAL G G=6.67384*10^(-11) ME=SATELLITES(3,4) MM=SATELLITES(9,4) M=1000 R=0.0001 'SCALE CHANGES GRAVITY, DT, STARTING VELOCITY, AND POWER 'TO KEEP THE SPEED THE SAME WHILE CHANGING THE SCALE SCALE=0 GRAVITY=10^(-12+SCALE) 'SCALE THE FORCES CONST=G*M*GRAVITY CE=CONST*ME CM=CONST*MM 'ORBIT SIMULATOR GLOBAL X,Y,XE,YE,XM,YM,CONST,GRAVITY,M,RES2,FG GLOBAL RX,RY,R,POWER,POWER2,VX,VY,DT 'DEFINE VARIABLES DT=0.2*0.3^SCALE DT=2000 POWER=0.00000001*10/(DT*DT) POWER2=0.00000001*3/(DT*DT) XE=80 YE=60 XM=20 YM=60 X=60 Y=40 'SET THE CORRECT STARTING VELOCITY VX= 3^(SCALE+1) VY=-3^(SCALE+1) VX=0 VY=-10^7 AX=0 AY=0 RX=0 RY=0 FGX=0 FGY=0 RES2=5 N=0 I=0 'ZOOM Z=34 'SCROLL X=-80 Y=-66 'FOCUS (ID) F=0 PX=1000000000000 PY=0 GLOBAL PX,PY 'S E T U P PALETTE 0,0,,, PAUSE OFF GAMEPAD 2 'WRITE BUTTON A ON TO START PATH DRAWING 'POKE $FF70,PEEK($FF70)+16 'M A I N L O O P DO CALL SHIP(PX,PY) CALL CAM(X,Y,Z,F) CALL SPACE(X,Y,2^Z,F) CALL SAT(X,Y,Z,F,9,PX,PY) WAIT VBL LOOP SUB SHIP(X,Y) FX=0 FY=0 RX=0 RY=0 R=1 FOR I=0 TO 9 CALL GFORCE(X,Y,SATELLITES(I,0),SATELLITES(I,1),SATELLITES(I,4),RX,RY,R,FX,FY) NEXT I 'TRACE FX,FY TRACE 10000000000000*DT*FX/M 'CALL GFORCE(X,Y,XM,YM,MM,RX,RY,R,FX,FY) 'CALL GFORCE(X,Y,XE,YE,ME,RX,RY,R,FX,FY) 'THRUST FORCE (USER INPUT): 'ABSOLUTE (JOYSTICK) + DIRECTIONAL (BUTTONS) (USES A VECTOR PERPENDICULAR TO R) ADD FX,POWER*(LEFT(0)-RIGHT(0)) - POWER2*RY/R*(BUTTON(0,0)-BUTTON(0,1)) ADD FY,POWER*(UP(0) -DOWN(0) ) + POWER2*RX/R*(BUTTON(0,0)-BUTTON(0,1)) 'VELOCITY ADD VX,1000000000000000000*DT*FX/M ADD VY,1000000000000000000*DT*FY/M 'TRACE VX,VY 'POSITION ADD X,VX*DT ADD Y,VY*DT 'TRACE X,Y 'DRAW SPRITES 'SPRITE 0,X,Y,1 'SPRITE 1,XE-4,YE-4,2 'SPRITE 1 PAL 1 'SPRITE 2,XM,YM,3 'SPRITE 2 PAL 2 'IF SPRITE HIT(0,2) THEN TEXT 2,15,"CONGRATULATIONS" 'DRAW PATH 'IF NO BUTTON AND EVERY NOW AND THEN THEN DRAW THE PATH 'IF PEEK($FF70)<>0 AND TIMER MOD 2 = 0 THEN CALL PATH(X,Y,VX,VY,RX,RY,R) 'IF SPRITE HIT(0,1) THEN EXIT SUB 'IF RES2>30 THEN RES2=1 'EXIT END SUB SUB GFORCE(X,Y,X0,Y0,MASS,RX,RY,R,FX,FY) 'GRAVITATIONAL FORCE 'CALCULATE RADIUS BETWEEN PLANET (XE,YE) AND SATELLITE (X,Y) USING VECTOR LENGTH RX=X0-X RY=Y0-Y R=SQR(RX*RX+RY*RY) 'CALCULATE GRAVITATIONAL FORCE (FG) FG=MASS*CONST/(R*R) 'DECOMPOSE FG USING UNIFORMITY ADD FX,RX*FG/R ADD FY,RY*FG/R END SUB SUB PATH(X,Y,VX,VY,RX,RY,R) 'TIMEOUT, DYNAMIC RESOLUTION (DELTA T), SPRITE COUNT (RES), AND SPRITE ID (I) TIMEOUT=TIMER+5 DT=0.08*RES2 RES=60 I=0 RX1=0 RY1=0 FGX=0 FGY=0 FX=0 FY=0 'COPY THE VARS X1=X Y1=Y VX1=VX VY1=VY 'CALCULATE THE STARTING ANGLE PHI=((ACOS(RX/SQR(RX*RX+RY*RY))*SGN(RY)+PI)/(2*PI))*61 PHI1=0 REPEAT FX=0 FY=0 'MOON (MAKES THE PATH EVEN MORE GLITCHY) 'CALL GFORCE(X1,Y1,XM,YM,CM,RX1,RY1,R,FX,FY) 'EARTH CALL GFORCE(X1,Y1,XE,YE,CE,RX1,RY1,R,FX,FY) 'ACCELERATION AX=FX/M AY=FY/M 'VELOCITY ADD VX1,AX*DT ADD VY1,AY*DT 'POSITION ADD X1,VX1*DT ADD Y1,VY1*DT 'CALCULATE THE CURRENT ANGLE (RELATIVE TO STARTING ANGLE) PHI1=((((ACOS(RX1/SQR(RX1*RX1+RY1*RY1))*SGN(RY1)+PI)/(2*PI))*RES-PHI)+RES) MOD RES 'AT SPECIFIC ANGLES IF PHI1>I THEN 'DRAW A PIXEL (SPRITE) SPRITE 3+I,X1,Y1,1 SPRITE 3+I PAL 2 ADD I,1,0 TO RES-1 'EARTH HIT! IF SPRITE HIT(3+I,1) THEN TIMEOUT=TIMER+1 END IF UNTIL I=RES-1 OR TIMER>TIMEOUT 'CHANGE THE RESOLUTION BASED ON LAG DATA (IT'S DYNAMIC) IF RES-1>I THEN INC RES2 IF TIMEOUT-TIMER>4 AND RES2>1 THEN DEC RES2 'REMOVE OUTDATED SPRITES SPRITE OFF 3+I TO 63 'VIEW THE DYNAMIC RESOLUTION 'TRACE RES2 END SUB 'S P A C E P R O C E S S O R SUB SPACE(X,Y,Z,F) X1=0 Y1=0 X2=0 Y2=0 'SUN CALL SAT(X,Y,Z,F,0,0,0) FOR I=1 TO 8 'PLANETS CALL ORB(I,X1,Y1,0,0) CALL SAT(X,Y,Z,F,I,X1,Y1) IF I=3 THEN 'EARTH'S MOON CALL ORB(9,X2,Y2,X1,Y1) CALL SAT(X,Y,Z,F,9,X2,Y2) END IF NEXT I END SUB 'O R B I T C A L C U L A T I O N S SUB ORB(I,X1,Y1,X2,Y2) IF SATELLITES(I,3)>0 THEN 'ORBIT ROTATIONAL VELOCITY VRO=0.000001*SQR(G*SATELLITES(0,4)/SATELLITES(I,3)) ELSE VRO=0 END IF 'MAIN POSITION CALCULATION X1=X2+SATELLITES(I,3)*COS(TIMER*VRO) Y1=Y2+SATELLITES(I,3)*SIN(TIMER*VRO) SATELLITES(I,0)=X1 SATELLITES(I,1)=Y1 END SUB 'S A T E L L I T E S P R I T E D R A W I N G SUB SAT(X,Y,Z,F,I,X1,Y1) 'APPLY SCROLL AND ZOOM TO SPRITE COORDINATES SX=(X1-PX)/Z-X-4-2*(I=9) SY=(Y1-PY)/Z-Y-4-2*(I=9) 'IF THE SPRITE IS IN FRAME THEN IF SX>=-8 AND SX<=168 AND SY>=-8 AND SY<=137 THEN 'DRAW THE SPRITE WITH ITS PALETTE SPRITE I,SX,SY,16-(I=3)-3*(I=0)-2*(I=9) SPRITE I PAL -5*(I=3)-(I>=4 AND I<=6)-2*(I=0)-6*(I=9) ELSE 'REMOVE SPRITE SPRITE OFF I END IF END SUB 'C A M E R A P A R A M E T E R S SUB CAM(X,Y,Z,F) ADD X,LEFT(1)-RIGHT(1) ADD Y,UP(1)-DOWN(1) ADD Z,(BUTTON(1,1)-BUTTON(1,0))*0.125 ADD F,-PAUSE,0 TO 9 NUMBER 0,0,2^Z,20 NUMBER 0,1,X,8 NUMBER 10,1,Y,8 NUMBER 19,1,F,1 END SUB 'ORBIT SIM PALETTES '#1:MAIN PALETTES '00150C3F0008073F003F2A15003F3C00 '003F2A15003F2A15003F2A15003F2A15 #1:MAIN PALETTES 001B171600383410003F3D3E003F3C00 00150C3F0008073F003F2A15003F3C00 #2:MAIN CHARACTERS 00000000000000000000000000000000 187E7EFFFF7E7E18187E7EFFFF7E7E18 00000000000000000000000000000000 18000EF2421C2018247EF10DBDE35E24 00000000000000000000000000000000 18000EF2421C2018247EF10DBDE35E24 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 80000000000000008000000000000000 180067CFCE8400183C7E9830317B7E3C 108848987000000070F8F8F870000000 18000EF2421C2018247EF10DBDE35E24 180067CFCE8400183C7E9830317B7E3C 108848987000000070F8F8F870000000 181C3E7EFE3C1C003C7EE3C3C3C36E3C 00000000000000000000000000000000 80000000000000008000000000000000 180067CFCE8400183C7E9830317B7E3C 108848987000000070F8F8F870000000