'P L A N E T A R I U M - S P 4 C E B A R 'TO DO '- FIX ORBIT AROUND SUN, MORE STABLE, LET THE TWO SYSTEMS SHARE THE SAME ORBITAL VELOCITY ' - THEORY FIRST '- FIX ORBIT AROUND EARTH '- ADD THEM TOGETHER AND GET BOTH TO WORK '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 TIME0=TIMER-200 'GRAVITATIONAL CONSTANT GLOBAL G G=6.67384*10^(-11) 'SATELLITES(3,4)=SATELLITES(3,4)*10^6 'SATELLITES(0,4)=SATELLITES(0,4)*0.1^6 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 'ORBIT SIMULATOR GLOBAL 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=1000 DT=600 POWER=0.00000001*10/(DT*DT) POWER2=0.00000001*3/(DT*DT) X1=0 Y1=0 CALL ORB(3,X1,Y1,0,0,TIMER-TIME0) VRO=10^3.5*SQR(G*SATELLITES(0,4)/SATELLITES(3,3)) VX=VRO*-SIN((TIMER-TIME0)*VRO)*0.32 VY=VRO*COS((TIMER-TIME0)*VRO)*0.32 PX=X1 '+100000000000 PY=Y1 'PX=1000000000000 'PY=0 '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=33 'SCROLL X=-80 Y=-66 'FOCUS (ID) F=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 'C O N E S E C T I O N P L O T T E R REM CONE SECTION PLOTTER WITH ROTATION MATRIX REM A CONE SECTION CAN BE AN ELLIPSE, A PARABOLA, OR A HYPERBOLE DEPENDING ON THE PARAMETERS REM THIS IS THE MATH YOU NEED TO MAKE A SIMPLE ORBIT SIMULATION REM THESE PARAMETERS CHANGE THE SHAPE OF THE CONE SECTION IA=0.1 IB=1 IC=0 ID=0 IE=-100 REM WITH THE JOYSTICK YOU CAN MODIFY "IA" (WITH LEFT,RIGHT) AND "IE" (WITH A,B) GLOBAL P1,P2,P3,P4,P5,IE DIM GLOBAL TEMP(1,127) REM THIS IS THE BASE FORMULA FOR A CONE SECTION REM IA*X^2 + IB*Y^2 + IC*X + ID*Y + IE = 0 REM WITH THE ROTATION MATRIX WE ALSO HAVE THE ROTATION ANGLE, THIS VARIABLE WILL BE INCREMENTED AUTOMATICALLY ROT=0 REM SETUP ON RASTER CALL RASTERFX 'GAMEPAD 1 'TOUCHSCREEN REM THIS SETS THE BASE VALUES FOR THE VARIABLES THAT ARE AFFECTED BY THE JOYSTICK REM THIS ISN'T THAT IMPORTANT FOR THE PROGRAM BUT I THOUGHT IT'D BE NICE TO HAVE REM I WANT THE JOYSTICK TO AFFECT THE IA VARIABLE IN A QUADRATIC PATTERN REM I FIRST WANT TO SET ITS BASE VALUE TO A VALUE UNAFFECTED BY IT REM AND I ALSO DON'T WANT ANY NEGATIVE SQUAREROOT ERRORS TO POP UP IF IA>=0 THEN VA=SQR(IA) ELSE VA=-SQR(IA) END IF REM THE BASE VALUE FOR "IE" VE=IE 'SPRITE 62 PAL 5 'SPRITE 63 PAL 5 'M A I N L O O P 'MAINLOOP: DO TIME=TIMER-TIME0 CALL SHIP(PX,PY) CALL CAM(X,Y,Z,F) CALL SPACE(X,Y,2^Z,F,TIME) CALL SAT(X,Y,Z,F,9,PX,PY) CALL PATHMATH(X+50,Y,VA,VE,IA,IB,IC,ID,IE,ROT) POWER=0.1^23.5*2^Z POWER2=POWER*0.3 WAIT VBL WAIT 2 'WAIT 600 LOOP SUB SHIP(X,Y) FX=0 FY=0 RX=0 RY=0 R=1 FOR I=9 TO 0 STEP -1 IF I=0 THEN CALL GFORCE(X,Y,SATELLITES(I,0),SATELLITES(I,1),SATELLITES(I,4),RX,RY,R,FX,FY) END IF 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 CELL X,Y,21 '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,TIME) 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,TIME) CALL SAT(X,Y,Z,F,I,X1,Y1) IF I=3 THEN 'EARTH'S MOON CALL ORB(9,X2,Y2,X1,Y1,TIME) 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,TIME) 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(TIME*VRO) Y1=Y2+SATELLITES(I,3)*SIN(TIME*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 'P A T H - M A T H SUB PATHMATH(DX,DY,VA,VE,IA,IB,IC,ID,IE,R) REM ROTATION MATRIX WITH X AND Y SORTED REM THESE ARE PRECALCULATED PARAMETERS REM THIS IS MOST OF THE MATH REM P1*X^2 + P2*Y^2 + P3*XY + P4*X + P5*Y + C =0 P1 = IA*COS(R)^2 + IB*SIN(R)^2 P2 = IA*SIN(R)^2 + IB*COS(R)^2 P3 = 2*SIN(R)*COS(R)*(IA-IB) P4 = IC*COS(R) - ID*SIN(R) P5 = IC*SIN(R) + ID*COS(R) REM PLOT X,Y FOR MANY X COORDINATES FOR Y=0 TO 127 REM MY NOTES REM THIS WOULD WORK REALLY WELL WITH RASTERS REM A*X^2 + B*Y^2 + C*X + D*Y + E = 0 REM A*X^2 + B*Y^2 + C*X*Y + D*X + E*Y + F = 0 REM B*Y^2 + (E+C*X)*Y + (A*X^2 + D*X + F) = 0 REM P1*X^2 + P2*Y^2 + P3*XY + P4*X + P5*Y + IE =0 REM P2*Y^2 + (P5+P3*X)*Y + (P1*X^2 + P4*X + IE) = 0 REM P1*X^2 + P2*Y^2 + P3*XY + P4*X + P5*Y + IE =0 REM P1*X^2 + (P4+P3*Y)*X + (P2*Y^2 + P5*Y + IE) = 0 REM MORE PRECALCULATED VALUES REM TO MAKE THIS EQUATION: Y = A*X^2 + B*X + C Y1=Y+DY A=P1 B=P4+P3*Y1 C=P2*Y1*Y1 + P5*Y1 + IE 'X1=X+DX 'A=P2 'B=P5+P3*X1 'C=P1*X1*X1 + P4*X1 + IE REM SOLVE THE EQUATION USING THE ABC FORMULA D= B^2 - 4*A*C REM IF SQR(D) IS REAL THEN IF D>=0 THEN REM WE CAN CALCULATE TWO Y VALUES REM NOTE: WHEN D=0 X1 AND X2 WILL BE THE SAME, BUT THAT'S NOT A BIG DEAL X1= (-B -SQR(D))/(2*A) - DX X2= (-B +SQR(D))/(2*A) - DX REM PLOT OUR Y VALUE WITH OUR CALCULATED X VALUES TEMP(0,Y)=(X1+80)*-(X1>=-79 AND X1<=80)-1 TEMP(1,Y)=(X2+80)*-(X2>=-79 AND X2<=80)-1 ELSE TEMP(0,Y)=-1 TEMP(1,Y)=-1 END IF NEXT Y 'FOR I=0 TO 127 'TEMP(0,I)=10 'TEMP(1,I)=5 'NEXT I REM INCREMENT THE ROTATION ADD R,0.02 REM JOYSTICK AFFECTS PARAMETERS ADD VA,0.1*(RIGHT(0)-LEFT(0)) ADD VE,10*(BUTTON(0,0)-BUTTON(0,1)) 'NO, TOUCH AFFECTS PARAMATERS [EDIT: NO LONGER] 'VA=0.1*(TOUCH.X-79) 'VE=10*(TOUCH.Y-127) REM OF WHICH "IA" IS MAPPED TO BE QUADRATIC (BECAUSE I LIKE THAT) IA=SGN(VA)*VA*VA REM AND "IE" IS FORCED TO STAY POSITIVE IE=VE IF IE>0 THEN IE=0 END SUB SUB RASTERFX 'SPRITE 0,6,RASTER,1 'SPRITE 1,6,RASTER,1 SPRITE 62,TEMP(0,RASTER),RASTER,13 SPRITE 63,TEMP(1,RASTER),RASTER,13 END SUB '#1:MAIN PALETTES '003F2F0000383400003C0C00003F3C00 '003F2A15003F2A15003F2A15003F2A15 '#2:MAIN CHARACTERS '00000000000000000000000000000000 '80000000000000000000000000000000 '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