
Solar System Simulation
This Solar System simulation features the ability to add orbiting moons to the planets, a few of which are already defined. It is not entirely to scale (the planets are larger than they are in reality).
Use the scrollwheel or finger-scroll to zoom in and out, and drag the mouse to rotate around the sun!
TO solarsystem
reset
penup
hideturtle
cam:pullin 100
;pull in the camera turtle
;---------------------------------
;make a starfield in the distance:
;---------------------------------
setfillcolor 5
repeat 200 [
home randomvectors
forward 2500 + random 100
up 90
spot 1 + random 5
]
;---------------------------------
;define planetary parameter lists:
;---------------------------------
make "distance [0 39 72 100 152 520 953 1918 3006 3953]
;the distance of the planets from the sun in 100ths of an AU
;The first value is the sun itself, which is at the home position
make "size [100 3 7.5 7.9 4.2 88.7 74.6 32.6 30.2 1.41]
;the planets are in scale relative to each other but not the sun,
;which is much larger than the value we have given it here
make "color [13 8 9 7 1 14 11 7 2 10]
;each planet's color (and the sun)
make "tilt [0 7 3.3 0 1.85 1.31 2.49 0.77 1.77 17.14]
;ecliptical tilt
make "speed [0 4.1 1.62 1 0.53 0.084 0.034 0.011 0.006 0.004]
;speed of orbit
;-------------
;define moons:
;-------------
make "moon [0 0 0 1 2 0 0 0 0 0]
;how many moons?
make "mooncolor [[][][][5][8 9][][][][][]]
make "moondistance [[][][][3][2 3][][][][][]]
make "moonsize [[][][][2.1][1.12 0.62][][][][][]]
make "moontilt [[][][][0][1 2][][][][][]]
make "moonspeed [[][][][30][40 30][][][][][]]
;moon parameters, similar to planets
;only earth and mars are populated here,
;add the others as you like!
;---------------------------
;create the sun and planets:
;---------------------------
repeat 10 [
home
make "planet repcount
;store the current planet for use inside hatch
newmodel repcount {"setfc item :planet :color "ico 0.1 * item :planet :size}
;create a new turtle model using the data from the :color and :size lists
;we use a 'soft list' {} to create 'hard data' for use by newmodel
;as the turtle model is rendered each frame
hatch [
;create a new hatchling
setmodel :planet
;set the turtle model
penup
dropanchor
;set the orbit (anchor) point to the current position
pullout 0.5 * item :planet :distance
;pull away from the anchor the distance specified in the :distance list
orbitright random 360
;orbit around a random amount
orbitup item :planet :tilt
;orbit up (tilt) the amount specified in the :tilt list
showturtle
;hatchlings are not visible by default
if 0 < item :planet :moon [ ;are there any moons? foreach "moon item :planet :mooncolor [ ;for each moon, let's create it the same way we did planets: make "moonnumber loopcount make "moonmodel word :planet loopcount newmodel :moonmodel {"setfc :moon "ico 0.1 * item :moonnumber item :planet :moonsize} make "parent turtle ;define the 'parent' turtle for use by the moon hatchling hatch [ ;hatch the moon setmodel :moonmodel dropanchor right random 360 pullout item :moonnumber item :planet :moondistance orbitup item :moonnumber item :planet :moontilt showturtle forever [ fixate query :parent [position] ;keep 'fixated' (look at and set the anchor point to) ;the parent turtle's position. if orbitdistance > item :moonnumber item :planet :moondistance [
pullin orbitdistance - (item :moonnumber item :planet :moondistance)
]
;if it's getting away from us, try and catch up!
orbitright 0.1 * item :moonnumber item :planet :moonspeed
;orbit the planet based on the :moonspeed
sleep 6.25
;take a little nap
]
]
]
]
forever [
orbitright 0.05 * item :planet :speed
sleep 25
]
;orbit the sun (we're back to the planet now) based on the value
;from the :speed list. Then take a little nap (wait 1)
]
]
hideturtle
;hide Myrtle, although she would be sitting in the sun
END



















You can change the color of the star using the SETFILLCOLOR primitive, or set a random fill color with RANDFC.

