orbitalBurn.frink

Download or view orbitalBurn.frink in plain text format


// This program draws the effects of a rocket changing an orbit.
//  All of the burns use the same change in speed  but burn in
// 4 different directions.
//

/** This file demonstrates how thrust in a rocket changes an orbit.   

   White:          Typical orbit
     Red:  Stop:   Slows down rocket
   Green:  Go:     Speeds up rocket
    Blue:  Down:   Burns downward toward planet
  Yellow:  Up:     Burns upward away from planet

   Each velocity change is regarded as instantaneous and occurs at the "top"
  of the diagram.

*/


[orbitalHeight, dv] = eval[input["Enter orbital changes",[["Height above ground", "1000 km"], ["Velocity change", "1600 km/hr"]]]]

y = earthradius + orbitalHeight
x = 0 miles

vy = 0 m/s

// Calculate horizontal velocity for a circular orbit.
// This is derived sybolically by orbit.frink.  It's amazing. Check it out.
vx = G^(1/2) earthmass^(1/2) (earthradius + orbitalHeight)^(-1/2)

println["vx = " + (vx -> "mph")]

// Calculate circular orbital period.
// This is derived sybolically by orbit.frink.  It's amazing. Check it out.
period = 2 pi vx^-1 (earthradius + orbitalHeight)
println["Period is " + (period -> HMS)]

g = new graphics
g.backgroundColor[0,0,0]
g.color[0,0,.5]
g.fillEllipseCenter[0, 0, 2 earthradius/mile, 2 earthradius/mile]
g.color[1,1,1]
g.stroke[30 km/mile]

drawOrbit[g, x, y, vx, vy, period]     // White: Nominal orbit

g.color[0,.5,1]                  // Blue: down: Accelerate towards earth.
drawOrbit[g, x, y, vx, vy-dv, period]

g.color[1,1,0]                  // Yellow: up:  Accelerate up
drawOrbit[g, x, y, vx, vy+dv, period]

g.color[1,0,0]
drawOrbit[g, x, y, vx-dv, vy, period]  // Red:  stop: Backwards (slow down)

g.color[0,1,0]
drawOrbit[g, x, y, vx+dv, vy, period*2]  // Green:  go: Forwards (speed up)

g.show[]
g.write["orbitalBurn.svg", 1000, undef]
g.write["orbitalBurn.html", 1000, undef]
g.write["orbitalBurn.png", 1000, undef]


drawOrbit[g, x, y, vx, vy, period=220 min] :=
{
   p = new polyline
   
   timestep = period/1000
   for t = 0 min to period step timestep
   {
      dsqr = x^2 + y^2
      a = G earthmass / dsqr
      theta = arctan[y,x]
      ax = - a cos[theta]
      ay = - a sin[theta]

      vx = vx + timestep ax
      vy = vy + timestep ay
      x = x + timestep vx
      y = y + timestep vy
      p.addPoint[x/mile,-y/mile]
   }

   g.add[p]
}


Download or view orbitalBurn.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 20217 days, 23 hours, 56 minutes ago.