# Solar system simulations and the Hohmann transfer orbit

**URL:** <https://discourse.processing.org/t/solar-system-simulations-and-the-hohmann-transfer-orbit/16242>\
**Category:** Coding Questions\
**Created:** [December 8, 2019, 8:38am UTC](https://discourse.processing.org/t/solar-system-simulations-and-the-hohmann-transfer-orbit/16242 "2019-12-08T08:38:19Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![O-O](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/o-o/32/6947_2.png) [@O-O](https://discourse.processing.org/u/O-O)\
**Post date:** [December 8, 2019, 8:38am UTC](https://discourse.processing.org/t/solar-system-simulations-and-the-hohmann-transfer-orbit/16242/1 "2019-12-08T08:38:19Z")

</div>

```auto
import java.text.SimpleDateFormat;
import java.util.Date;
//========================================================================================
float eccentricity[] = {0,0.205,0.007,0.017,0.094,0.049,0.057,0.046,0.011};
float aphelion[] = {0.0,69.8,108.9,152.1,249.2,816.6,1514.5,3003.6,4545.7};
float inclination[] = {0.0,7.0,3.4,0.0,1.9,1.3,2.5,0.8,1.8};
float bodyRadius[] = {0.0,0.5,0.7,0.7,0.6,1.7,1.5,3,3};
float orbitPeriod[] = {0.0,126720.0,323568.0,525888.0,989280.0,6380640.0,15475680.0,44048160.0,86112000.0};
float epoch[]={0.0,13627665.75,13630579.0,13922899.58,14241140.2,18535221.46,25301781.93,20140822.57,74731252.68};

String alert = "Solar System Simulator by LGR";
String strCurrentTime = "";
String f1= "Press 'f'/'l'key To increase / decrease the speed of the revolution.";
String f2= "Press 'UP','DOWN','LEFT','RIGHT'key To adjust the camera angle.";
String f3= "Click on the mouse to turn off or turn on the Orbits.";
String f4= "Rotate the wheel of the mouse to zoom in or out.";
String camxy = "x/y of cam : ";
String introduce1 ="When simulating in real time, the speed of the simulations ";
String introduce2 ="was so slow that I tried to accelerate the time of the simulations.";

float camx = 0, camy = 0, camz = 0, scale = 1.0;
long currentTime = 0,startTime;
int BColorR[] = {255,0,255,43,255,209,255,41,41};
int BColorG[] = {255,123,0,255,177,122,86,100,100};
int BColorB[] = {255,255,0,0,68,0,210,255,255};
int center = 0,timeRate = 0,fastForward = 0,zoom = 1; 
//========================================================================================
void setup() {
  size(832,624,P3D);
  stroke(255);
  camx=1.250;
  camy=-2.850;
}
//========================================================================================
void draw() {
  background(0, 0, 0); 
  timeChange();
  showLetter();
     
     translate(width/2, height/2, 0);
  
      scale(scale);
      rotateX(camx);
      rotateY(camy);
      rotateZ(camz);
  
  fill(255,255,255); 
  sphere(15);
   
   for(int planeti=1;planeti<9;planeti++) {
   
     pushMatrix();
    
     rotateY(radians(inclination[planeti]));
    
    if(zoom==1){ 
      Orbit(planeti);
    }
    Planet(planeti);
    popMatrix();
  }
}
//========================================================================================
void Planet(int j) {
        float timeDiff = currentTime - epoch[j];
        if(timeDiff<0) timeDiff-=orbitPeriod[j];        
        float i = ((2*PI)/orbitPeriod[j])*timeDiff;

        float a = aphelion[j];
        float e = eccentricity[j];
        float r = (a*(1-(e*e)))/(1-(e*cos(i)));
        float x = r*cos(i);
        float y = r*sin(i);
  
          pushMatrix();
          translate(x, y, 0);
          noStroke();          
          fill(BColorR[j],BColorG[j],BColorB[j]);
          sphere(bodyRadius[j]*4);
          stroke(255);
          popMatrix();
}
//========================================================================================
void Orbit(int k) {
    float circumference = 2*PI;
    float a = aphelion[k];
    float e = eccentricity[k];
    float prevx = -1;
    float prevy = -1;
    for(float theta=0.0;theta<circumference;theta+=0.01) {
      float r = (a*(1-(e*e)))/(1-(e*cos(theta)));
      float x = r*cos(theta);
      float y = r*sin(theta);
      if(prevx == -1 && prevy == -1) {
        prevx = x;
        prevy = y;
      } else {
        line(prevx,prevy,x,y);
        prevx = x;
        prevy = y;
      }
    }
}
//========================================================================================
void showLetter() {
  
  textSize(20);
  fill(255,255,255);
  text(strCurrentTime, width/2-100, 20);
  text(camxy,20,510); 
  text(camx,150,510); 
  text(camy,220,510); 
  text(alert,20,530); 
  text(f1,20,550); 
  text(f2,20,570); 
  text(f3,20,590); 
  text(f4,20,610); 
  
  textSize(15);
  fill(255,255,255);
  text(introduce1, width/2-200, 50);
  text(introduce2, width/2-200, 63);
} 
//========================================================================================
void timeChange() { 
  println("time : "+timeRate);
  if(timeRate==0) { 
    if(fastForward==0) { 
      Date d = new Date(); 
      long x = d.getTime()/1000; 
      currentTime = x/60;
      fastForward = 1;
      timeRate = 1;
    } 
  }
  
else if(timeRate>0) {
      currentTime+=pow(2,timeRate);
  } 
  long oriCurrentTime = currentTime * 60 * 1000;
  println(oriCurrentTime);
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
  Date d2 = new Date(oriCurrentTime);
  String dTime = formatter.format(d2);
  strCurrentTime = dTime;
  println(strCurrentTime);
}
//========================================================================================
void mouseWheel(MouseEvent event) {
  float e = event.getCount();
  if (e<0) scale-=0.025;
  else scale+=0.025;
}
//========================================================================================
void mouseClicked() {
if(zoom==1){
  zoom = 0;
}
    else{
      zoom = 1;
    }
}
//========================================================================================
void keyPressed() { 

  if (key == 'F' || key == 'f') {
    if(timeRate<15){ 
      timeRate++; 
      } 
} 
else if (key == 'l' || key == 'L') { 
  if(timeRate>1) {
      timeRate--;
     }
  }
  
  else if (key == CODED) {
    if (keyCode == UP){ 
      camx+=0.05;
    }
    else if (keyCode == DOWN){
      camx-=0.05;
    }
    else if (keyCode == LEFT){
      camy-=0.05;
    }
    else if (keyCode == RIGHT){ 
      camy+=0.05;
    }

  }

}
//========================================================================================

```

This is the code for the solar system simulation. 😁  
I want to apply the Hohmann transfer orbit to this simulation. 😅  
(I’d like to get a destination input,  
and then visualize the Hohmann transfer orbit from Earth to destination.)  
But I can’t get the hang of it. 😭 😭  
Can you help me?

(Sites that show my goals : [https://transfercalculator.com/calculator/index.html](https://transfercalculator.com/calculator/index.html)  
🤚

---

<div class="post-metadata">

**Author:** ![Chrisir](https://yyz2.discourse-cdn.com/flex036/user_avatar/discourse.processing.org/chrisir/32/45_2.png) [@Chrisir](https://discourse.processing.org/u/Chrisir)\
**Post date:** [December 8, 2019, 12:03pm UTC](https://discourse.processing.org/t/solar-system-simulations-and-the-hohmann-transfer-orbit/16242/2 "2019-12-08T12:03:18Z")

</div>

See also

> **[Hohmann transfer orbit](https://en.wikipedia.org/wiki/Hohmann_transfer_orbit)**
>
> In orbital mechanics, the Hohmann transfer orbit (/ˈhoʊmən/) is an elliptical orbit used to transfer between two circular orbits of different radii around a central body in the same plane. The Hohmann transfer often uses the lowest possible amount of propellant in traveling between these orbits, but bi-elliptic transfers can beat it in some cases.
> The orbital maneuver to perform the Hohmann transfer uses two engine impulses, one to move a spacecraft onto the transfer orbit and a second to move o...
