Code Sketch
solar system
Category: Art
cleari()
setBackground(Color(0,0,20))
setAnimationDelay(0)
invisible()
var a0 = 0.0
var a1 = 0.6
var a2 = 1.2
var a3 = 2.0
var a4 = 2.8
var a5 = 3.5
var a6 = 4.2
var a7 = 5.0
var m0 = 0.0
var m1 = 0.0
var m2 = 0.0
var m3 = 0.0
var m4 = 0.0
var m5 = 0.0
var m6 = 0.0
var m7 = 0.0
val orbits = Array(60, 90, 120, 155, 195, 235, 268, 300)
val sizes = Array(5, 9, 10, 7, 20, 17, 13, 12)
val planetColors = Array(
Color(230,230,230),
Color(255,210,100),
Color(80,200,255),
Color(255,130,80),
Color(255,190,80),
Color(255,230,120),
Color(80,255,255),
Color(120,140,255)
)
val moonNames = Array(
Array[String](),
Array[String](),
Array("Moon"),
Array("Phobos", "Deimos"),
Array("Io", "Europa", "Ganymede", "Callisto"),
Array("Titan", "Enceladus", "Mimas"),
Array("Titania", "Oberon"),
Array("Triton")
)
val moons = Array(0, 0, 1, 2, 4, 3, 2, 1)
def drawOrbit(cx: Double, cy: Double, r: Double) {
penUp()
setPosition(cx, cy)
setHeading(0)
forward(r)
setHeading(90)
setPenColor(Color(255,255,255))
setFillColor(noColor)
penDown()
arc(r, 360)
penUp()
}
def drawLabel(x: Double, y: Double, txt: String, col: Color) {
penUp()
setPosition(x, y)
setPenColor(col)
setFillColor(col)
setPenFont(new java.awt.Font("Arial", java.awt.Font.BOLD, 11))
penDown()
write(txt)
penUp()
}
def drawPlanet(orbit: Int, size: Int, col: Color, name: String, angle: Double, moonAngle: Double, numMoons: Int, mNames: Array[String]) {
val x = orbit * math.cos(angle)
val y = orbit * math.sin(angle)
// Draw planet
penUp()
setPosition(x, y)
setPenColor(col)
setFillColor(col)
dot(size * 2)
// Draw pointer line from planet outward
val dir = angle
val lx = x + (size + 25) * math.cos(dir)
val ly = y + (size + 25) * math.sin(dir)
// Pointer line
penUp()
setPosition(x + size * math.cos(dir), y + size * math.sin(dir))
setPenColor(Color(180,180,180))
penDown()
setPosition(lx, ly)
penUp()
// Planet name at end of pointer
drawLabel(lx, ly, name, Color(255,255,0))
// Draw moons
for (m <- 0 until numMoons) {
val moonOrbit = size + 12 + m * 16
// Moon orbit ring
penUp()
setPosition(x, y)
setHeading(0)
forward(moonOrbit)
setHeading(90)
setPenColor(Color(200,200,255))
setFillColor(noColor)
penDown()
arc(moonOrbit, 360)
penUp()
// Moon angle spread evenly
val mAngle = moonAngle + m * (2 * math.Pi / numMoons)
val moonX = x + moonOrbit * math.cos(mAngle)
val moonY = y + moonOrbit * math.sin(mAngle)
// Moon dot
penUp()
setPosition(moonX, moonY)
setPenColor(Color(255,255,255))
setFillColor(Color(255,255,255))
dot(4)
// Moon name above moon
drawLabel(moonX + 5, moonY + 5, mNames(m), Color(150,255,150))
}
}
animate {
clear()
setBackground(Color(0,0,20))
invisible()
// Draw all orbits
for (i <- 0 to 7) {
drawOrbit(0, 0, orbits(i))
}
// Sun layers
penUp()
setPosition(0, 0)
setPenColor(Color(255,80,0))
setFillColor(Color(255,80,0))
dot(100)
penUp()
setPosition(0, 0)
setPenColor(Color(255,160,0))
setFillColor(Color(255,160,0))
dot(80)
penUp()
setPosition(0, 0)
setPenColor(Color(255,220,0))
setFillColor(Color(255,220,0))
dot(60)
penUp()
setPosition(0, 0)
setPenColor(Color(255,240,100))
setFillColor(Color(255,240,100))
dot(40)
penUp()
setPosition(0, 0)
setPenColor(Color(255,255,220))
setFillColor(Color(255,255,220))
dot(20)
drawLabel(-12, -65, "Sun", Color(255,240,100))
// Draw all planets
drawPlanet(orbits(0), sizes(0), planetColors(0), "Mercury", a0, m0, moons(0), moonNames(0))
drawPlanet(orbits(1), sizes(1), planetColors(1), "Venus", a1, m1, moons(1), moonNames(1))
drawPlanet(orbits(2), sizes(2), planetColors(2), "Earth", a2, m2, moons(2), moonNames(2))
drawPlanet(orbits(3), sizes(3), planetColors(3), "Mars", a3, m3, moons(3), moonNames(3))
drawPlanet(orbits(4), sizes(4), planetColors(4), "Jupiter", a4, m4, moons(4), moonNames(4))
drawPlanet(orbits(5), sizes(5), planetColors(5), "Saturn", a5, m5, moons(5), moonNames(5))
drawPlanet(orbits(6), sizes(6), planetColors(6), "Uranus", a6, m6, moons(6), moonNames(6))
drawPlanet(orbits(7), sizes(7), planetColors(7), "Neptune", a7, m7, moons(7), moonNames(7))
// Saturn rings
val sx = orbits(5) * math.cos(a5)
val sy = orbits(5) * math.sin(a5)
val ss = sizes(5)
penUp()
setPosition(sx, sy)
setHeading(0)
forward(ss + 8)
setHeading(90)
setPenColor(Color(255,240,150))
setFillColor(noColor)
penDown()
arc(ss + 8, 360)
penUp()
setPosition(sx, sy)
setHeading(0)
forward(ss + 16)
setHeading(90)
setPenColor(Color(255,220,120))
setFillColor(noColor)
penDown()
arc(ss + 16, 360)
penUp()
setPosition(sx, sy)
setHeading(0)
forward(ss + 22)
setHeading(90)
setPenColor(Color(255,200,100))
setFillColor(noColor)
penDown()
arc(ss + 22, 360)
penUp()
// Update planet angles
a0 = a0 + 0.050
a1 = a1 + 0.031
a2 = a2 + 0.020
a3 = a3 + 0.015
a4 = a4 + 0.008
a5 = a5 + 0.005
a6 = a6 + 0.003
a7 = a7 + 0.002
// Update moon angles
m0 = m0 + 0.30
m1 = m1 + 0.18
m2 = m2 + 0.12
m3 = m3 + 0.09
m4 = m4 + 0.05
m5 = m5 + 0.03
m6 = m6 + 0.02
m7 = m7 + 0.01
}