
I added some generic orbit curves based on positions around the year 2000... The proc newSolarSystem(); takes some time longer now... ![]()
CODE
//usage:
//1. source the script
//2. Call newSolarSystem();
//3. Create the following runtime expression on the sun
// or any other object using the expression editor:
//
// string $update = updateSolarSystem(2000, 1, 1, 0, 0, 2, 2);
// eval($update);
//
// The first five arguments are: year, month, day, hour, minute as Start Time
// the next argument is an Identifier where:
// 0 = Realtime @ 25 fps
// 1 = every frame one minute
// 2 = every frame one hour
// 3 = every frame one day
// 4 = every frame one month
// 5 = every frame one year
//The next argument(float) is an additional time multiplier for acceleration/deceleration ...
//
//The Units are 1 maya = 100000 km
global proc newSolarSystem()
{
float $orbitT[8];
$orbitT[0] = 87.97/800;
$orbitT[1] = 224.70/800;
$orbitT[2] = 365.261/800;
$orbitT[3] = 686.98/800;
$orbitT[4] = 4332.71/800;
$orbitT[5] = 10759.50/800;
$orbitT[6] = 30685.00/800;
$orbitT[7] = 60190.00/800;
$orbitT[8] = 90550.00/800;
string $pname[8];
$pname[0] = "mercury";
$pname[1] = "venus";
$pname[2] = "earth";
$pname[3] = "mars";
$pname[4] = "jupiter";
$pname[5] = "saturn";
$pname[6] = "uranus";
$pname[7] = "neptune";
$pname[8] = "pluto";
float $scaleDivider = 100000;
$theStar = polySphere -radius (695000/$scaleDivider) -name sun
;
$PlanetMercury = polySphere -radius (2440 /$scaleDivider) -name mercury
;
$PlanetVenus = polySphere -radius (6052 /$scaleDivider) -name venus
;
$PlanetEarth = polySphere -radius (6378 /$scaleDivider) -name earth
;
$PlanetMars = polySphere -radius (3397 /$scaleDivider) -name mars
;
$PlanetJupiter = polySphere -radius (71492 /$scaleDivider) -name jupiter
;
$PlanetSaturn = polySphere -radius (60268 /$scaleDivider) -name saturn
;
$PlanetUranus = polySphere -radius (25559 /$scaleDivider) -name uranus
;
$PlanetNeptune = polySphere -radius (24766 /$scaleDivider) -name neptune
;
$PlanetPluto = polySphere -radius (1150 /$scaleDivider) -name pluto
;
global vector $mercury_coordinates;
global vector $venus_coordinates;
global vector $earth_coordinates;
global vector $mars_coordinates;
global vector $jupiter_coordinates;
global vector $saturn_coordinates;
global vector $uranus_coordinates;
global vector $neptune_coordinates;
global vector $pluto_coordinates;
vector $Tmercury_coordinates[];
vector $Tvenus_coordinates[];
vector $Tearth_coordinates[];
vector $Tmars_coordinates[];
vector $Tjupiter_coordinates[];
vector $Tsaturn_coordinates[];
vector $Turanus_coordinates[];
vector $Tneptune_coordinates[];
vector $Tpluto_coordinates[];
calculateAtDaySinceJ2000(0.00);
$CMercury = curve -d 1 -p ($mercury\_coordinates.x) ($mercury\_coordinates.y) ($mercury\_coordinates.z) -ws
;
$CVenus = curve -d 1 -p ($venus\_coordinates.x) ($venus\_coordinates.y) ($venus\_coordinates.z) -ws
;
$CEarth = curve -d 1 -p ($earth\_coordinates.x) ($earth\_coordinates.y) ($earth\_coordinates.z) -ws
;
$CMars = curve -d 1 -p ($mars\_coordinates.x) ($mars\_coordinates.y) ($mars\_coordinates.z) -ws
;
$CJupiter = curve -d 1 -p ($jupiter\_coordinates.x) ($jupiter\_coordinates.y) ($jupiter\_coordinates.z) -ws
;
$CSaturn = curve -d 1 -p ($saturn\_coordinates.x) ($saturn\_coordinates.y) ($saturn\_coordinates.z) -ws
;
$CUranus = curve -d 1 -p ($uranus\_coordinates.x) ($uranus\_coordinates.y) ($uranus\_coordinates.z) -ws
;
$CNeptune = curve -d 1 -p ($neptune\_coordinates.x) ($neptune\_coordinates.y) ($neptune\_coordinates.z) -ws
;
$CPluto = curve -d 1 -p ($pluto\_coordinates.x) ($pluto\_coordinates.y) ($pluto\_coordinates.z) -ws
;
rename $CMercury "Cmercury";
rename $CVenus "Cvenus";
rename $CEarth "Cearth";
rename $CMars "Cmars";
rename $CJupiter "Cjupiter";
rename $CSaturn "Csaturn";
rename $CUranus "Curanus";
rename $CNeptune "Cneptune";
rename $CPluto "Cpluto";
int $i;
int $z;
for($i = 0; $i < size($orbitT); $i++){
float $OrbitTotal = 0.0;
for($z = 0; $z < 800; $z++){
if($OrbitTotal <= ($orbitT[$i]*800)){
$OrbitTotal += $orbitT[$i];
switch ($pname[$i]) {
case "mercury":
calculateAtDaySinceJ2000($OrbitTotal);
$Tmercury_coordinates[$z] = $mercury_coordinates;
break;
case "venus":
calculateAtDaySinceJ2000($OrbitTotal);
$Tvenus_coordinates[$z] = $venus_coordinates;
break;
case "earth":
calculateAtDaySinceJ2000($OrbitTotal);
$Tearth_coordinates[$z] = $earth_coordinates;
break;
case "mars":
calculateAtDaySinceJ2000($OrbitTotal);
$Tmars_coordinates[$z] = $mars_coordinates;
break;
case "jupiter":
calculateAtDaySinceJ2000($OrbitTotal);
$Tjupiter_coordinates[$z] = $jupiter_coordinates;
break;
case "saturn":
calculateAtDaySinceJ2000($OrbitTotal);
$Tsaturn_coordinates[$z] = $saturn_coordinates;
break;
case "uranus":
calculateAtDaySinceJ2000($OrbitTotal);
$Turanus_coordinates[$z] = $uranus_coordinates;
break;
case "neptune":
calculateAtDaySinceJ2000($OrbitTotal);
$Tneptune_coordinates[$z] = $neptune_coordinates;
break;
case "pluto":
calculateAtDaySinceJ2000($OrbitTotal);
$Tpluto_coordinates[$z] = $pluto_coordinates;
break;
}
}
}
}
int $k;
for($k = 0; $k < size($Tmercury_coordinates)-1; $k++){
vector $currCord = $Tmercury_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Cmercury;
}
//fitBspline -ch 0 -tol 0.01 -n Mercury_Orbit Cmercury;
//rebuildCurve -rt 0 -s 500 Mercury_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Cmercury;
//delete Cmercury;
int $k;
for($k = 0; $k < size($Tvenus_coordinates)-1; $k++){
vector $currCord = $Tvenus_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Cvenus;
}
//fitBspline -ch 0 -tol 0.01 -n Venus_Orbit Cvenus;
//rebuildCurve -rt 0 -s 500 Venus_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Cvenus;
//delete Cvenus;
int $k;
for($k = 0; $k < size($Tearth_coordinates)-1; $k++){
vector $currCord = $Tearth_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Cearth;
}
//fitBspline -ch 0 -tol 0.01 -n Earth_Orbit Cearth;
//rebuildCurve -rt 0 -s 500 Earth_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Cearth;
//delete Cearth;
int $k;
for($k = 0; $k < size($Tmars_coordinates)-1; $k++){
vector $currCord = $Tmars_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Cmars;
}
//fitBspline -ch 0 -tol 0.01 -n Mars_Orbit Cmars;
//rebuildCurve -rt 0 -s 500 Mars_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Cmars;
//delete Cmars;
int $k;
for($k = 0; $k < size($Tjupiter_coordinates)-1; $k++){
vector $currCord = $Tjupiter_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Cjupiter;
}
//fitBspline -ch 0 -tol 0.01 -n Jupiter_Orbit Cjupiter;
//rebuildCurve -rt 0 -s 500 Jupiter_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Cjupiter;
//delete Cjupiter;
int $k;
for($k = 0; $k < size($Tsaturn_coordinates)-1; $k++){
vector $currCord = $Tsaturn_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Csaturn;
}
//fitBspline -ch 0 -tol 0.01 -n Saturn_Orbit Csaturn;
//rebuildCurve -rt 0 -s 500 Saturn_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Csaturn;
//delete Csaturn;
int $k;
for($k = 0; $k < size($Turanus_coordinates)-1; $k++){
vector $currCord = $Turanus_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Curanus;
}
//fitBspline -ch 0 -tol 0.01 -n Uranus_Orbit Curanus;
//rebuildCurve -rt 0 -s 500 Uranus_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Curanus;
//delete Curanus;
int $k;
for($k = 0; $k < size($Tneptune_coordinates)-1; $k++){
vector $currCord = $Tneptune_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Cneptune;
}
//fitBspline -ch 0 -tol 0.01 -n Neptune_Orbit Cneptune;
//rebuildCurve -rt 0 -s 500 Neptune_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Cneptune;
//delete Cneptune;
int $k;
for($k = 0; $k < size($Tpluto_coordinates)-1; $k++){
vector $currCord = $Tpluto_coordinates[$k];
//print ($currCord + " " + $k + "\n");
curve -a -p ($currCord.x) ($currCord.y) ($currCord.z) Cpluto;
}
//fitBspline -ch 0 -tol 0.01 -n Pluto_Orbit Cpluto;
//rebuildCurve -rt 0 -s 500 Pluto_Orbit;
closeCurve -ch 0 -ps 0 -rpo 1 -bb 0.5 -bki 0 -p 0.1 Cpluto;
//delete Cpluto;
//textScrollList -edit -append mercury planOrbitList;
}
global proc updateSolarSystem(int $Syear, int $Smonth, int $Sday, int $Shour, int $Smin, int $unit, float $timeMod)
{
float $frame = currentTime -q
;
switch ($unit) {
case 0:
float $dt = day_number($Syear, $Smonth, $Sday, (int)($Shour+$frame), $Smin);
float $d = ($dt * $timeMod)/60.0/60/25;
//print ("day = "+$dt);
break;
case 1:
float $dt = day_number($Syear, $Smonth, $Sday, (int)($Shour+$frame), $Smin);
float $d = ($dt * $timeMod)/60.0;
//print ("day = "+$dt);
break;
case 2:
float $dt = day_number($Syear, $Smonth, $Sday, (int)($Shour+$frame), $Smin);
float $d = $dt * $timeMod;
break;
case 3:
float $dt = day_number($Syear, $Smonth, (int)($Sday+$frame), $Shour, $Smin);
float $d = $dt * $timeMod;
break;
case 4:
float $dt = day_number($Syear, (int)($Smonth+$frame), $Sday, $Shour, $Smin);
float $d = $dt * $timeMod;
break;
case 5:
float $dt = day_number((int)($Syear+$frame), $Smonth, $Sday, $Shour, $Smin);
float $d = $dt * $timeMod;
break;
}
calculateAtDaySinceJ2000($d);
/*
connectControl starPosX ($theStar[0]+".translateX");
connectControl starPosY ($theStar[0]+".translateY");
connectControl starPosZ ($theStar[0]+".translateZ");
connectControl starRadius ($theStar[1]+".radius");
*/
}
global proc calculateAtDaySinceJ2000(float $d)
{
float $pi = 4 * atan(1);
float $degs = 180 / $pi;
float $rads = $pi / 180;
float $eps = 0.000000000001;
float $Mercury[8];
float $Venus[8];
float $Earth[8];
float $Mars[8];
float $Jupiter[8];
float $Saturn[8];
float $Uranus[8];
float $Neptune[8];
float $Pluto[8];
global vector $mercury_coordinates;
global vector $venus_coordinates;
global vector $earth_coordinates;
global vector $mars_coordinates;
global vector $jupiter_coordinates;
global vector $saturn_coordinates;
global vector $uranus_coordinates;
global vector $neptune_coordinates;
global vector $pluto_coordinates;
$Mercury = planetDataUsingEpochJ2000($Mercury, 0, $d);
$Venus = planetDataUsingEpochJ2000($Venus, 1, $d);
$Earth = planetDataUsingEpochJ2000($Earth, 2, $d);
$Mars = planetDataUsingEpochJ2000($Mars, 3, $d);
$Jupiter = planetDataUsingEpochJ2000($Jupiter, 4, $d);
$Saturn = planetDataUsingEpochJ2000($Saturn, 5, $d);
$Uranus = planetDataUsingEpochJ2000($Uranus, 6, $d);
$Neptune = planetDataUsingEpochJ2000($Neptune, 7, $d);
$Pluto = planetDataUsingEpochJ2000($Pluto, 8, $d);
vector $mercury_coordinates = heliocentric_coordinates($Mercury[8], $Mercury[3], $Mercury[7], $Mercury[4], $Mercury[2]);
vector $venus_coordinates = heliocentric_coordinates($Venus[8], $Venus[3], $Venus[7], $Venus[4], $Venus[2]);
vector $earth_coordinates = heliocentric_coordinates($Earth[8], $Earth[3], $Earth[7], $Earth[4], $Earth[2]);
vector $mars_coordinates = heliocentric_coordinates($Mars[8], $Mars[3], $Mars[7], $Mars[4], $Mars[2]);
vector $jupiter_coordinates = heliocentric_coordinates($Jupiter[8], $Jupiter[3], $Jupiter[7], $Jupiter[4], $Jupiter[2]);
vector $saturn_coordinates = heliocentric_coordinates($Saturn[8], $Saturn[3], $Saturn[7], $Saturn[4], $Saturn[2]);
vector $uranus_coordinates = heliocentric_coordinates($Uranus[8], $Uranus[3], $Uranus[7], $Uranus[4], $Uranus[2]);
vector $neptune_coordinates = heliocentric_coordinates($Neptune[8], $Neptune[3], $Neptune[7], $Neptune[4], $Neptune[2]);
vector $pluto_coordinates = heliocentric_coordinates($Pluto[8], $Pluto[3], $Pluto[7], $Pluto[4], $Pluto[2]);
int $index = (int)(currentTime -q
-1);
/*
float $Rmerc[10][3];
float $Rmerc[$index][0] = $mercury_coordinates.x;
float $Rmerc[$index][1] = $mercury_coordinates.y;
float $Rmerc[$index][2] = $mercury_coordinates.z;
*/
setAttr("mercury.translateX", $mercury_coordinates.x);
setAttr("mercury.translateY", $mercury_coordinates.y);
setAttr("mercury.translateZ", $mercury_coordinates.z);
setAttr("venus.translateX", $venus_coordinates.x);
setAttr("venus.translateY", $venus_coordinates.y);
setAttr("venus.translateZ", $venus_coordinates.z);
setAttr("earth.translateX", $earth_coordinates.x);
setAttr("earth.translateY", $earth_coordinates.y);
setAttr("earth.translateZ", $earth_coordinates.z);
setAttr("mars.translateX", $mars_coordinates.x);
setAttr("mars.translateY", $mars_coordinates.y);
setAttr("mars.translateZ", $mars_coordinates.z);
setAttr("jupiter.translateX", $jupiter_coordinates.x);
setAttr("jupiter.translateY", $jupiter_coordinates.y);
setAttr("jupiter.translateZ", $jupiter_coordinates.z);
setAttr("saturn.translateX", $saturn_coordinates.x);
setAttr("saturn.translateY", $saturn_coordinates.y);
setAttr("saturn.translateZ", $saturn_coordinates.z);
setAttr("uranus.translateX", $uranus_coordinates.x);
setAttr("uranus.translateY", $uranus_coordinates.y);
setAttr("uranus.translateZ", $uranus_coordinates.z);
setAttr("neptune.translateX", $neptune_coordinates.x);
setAttr("neptune.translateY", $neptune_coordinates.y);
setAttr("neptune.translateZ", $neptune_coordinates.z);
setAttr("pluto.translateX", $pluto_coordinates.x);
setAttr("pluto.translateY", $pluto_coordinates.y);
setAttr("pluto.translateZ", $pluto_coordinates.z);
/*
print ("a - mean distance (AU)) = " + $Mercury[0] +"\n");
print ("a - mean distance (AU)) = " + $Venus[0] +"\n");
print ("a - mean distance (AU)) = " + $Earth[0] +"\n");
print ("e - eccentricity of the ellipse = " + $Earth[1] +"\n");
print ("i - inclination (degrees) = " + $Earth[2] +"\n");
print ("O - longitude of ascending node (degrees) = " + $Earth[3] +"\n");
print ("w - longitude of perihelion (degrees) = " + $Earth[4] +"\n");
print ("L - mean longitude (degrees) = " + $Earth[5] +"\n");
print ("M - mean anomaly = " + $Earth[6] +"\n");
print ("V - true anomaly = " + $Earth[7] +"\n");
print ("R - helio-centric-radius = " + $Earth[8] +"\n");
*/
}
// ----------------------------------------------------------------------------------------------------------------------
// day number to/from J2000 (Jan 1.5, 2000)
global proc float day_number( int $y, int $m, int $d, int $hour, int $mins)
{
float $rv;
float $h = $hour + $mins / 60;
$rv = 367 * $y - floor(7*($y + floor(($m + 9)/12))/4) + floor(275*$m/9) + $d - 730531.5 + $h/24;
//$rv = 367 * $y - 7*($y + $m + 9 /12)/4 + 275*$m/9 + $d - 730531.5 + $h/24;
return $rv;
//rv := 367*y - 7* (y + (m + 9) div 12) div 4 + 275*m div 9 + d - 730531.5 + h / 24
//var rv = 367*y
// - Math.floor(7*(y + Math.floor((m + 9)/12))/4)
// + Math.floor(275*m/9) + d - 730531.5 + h/24;
//int $floor1 = floor(7 *($y + floor(($m + 9)/12))/4);
//int $floor2 = floor(275 * $m / 9) + $d - 730531.5 + $h / 24;
}
// ----------------------------------------------------------------------------------------------------------------------
// Compute the elements of the orbit for planet-i at day number-d
global proc float[] planetDataUsingEpochJ2000(float $pme[], int $i, float $d )
{
//planet Major Elements
float $pme[8];
float $pi = 4 * atan(1);
float $rads = $pi / 180;
// centuries since J2000
float $cy = $d / 36525;
//0 a - mean distance (AU) = SemiMajorAxis + ?
//1 e - eccentricity = Eccentricity + ?
//2 i - inclination = Inclination - ?
//3 O - longitude of ascending node = Ascending Node - ?
//4 w - longitude of perihelion = Long of Periocenter + ?
//5 L - mean longitude
//6 M - mean anomaly
//7 V - true anomaly
//8 R - helio-centric-radius
switch ($i)
{
// Mercury
case 0:
$pme[0] = 0.38709893 + 0.00000066* $cy;
$pme[1] = 0.20563069 + 0.00002527* $cy;
$pme[2] = ( 7.00487 - 23.51*$cy/3600)* $rads;
$pme[3] = (48.33167 - 446.30*$cy/3600)* $rads;
$pme[4] = (77.45645 + 573.57*$cy/3600)* $rads;
$pme[5] = mod2pi((252.25084 + 538101628.29*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = true_anomaly( $pme[6], $pme[1] );
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Venus
case 1:
$pme[0] = 0.72333199 + 0.00000092* $cy;
$pme[1] = 0.00677323 - 0.00004938* $cy;
$pme[2] = ( 3.39471 - 2.86*$cy/3600)* $rads;
$pme[3] = ( 76.68069 - 996.89*$cy/3600)* $rads;
$pme[4] = (131.53298 - 108.80*$cy/3600)* $rads;
$pme[5] = mod2pi((181.97973 + 210664136.06*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = (true_anomaly( $pme[6], $pme[1] ))*-1;
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Earth/Sun
case 2:
$pme[0] = 1.00000011 - 0.00000005* $cy;
$pme[1] = 0.01671022 - 0.00003804* $cy;
$pme[2] = ( 0.00005 - 46.94*$cy/3600)* $rads;
$pme[3] = (-11.26064 - 18228.25*$cy/3600)* $rads;
$pme[4] = (102.94719 + 1198.28*$cy/3600)* $rads;
$pme[5] = mod2pi((100.46435 + 129597740.63*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = true_anomaly( $pme[6], $pme[1] );
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Mars
case 3:
$pme[0] = 1.52366231 - 0.00007221* $cy;
$pme[1] = 0.09341233 + 0.00011902* $cy;
$pme[2] = ( 1.85061 - 25.47*$cy/3600)* $rads;
$pme[3] = ( 49.57854 - 1020.19*$cy/3600)* $rads;
$pme[4] = (336.04084 + 1560.78*$cy/3600)* $rads;
$pme[5] = mod2pi((355.45332 + 68905103.78*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = true_anomaly( $pme[6], $pme[1] );
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Jupiter
case 4:
$pme[0] = 5.20336301 + 0.00060737* $cy;
$pme[1] = 0.04839266 - 0.00012880* $cy;
$pme[2] = ( 1.30530 - 4.15*$cy/3600)* $rads;
$pme[3] = (100.55615 + 1217.17*$cy/3600)* $rads;
$pme[4] = ( 14.75385 + 839.93*$cy/3600)* $rads;
$pme[5] = mod2pi((34.40438 + 10925078.35*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = true_anomaly( $pme[6], $pme[1] );
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Saturn
case 5:
$pme[0] = 9.53707032 - 0.00301530* $cy;
$pme[1] = 0.05415060 - 0.00036762* $cy;
$pme[2] = ( 2.48446 + 6.11*$cy/3600)* $rads;
$pme[3] = (113.71504 - 1591.05*$cy/3600)* $rads;
$pme[4] = ( 92.43194 - 1948.89*$cy/3600)* $rads;
$pme[5] = mod2pi((49.94432 + 4401052.95*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = true_anomaly( $pme[6], $pme[1] );
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Uranus
case 6:
$pme[0] = 19.19126393 + 0.00152025* $cy;
$pme[1] = 0.04716771 - 0.00019150* $cy;
$pme[2] = ( 0.76986 - 2.09*$cy/3600)* $rads;
$pme[3] = ( 74.22988 - 1681.40*$cy/3600)* $rads;
$pme[4] = (170.96424 + 1312.56*$cy/3600)* $rads;
$pme[5] = mod2pi((313.23218 + 1542547.79*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = (true_anomaly( $pme[6], $pme[1] ))*-1;
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Neptune
case 7:
$pme[0] = 30.06896348 - 0.00125196* $cy;
$pme[1] = 0.00858587 + 0.00002510* $cy;
$pme[2] = ( 1.76917 - 3.64*$cy/3600)* $rads;
$pme[3] = (131.72169 - 151.25*$cy/3600)* $rads;
$pme[4] = ( 44.97135 - 844.43*$cy/3600)* $rads;
$pme[5] = mod2pi((304.88003 + 786449.21*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = (true_anomaly( $pme[6], $pme[1] ))*-1;
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
// Pluto
case 8:
$pme[0] = 39.48168677 - 0.00076912* $cy;
$pme[1] = 0.24880766 + 0.00006465* $cy;
$pme[2] = ( 17.14175 + 11.07*$cy/3600)* $rads;
$pme[3] = (110.30347 - 37.33*$cy/3600)* $rads;
$pme[4] = (224.06676 - 132.25*$cy/3600)* $rads;
$pme[5] = mod2pi((238.92881 + 522747.90*$cy/3600)*$rads);
$pme[6] = $pme[5] - $pme[4];
$pme[7] = true_anomaly( $pme[6], $pme[1] );
$pme[8] = heliocentric_radius( $pme[0], $pme[1], $pme[7]);
break;
}
return $pme;
}
// ----------------------------------------------------------------------------------------------------------------------
// return an angle in the range 0 to 2pi radians
global proc float mod2pi( float $x )
{
float $pi = 4 * atan(1);
float $b = $x / (2*$pi);
float $a = (2*$pi)*( $b - abs(floor($b)) );
if ($a < 0){
$a = (2*$pi) + $a;
}
return $a;
}
// ----------------------------------------------------------------------------------------------------------------------
// compute the true anomaly from mean anomaly using iteration
// M - mean anomaly in radians
// e - orbit eccentricity
global proc float true_anomaly( float $M, float $e )
{
float $V;
float $E1;
float $pi = 4 * atan(1);
float $degs = 180 / $pi;
float $rads = $pi / 180;
float $eps = 0.000000000001;
// initial approximation of eccentric anomaly
float $E = $M + $e * sin($M)(1.0 + $e cos($M));
// iterate to improve accuracy
do
{
$E1 = $E;
$E = $E1 - ($E1 - $e* sin($E1) - $M)/(1 - $e* cos($E1));
}
while (abs( $E - $E1 ) > $eps);
// convert eccentric anomaly to true anomaly
$V = 2*atan(sqrt((1 + $e)/(1 - $e))* tan(0.5*$E));
if ($V < 0) {
// modulo 2pi
$V = $V + (2*$pi);
}
return $V;
}
// ----------------------------------------------------------------------------------------------------------------------
// compute helio-centric-coordinates
global proc vector heliocentric_coordinates( float $R, float $O, float $V, float $w, float $i )
{
vector $HelioCoords;
float $AU = 149598000.0/100000;
float $XH = $R*(cos($O)cos($V + $w - $O) - sin($O)sin($V + $w - $O)*cos($i));
float $YH = $R*(sin($O)cos($V + $w - $O) + cos($O)sin($V + $w - $O)*cos($i));
float $ZH = $R*(sin($V + $w - $O)*sin($i));
$HelioCoords = <>;
return $HelioCoords;
}
// ----------------------------------------------------------------------------------------------------------------------
// compute helio-centric-radius
global proc float heliocentric_radius( float $a, float $e, float $V)
{
float $HelioRadius;
$HelioRadius = ($a*(1-($e + $e))) / (1 + $e * cos($V));
return $HelioRadius;
}