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 20203 days, 9 hours, 53 minutes ago.