Code Sketch


solar system
By: Shreyas jadhav
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
}