    GlowScript 2.7 VPython
    #Travelling to Mars
    #Developed by A.Titus
    #pos unit is m
    #time unit is s

    #pos and vel generated by http://ssd.jpl.nasa.gov/horizons.cgi

    #Aug 29, 2015

    #no z components
    marspos=1000*vec(-1.176389005286295E+08,2.135936464902488E+08,0)
    marsvel=1000*vec(-2.027713823922661E+01,-9.661960006152405E+00,0)
    earthpos=1000*vec(1.376368513677354E+08,-6.342242292720988E+07,0)
    earthvel=1000*vec(1.203162796791987E+01,2.691852057718956E+01,0)

    scene = display(width=430, height=400)
    scene.append_to_title("""<br>When Earth passes between Mars and the Sun, the simulation will stop.<br> Click the simulation to start it again.<br> The synodic period is the time for Earth to pass between Mars and the Sun.""")
    #set the scene's range to avoid autoscaling
    scene.range=1.5*mag(marspos)

    #constants
    AU=1000*149597871 #1 astronomical unit in m
    G=6.67384e-11

    #diameters for drawing Sun, Mars, and Earth. It is not to scale
    Dsun=0.2*AU
    Dearth=0.1*AU
    Dmars=0.1*AU

    # masses
    Msun=1.989e30
    Mearth=5.97219e24
    Mmars=6.4185e23

    #define velocity and momentum
    vearth=earthvel
    vmars=marsvel
    pearth=Mearth*vearth
    pmars=Mmars*vmars

    #time
    dt=2*3600 #use 24 to be faster, rocket use 2 written by lookang
    day=24*3600
    t=0

    #create 3D objects
    sun=sphere(pos=vec(0,0,0), radius=Dsun/2, color=color.yellow)
    mars=sphere(pos=marspos, radius=Dmars/2, color=color.red, make_trail=True, trail_type="curve",interval=1, retain=1000)
    earth=sphere(pos=earthpos, radius=Dearth/2, color=color.blue, make_trail=True,trail_type="curve",interval=1, retain=1000)

    #create labels for displaying time and a message string
    tstr="Time: {:.0f} days".format(0)
    tlabel=label(pos=vector(0,1.2*mag(marspos),0), text=tstr)
    launchstr="Synodic Period: "
    launchlabel=label(pos=vector(0,-1.2*mag(marspos),0), text=launchstr)

    # relative positions of mars and earth
    suntomars=mars.pos-sun.pos
    suntoearth=earth.pos-sun.pos

    # change in sign of the cross product can be used to find opposition
    cproduct=cross(suntoearth,suntomars)
    cproductsign=1
    oldproductsign=1

    #turn off autocaling now that the scene is set
    scene.autoscale=False

    # times for oppositions; the difference is the synodic period
    ti=0
    tf=0

    while 1:
        rate(200)

        #starting message
        if(t==0):
            launchstr="Click to Start"
            launchlabel.text=launchstr
            scene.waitfor('click')
            launchstr="Running..."
            launchlabel.text=launchstr

        #earth
        r=earth.pos-sun.pos
        rmag=mag(r)
        runit=norm(r)
        Fearth=-G*Msun*Mearth/rmag**2*runit
        pearth=pearth+Fearth*dt
        earth.pos=earth.pos+pearth/Mearth*dt

        #mars
        r=mars.pos-sun.pos
        rmag=mag(r)
        runit=norm(r)
        Fmars=-G*Msun*Mmars/rmag**2*runit
        pmars=pmars+Fmars*dt
        mars.pos=mars.pos+pmars/Mmars*dt

        #use change in sign of cross product to find opopsition
        suntomars=mars.pos-sun.pos
        suntoearth=earth.pos-sun.pos
        cproduct=cross(suntoearth,suntomars)
        oldcproductsign=cproductsign
        if(cproduct.z>=0):
            cproductsign=1
        else:
            cproductsign=-1
        # opposition occurs
        if(oldcproductsign>0 and cproductsign<0):
            if(ti==0):
                ti=t/day
                launchstr="Earth Transit at t="+ti+" days. Click to Continue."
                launchlabel.text=launchstr
                scene.waitfor('click')
                launchstr="Running..."
                launchlabel.text=launchstr
            else if(ti>0 and tf==0):
                tf=t/day
                transit=tf-ti
                launchstr="Earth Transit at t="+tf+" days.\n Synodic period="+transit+" days = {:.1f} months.\n Click to Continue.".format(transit/30.4)
                launchlabel.text=launchstr
                scene.waitfor('click')
                launchstr="Running..."
                launchlabel.text=launchstr

        #update time and time label
        t=t+dt
        tstr="Time: {:.0f} days".format(t/day)
        tlabel.text=tstr