12
\$\begingroup\$

If you model a satellite as a free point orbiting a body, you can pretty easily see it has 6 degrees of freedom: three for the X, Y, and Z position, and three for the X, Y, and Z velocity. However, using those 6 numbers doesn't tell you much about the orbit (and are constantly changing over time for any one satellite), so instead we usually define the shape of an orbit with 6 variables ( + time for 7 total) called the 'orbital elements' which together describe the shape of the orbit:

orbital elements image

Things you don't care about: The ascending node () is the point where the body passes through the equatorial plane of its planet such that it is 'above'/'north' afterwards. The reference direction(♈︎) is some known vector on the equatorial plane, so may be defined differently on different bodies. Earth's reference direction always points towards where the sun would be during the vernal equinox.

The six elements (usually) used to define an orbit are:

  • a: Semi-major axis. The size of the orbit.
  • e: Eccentricity. How circular/stretched the orbit is.
  • i: Inclination. The angle between the orbital plane and the equatorial plane.
  • Ω: Longitude of the ascending node. The clockwise angle on the equatorial plane(as viewed from the positive Z axis / north pole) between the reference direction and the ascending node.
  • ω: Argument of periapasis. The angle, on the orbital plane, from the ascending node to the periapsis (closest approach to the body).
  • ν: True anomaly. The angle, on the orbital plane, from the periapsis to the satellite.

If you look closely, you can see that two of these (Ω and ν) are boring if you're plotting lat/long points, since they just shift the graph left or right. To rectify this, we are setting these two parameters to zero (eg line of nodes == reference direction && satellite starts at periapsis), replacing them with the standard gravitational parameter μ and the length of the sidereal day I. Finally, we will define our time t as how long it's been since the last solar noon at a latitude of 0° on the vernal equinox.

Useful equations (or: What off Earth do I do with all these inputs?!?)

Radius: \$ r = \frac {a (1-e^2)}{1+e \cos ν } \;\; {\rm{or}} \;\; \vec r = \frac {a (1-e^2)}{1+e \cos ν } \begin{bmatrix} \cos \nu \\ \sin \nu \end{bmatrix} \$

Velocity: \$ r' = \sqrt {\mu \left( \frac{2}{r} - \frac{1}{a} \right) } \;\; {\rm{or}} \;\; \vec r' = \sqrt{\frac{\mu}{a (1-e^2)}} \begin{bmatrix} \sin \nu \\ e + \cos \nu \end{bmatrix} \$

Acceleration: \$ r'' = \frac{\mu}{r^2} \;\; {\rm{or}} \;\; \vec r'' = - \frac{\mu}{r^3} \vec r \$

Orbital period: \$ T = 2 \pi \sqrt {\frac{a^3}{\mu}} \$

Coord transfer from perifocal to equatorial (uses our assumption of Ω = 0):

\$ \begin{align*} \begin{bmatrix} x_e \\ y_e \\ z_e \\ \end{bmatrix} &= \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos i & -\sin i \\ 0 & \sin i & \cos i \end{bmatrix} \, \begin{bmatrix} \cos ω & -\sin ω & 0 \\ \sin ω & \cos ω & 0 \\ 0 & 0 & 1 \end{bmatrix}\, \begin{bmatrix} x_p \\ y_p \\ 0 \\ \end{bmatrix} \\ {\rm or} \;\;\;\;&= \begin{bmatrix} \cosω & -\sin\omega & 0 \\ \cos i\sin\omega & \cos i\cos\omega & -\sin i \\ \sin i \sin\omega & \sin i \cos\omega & \cos i \\ \end{bmatrix} \begin{bmatrix} x_p \\ y_p \\ 0 \\ \end{bmatrix} \end{align*} \$

From ECEF to lat/long: \$ \lambda = \operatorname{atan2}(y_e,x_e), \phi = \sin^{-1}\left(\frac{z_e}{\sqrt{x_e^2+y_e^2+z_e^2}}\right) \$

There are many ways you could go about implementing this challenge, but for now I'll outline the two ways I think would be easiest. You do not need to use either of these methods if you don't want to; but if you're feeling stuck they're here to help. If you think of some other way, but get stuck bc you need an equation I haven't added yet, let me know in a comment and I'll try to add it. Or if you spot an error in my equations, please let me know.

Method the First: The Long March

Uses vector form of acceleration equation + initial conditions. Start by picking some small Δt to be your step size. You add velocity * Δt to the position, and then add acceleration * Δt to velocity. If you keep going back and forth like this you get a list of points evenly spaced in time. With this method it doesn't matter if you convert from perifocal to equatorial before or after the march. Once you have the points in the equatorial coordinate system, you can rotate each point around the z axis by angular velocity * the time corresponding to that point to put it into ECEF. With your points in ECEF, you can use that last equation to end up in lat/long.

Method the Second: Bendy Curves

Define a curve in perifocal coords by replacing r and ν in the 'radius' equation with sqrt(x^2+y^2) and atan2(y,x). Convert the curve from perifocal to equatorial coords. Starting from the periapsis, walk along th curve in Δt*(velocity from the equation) sized steps, rotating each point by angular velocity * time corresponding to that point. This puts your point into ECEF, so you can then use the last equation to end up in lat/long.

I/O requirements

Input

7 total inputs: eccentricity, semi-major axis, inclination, argument of periapasis, standard gravitational parameter, length of the sidereal day, and initial time.

You may accept them in any order you want, and in whatever form you want. You may even swap individual elements with equivalent constructs, eg taking a true anomaly or mean anomaly as input instead of initial time. (do ask before doing anything too crazy though)

Output

This is a challenge, so you should output a graphical plot of the equatorial (not geodetic) latitude vs longitude of the ground path of the satellite. (so, technically, it's declination rather than latitude, but it's easier to just say lat/long)

If your language has no concept of graphics, like bf or sed; first of all, why would you choose that language for this challenge; and secondly, outputting a list of points work okay. (such that if someone else did plot those points as on line graph, it would look correct)

Your plot should cover at least a time period equal to the lcm of orbital period and sidereal day length. This means you are plotting the full path of the orbit relative to the ground, as after that it (should) repeat. If you're march along the curve, please try to keep error low enough that the end looks like it basically connects to the start.

Edge cases

If a value is undefined, you can treat it as if it were. For example, if e is 0 (meaning ω is undefined), ω will be input as 0, and you can treat it as if it was 0. (eg the rocket starts at the ascending node)

The semi-major axis, standard gravitational parameter, and length of the sidereal day are guaranteed to be positive; the eccentricity, argument of periapsis, inclination, and initial time are guaranteed to be a non-negative number less than one, 360, 180, and ∞ respectively. Or 1, 2π, π, and ∞ if you take angles as radians.

This is , so lowest bytes in each language wins

Test cases

Inputs:

e = .737
a = 26553
i = 63.4
ω = 270
μ = 398600
I = 86164
t = 19147

Output (molniya orbit): Molniya_orbit

Inputs:

e = .1
a = 42164
i = 10
ω = 20
μ = 398600
I = 86164
t = 0

Output (geosynchronous orbit): geosynchronous orbit

Inputs:

e = 0
a = 1
i = 90
ω = 0
μ = 39.5 (= (2pi)^2)
I = 2
t = 0

Output: another orbit

Inputs:

e = 0
a = 1
i = 0
ω = 0
μ = 39.5
I = 1
t = 0

Output ([not geo, but] -stationary orbit): stationary orbit

Inputs:

e = 0.5
a = 1
i = 50
ω = 0
μ = 39.5
I = 1
t = 0

Output: plot looks like an infinity

Inputs:

e = 0.75
a = 2
i = 130
ω = 180
μ = 79
I = 1
t = 0.5

Output: another plot

Inputs:

e = 0.5
a = 2
i = 40
ω = 180
μ = 79
I = 5
t = 1.25

Output: plot number the next

Inputs:

e = 0.5
a = 40
i = 60
ω = 180
μ = 787
I = 20
t = 0

Output: neat orbit

\$\endgroup\$
7
  • \$\begingroup\$ sandbox \$\endgroup\$
    – guest4308
    Commented Jul 5 at 12:22
  • 1
    \$\begingroup\$ Nice challlenge. I think it's gone unanswered because of the technical background needed to understand what's being asked. Formulas available at en.wikipedia.org/wiki/Kepler_orbit though they use α instead of μ for the gravitational parameter and introduce a symbol p=a(1-e**2) for the semi-latus rectum. There's an error in your cartesian (x,y) velocity formula - it should say μ (or α) not ω see equations 46 & 47 in the linked page. Also for ECEF to lat/long, the quantity on the right hand of the latitude formula is sin ϕ not ϕ An additional asin is needed to convert. \$\endgroup\$ Commented Jul 17 at 16:57
  • \$\begingroup\$ @LevelRiverSt I left out ℓ=a(1-e^2) since it's just another symbol to use; I was trying to keep it as simple as possible. thanks for the corrections and wiki page, no idea how I never spotted the kepler orbit page when I was linking everything. \$\endgroup\$
    – guest4308
    Commented Jul 17 at 17:15
  • 1
    \$\begingroup\$ OK, I only mentioned p so you could check my correction against the wikipedia formula. I'm going to try to provide an answer this week. \$\endgroup\$ Commented Jul 17 at 17:18
  • 1
    \$\begingroup\$ The wikipedia article gives radial & tangential velocity components in terms of angular momentum H=sqrt(αp)=constant=magnitude of cross product of displacement r and velocityr dot equations (26 and 3.) This reduces to scalar radius * tangential velocity, with the latter being simply H/r (equation 19) giving the result dTheta/dt=H/r**2 (equation 3) which is consistent with Kepler's observation that the orbit sweeps out equal area in equal time. I intend to use bendy curves method with dt/dTheta=r**2/H I tried the other method but this is shorter, more stable & gives the same result \$\endgroup\$ Commented Jul 17 at 17:41

1 Answer 1

5
\$\begingroup\$

Ruby, 322 347 bytes

->e,a,i,w,u,l,t{s="<svg viewBox='0-90 358 180'style='background:tan'>"
k=v=d=0.01
(r=(a-a*e*e)/(1+e*Math.cos(v+=d))
t+=r*r/(u*(a-a*e*e))**0.5*d
x,q=(1i**((v+w)/n=1i.arg)).rect
y,z=(q*1i**(i/n)).rect
s<<"<circle r='1'cx='#{(j=((-x-y*1i).arg-t/l*n*=4)%n*57).round(1)}'cy='#{(Math.asin(z)*-57).round(1)}'/>"
v>2*d||k=j)until v%6.29<d&&(j-k).abs<20
s}

Try it online!

A function returning an SVG image.

Byte count of code has increased to fully comply with OP requirement for simulation time while still providing a function that will terminate.

TIO.run will run up to 6 orbits without exceeding the output byte count (though newlines had to be deleted from output to make this fit.) This is enough to run any of the test cases including the last one. The Javascript editor built into this website will display any of the test cases in edit mode, but the byte limit for publication is about 3 orbits worth of data. Rounding will be removed in the golfed version, which will increase the size of the output.

I/O requirements

Arguments as follows

  Orbit shape:        e=eccentricity; a=semimajor axis        
  Orbit orientation:  i=inclination;  w=argument of periapsis (in radians)
  Grav. parameter:    u  
  Planetary rotation: l=day length;   t=start time

Per the test cases in the question, there are no specific physical units for a and u, but the orbital period arising from them is such that it is consistent with the units of time used for l and t.

Function returns an SVG image with coordinate 0,0 at the centre. Tan background is used delimit the edge of the plot (Tan is one of only two SVG colours with only 3 letters, the other being red.) Calculations are done in radians but the output is crudely scaled by a factor of 57 (180/PI=57.2958 rounded down.) The width of the plot is therefore only 358 plot units. Calculated longitude values must be reduced MOD 2*pi to ensure they stay in the plot. This means the plot goes from 0 to 2*pi, but negative signs in -x-q*1i impart a 180 degree phase shift so that the calculated 0 longitude is in the centre of the plot. Latitude is +/-90 (limited to +/-89.5 plot units by the scale factor.) The aspect ratio is such that 1 degree is equal length in both longitude and latitude directions (not stretched horizontally like the plots in the question.)

The image is missing some whitespace required by the SVG spec for golfing reasons, but works fine on Chrome and Edge.

EXPLANATION

The code uses formulas from en.wikipedia.org/wiki/Kepler_orbit. They use α instead of μ for the gravitational parameter and introduce a symbol p=a(1-e**2) for a parameter known as the the semi-latus rectum. For golfing reasons, this is expressed as (a-a*e*e) in the code.

The wikipedia article gives radial & tangential velocity components in terms of angular momentum H=sqrt(αp)=constant=magnitude of cross product of displacement r and velocity r dot equations (26 and 3.) This reduces to scalar radius * tangential velocity, with the latter being simply H/r (equation 19) giving the result dTheta/dt=H/r**2 (equation 3)

This is consistent with an observation made by Kepler (who first described the orbit of the planets) that the orbit sweeps out equal area in equal time. He attempted to explain the reason for this (but his reasoning was incorrect since he knew only Aristotlean mechanics.) Newton later explained the reason correctly. There were however anomalies in the orbit of Mercury which were later shown to be due to relativistic effects (and not a postulated additional planet, that had been given the provisional name Vulcan.)

variable names

variable names follow convention where possible, with Greek symbols replaced by the most visually similar Latin equivalent.

     s = string containing SVG image
     v = true anomaly (angle of satellite from periapsis)
     d = step size of true anomaly (delta v)
     z = z coordinate in earth centred coordinates
     y = y coordinate in earth centred coordinates
     x = x coordinate (in both coordinate systems, since orbital &
 equatorial planes cross at the x axis)
     q = y coordinate in orbital plane
     n = PI/2 or 2*PI (changed in the code for golfing reasons)
     j = longitude of current point
     k = longitude of 1st point plotted

Step 1: Initialise

Initialise s with an SVG header, and set d and v to the step size. Step size is 0.01 radians. The Ruby preprocessor likes to be sure that a variable will be initialised before it is used and does not like the fact that k is only assigned in a conditional. Therefore we conveniently initialise k to the same value as d to avoid an error. We open a bracket to start looping.

s="<svg viewBox='0-90 358 180'style='background:tan'>"
k=v=d=0.01
(

Step 2: calculate true anomaly and time

  • Increment angle v by the step size d
  • Calculate r according to the formula in the question
  • Calculate the time taken for this step and add it to t

To do this we use the formula from wikpedia dTheta/dt=H/r**2 except that we invert it to give dt/dTheta=r**2/H, where H=sqrt(αp) according to wikipedia notation, or H=sqrt(u*(a-a*e*e)) according to the nomenclature used here.

Note that the wedge-shaped area swept out in this step is r * r*d /2 . The time taken for the step is proportional to the area swept out, as observed by Kepler.

  r=(a-a*e*e)/(1+e*Math.cos(v+=d))
  t+=r*r/(u*(a-a*e*e))**0.5*d

Step 3: adjust the angle by the argument of periapsis, and convert to cartesian coordinates

The argument of periapsis w defines the angle of the lowest point of the orbit in the orbital plane. We add this to the true anomaly v to find the angle of the satellite in the orbital plane in radians. We convert this into a number of quarter-turns, and raise sqrt(-1)=1i to this power to give the cartesian coordinates x+qi, which we then extract into rectangular coordinates as 2 reals with the rect function. The conversion factor from radians to quarter-turns is pi/2 which is conveniently and accurately represented as n=1i.arg.

  x,q=(1i**((v+w)/n=1i.arg)).rect

In a similar way, we take q (the y coordinate in the orbital plane) and raise 1i to the power i/n (where i is inclination) to give the y and z coordinates in the earth centred system. Note that x,y,z form normalised coordinates: the magnitude of the vector x,y,z given by sqrt(x**2 + y**2 + z**2) is 1.

y,z=(q*1i**(i/n)).rect

Step 4: plot the point

Append instructions to plot a circle to s using the << operator. Plotting a circle for each point uses less characters than composing a path, since SVG would require the path fill to be switched off and path stroke to be switched on. Plotting separate circles also avoids issues that would occur where the path goes off one side of the plot and comes back on the other.

The angle of the satellite in the equatorial plane is given by (-x-y*1i).arg. To get the longitude we must subtract the effect of the planet's rotation -t/l*n*=4 where n is now increased to 2*PI. We take the output modulo n=2*PI to ensure the result is in the plottable range 0..2*PI and multiply by 57 to get a number in the range 0..358. The negative signs in -x-y*1i impart a phase shift of PI so that the longitude 0 appears in the centre of the plot. We keep track of the current longitude in j to decide when to stop iterating.

The latitude is obtained from the z coordinate in a similar way Math.asin(z)*-57. A negative sign is required because SVG considers high numbers to be at the bottom of the plot.

  s<<"<circle r='1'cx='#{(j=((-x-y*1i).arg-t/l*n*=4)%n*57).round(1)}'cy='#{(Math.asin(z)*-57).round(1)}'/>"

Step 5: decide when to stop iterating and return

Assuming the orbital period and day length are both integers (or have a rational ratio), the track of the satellite will repeat after the lowest common multiple of the orbital period and day length. In practice this ratio may not be perfect. The code keeps track of the longitude of the satellite at the start of the first and current orbit, and if it falls within a margin, it stops iterating and returns. The margin is set to 20 degrees (corresponding to a maximum of 18 orbits) but can be altered if desired.

  • Record the longitude on the 1st iteration (at the start of the 1st orbit): v>2*d||k=j

  • Keep iterating until the start of an orbit where the longitude is within 20 degrees of the 1st orbit: )until v%6.29<d&&(j-k).abs<20

  • Return from function with SVG image in string s}

    v>2*d||k=j)until v%6.29<d&&(j-k).abs<20
    s}
    

Sample output

Below is output for test case 5. It is recommended to hit run code snippet before expanding, to avoid getting a horizontally wide but vertically very short window requiring excessive vertical scrolling. It seems the plot is autosized based on the width only, so narrowing the browser window can help eliminate vertical scrolling.

<svg viewBox='0-90 358 180'style='background:tan'><circle r='1'cx='179.6'cy='-0.9'/><circle r='1'cx='179.8'cy='-1.3'/><circle r='1'cx='180.0'cy='-1.7'/><circle r='1'cx='180.2'cy='-2.2'/><circle r='1'cx='180.4'cy='-2.6'/><circle r='1'cx='180.7'cy='-3.1'/><circle r='1'cx='180.9'cy='-3.5'/><circle r='1'cx='181.1'cy='-3.9'/><circle r='1'cx='181.3'cy='-4.4'/><circle r='1'cx='181.5'cy='-4.8'/><circle r='1'cx='181.7'cy='-5.2'/><circle r='1'cx='181.9'cy='-5.7'/><circle r='1'cx='182.1'cy='-6.1'/><circle r='1'cx='182.3'cy='-6.5'/><circle r='1'cx='182.5'cy='-7.0'/><circle r='1'cx='182.7'cy='-7.4'/><circle r='1'cx='182.9'cy='-7.8'/><circle r='1'cx='183.1'cy='-8.3'/><circle r='1'cx='183.3'cy='-8.7'/><circle r='1'cx='183.5'cy='-9.1'/><circle r='1'cx='183.7'cy='-9.6'/><circle r='1'cx='183.9'cy='-10.0'/><circle r='1'cx='184.2'cy='-10.4'/><circle r='1'cx='184.4'cy='-10.9'/><circle r='1'cx='184.6'cy='-11.3'/><circle r='1'cx='184.8'cy='-11.7'/><circle r='1'cx='185.0'cy='-12.2'/><circle r='1'cx='185.2'cy='-12.6'/><circle r='1'cx='185.4'cy='-13.0'/><circle r='1'cx='185.7'cy='-13.4'/><circle r='1'cx='185.9'cy='-13.9'/><circle r='1'cx='186.1'cy='-14.3'/><circle r='1'cx='186.3'cy='-14.7'/><circle r='1'cx='186.5'cy='-15.2'/><circle r='1'cx='186.8'cy='-15.6'/><circle r='1'cx='187.0'cy='-16.0'/><circle r='1'cx='187.2'cy='-16.4'/><circle r='1'cx='187.4'cy='-16.8'/><circle r='1'cx='187.7'cy='-17.3'/><circle r='1'cx='187.9'cy='-17.7'/><circle r='1'cx='188.1'cy='-18.1'/><circle r='1'cx='188.3'cy='-18.5'/><circle r='1'cx='188.6'cy='-18.9'/><circle r='1'cx='188.8'cy='-19.4'/><circle r='1'cx='189.1'cy='-19.8'/><circle r='1'cx='189.3'cy='-20.2'/><circle r='1'cx='189.5'cy='-20.6'/><circle r='1'cx='189.8'cy='-21.0'/><circle r='1'cx='190.0'cy='-21.4'/><circle r='1'cx='190.3'cy='-21.8'/><circle r='1'cx='190.5'cy='-22.3'/><circle r='1'cx='190.8'cy='-22.7'/><circle r='1'cx='191.0'cy='-23.1'/><circle r='1'cx='191.3'cy='-23.5'/><circle r='1'cx='191.5'cy='-23.9'/><circle r='1'cx='191.8'cy='-24.3'/><circle r='1'cx='192.0'cy='-24.7'/><circle r='1'cx='192.3'cy='-25.1'/><circle r='1'cx='192.6'cy='-25.5'/><circle r='1'cx='192.8'cy='-25.9'/><circle r='1'cx='193.1'cy='-26.3'/><circle r='1'cx='193.4'cy='-26.7'/><circle r='1'cx='193.6'cy='-27.1'/><circle r='1'cx='193.9'cy='-27.5'/><circle r='1'cx='194.2'cy='-27.9'/><circle r='1'cx='194.5'cy='-28.3'/><circle r='1'cx='194.8'cy='-28.6'/><circle r='1'cx='195.0'cy='-29.0'/><circle r='1'cx='195.3'cy='-29.4'/><circle r='1'cx='195.6'cy='-29.8'/><circle r='1'cx='195.9'cy='-30.2'/><circle r='1'cx='196.2'cy='-30.6'/><circle r='1'cx='196.5'cy='-30.9'/><circle r='1'cx='196.8'cy='-31.3'/><circle r='1'cx='197.1'cy='-31.7'/><circle r='1'cx='197.4'cy='-32.1'/><circle r='1'cx='197.7'cy='-32.4'/><circle r='1'cx='198.1'cy='-32.8'/><circle r='1'cx='198.4'cy='-33.2'/><circle r='1'cx='198.7'cy='-33.5'/><circle r='1'cx='199.0'cy='-33.9'/><circle r='1'cx='199.4'cy='-34.2'/><circle r='1'cx='199.7'cy='-34.6'/><circle r='1'cx='200.0'cy='-35.0'/><circle r='1'cx='200.4'cy='-35.3'/><circle r='1'cx='200.7'cy='-35.7'/><circle r='1'cx='201.1'cy='-36.0'/><circle r='1'cx='201.4'cy='-36.3'/><circle r='1'cx='201.8'cy='-36.7'/><circle r='1'cx='202.1'cy='-37.0'/><circle r='1'cx='202.5'cy='-37.4'/><circle r='1'cx='202.9'cy='-37.7'/><circle r='1'cx='203.2'cy='-38.0'/><circle r='1'cx='203.6'cy='-38.3'/><circle r='1'cx='204.0'cy='-38.7'/><circle r='1'cx='204.4'cy='-39.0'/><circle r='1'cx='204.7'cy='-39.3'/><circle r='1'cx='205.1'cy='-39.6'/><circle r='1'cx='205.5'cy='-39.9'/><circle r='1'cx='205.9'cy='-40.2'/><circle r='1'cx='206.3'cy='-40.5'/><circle r='1'cx='206.7'cy='-40.8'/><circle r='1'cx='207.1'cy='-41.1'/><circle r='1'cx='207.6'cy='-41.4'/><circle r='1'cx='208.0'cy='-41.7'/><circle r='1'cx='208.4'cy='-42.0'/><circle r='1'cx='208.8'cy='-42.3'/><circle r='1'cx='209.3'cy='-42.6'/><circle r='1'cx='209.7'cy='-42.8'/><circle r='1'cx='210.1'cy='-43.1'/><circle r='1'cx='210.6'cy='-43.4'/><circle r='1'cx='211.0'cy='-43.6'/><circle r='1'cx='211.5'cy='-43.9'/><circle r='1'cx='212.0'cy='-44.1'/><circle r='1'cx='212.4'cy='-44.4'/><circle r='1'cx='212.9'cy='-44.6'/><circle r='1'cx='213.4'cy='-44.9'/><circle r='1'cx='213.8'cy='-45.1'/><circle r='1'cx='214.3'cy='-45.3'/><circle r='1'cx='214.8'cy='-45.5'/><circle r='1'cx='215.3'cy='-45.8'/><circle r='1'cx='215.8'cy='-46.0'/><circle r='1'cx='216.3'cy='-46.2'/><circle r='1'cx='216.8'cy='-46.4'/><circle r='1'cx='217.3'cy='-46.6'/><circle r='1'cx='217.8'cy='-46.8'/><circle r='1'cx='218.3'cy='-47.0'/><circle r='1'cx='218.8'cy='-47.2'/><circle r='1'cx='219.3'cy='-47.3'/><circle r='1'cx='219.8'cy='-47.5'/><circle r='1'cx='220.3'cy='-47.7'/><circle r='1'cx='220.9'cy='-47.8'/><circle r='1'cx='221.4'cy='-48.0'/><circle r='1'cx='221.9'cy='-48.1'/><circle r='1'cx='222.4'cy='-48.3'/><circle r='1'cx='223.0'cy='-48.4'/><circle r='1'cx='223.5'cy='-48.5'/><circle r='1'cx='224.0'cy='-48.6'/><circle r='1'cx='224.6'cy='-48.8'/><circle r='1'cx='225.1'cy='-48.9'/><circle r='1'cx='225.7'cy='-49.0'/><circle r='1'cx='226.2'cy='-49.1'/><circle r='1'cx='226.7'cy='-49.2'/><circle r='1'cx='227.3'cy='-49.2'/><circle r='1'cx='227.8'cy='-49.3'/><circle r='1'cx='228.3'cy='-49.4'/><circle r='1'cx='228.9'cy='-49.5'/><circle r='1'cx='229.4'cy='-49.5'/><circle r='1'cx='229.9'cy='-49.6'/><circle r='1'cx='230.5'cy='-49.6'/><circle r='1'cx='231.0'cy='-49.7'/><circle r='1'cx='231.5'cy='-49.7'/><circle r='1'cx='232.1'cy='-49.7'/><circle r='1'cx='232.6'cy='-49.7'/><circle r='1'cx='233.1'cy='-49.7'/><circle r='1'cx='233.6'cy='-49.7'/><circle r='1'cx='234.1'cy='-49.7'/><circle r='1'cx='234.6'cy='-49.7'/><circle r='1'cx='235.2'cy='-49.7'/><circle r='1'cx='235.7'cy='-49.7'/><circle r='1'cx='236.2'cy='-49.7'/><circle r='1'cx='236.6'cy='-49.6'/><circle r='1'cx='237.1'cy='-49.6'/><circle r='1'cx='237.6'cy='-49.5'/><circle r='1'cx='238.1'cy='-49.5'/><circle r='1'cx='238.5'cy='-49.4'/><circle r='1'cx='239.0'cy='-49.3'/><circle r='1'cx='239.5'cy='-49.3'/><circle r='1'cx='239.9'cy='-49.2'/><circle r='1'cx='240.3'cy='-49.1'/><circle r='1'cx='240.8'cy='-49.0'/><circle r='1'cx='241.2'cy='-48.9'/><circle r='1'cx='241.6'cy='-48.8'/><circle r='1'cx='242.0'cy='-48.7'/><circle r='1'cx='242.4'cy='-48.5'/><circle r='1'cx='242.8'cy='-48.4'/><circle r='1'cx='243.2'cy='-48.3'/><circle r='1'cx='243.5'cy='-48.1'/><circle r='1'cx='243.9'cy='-48.0'/><circle r='1'cx='244.2'cy='-47.8'/><circle r='1'cx='244.6'cy='-47.7'/><circle r='1'cx='244.9'cy='-47.5'/><circle r='1'cx='245.2'cy='-47.4'/><circle r='1'cx='245.5'cy='-47.2'/><circle r='1'cx='245.8'cy='-47.0'/><circle r='1'cx='246.1'cy='-46.8'/><circle r='1'cx='246.4'cy='-46.6'/><circle r='1'cx='246.6'cy='-46.4'/><circle r='1'cx='246.9'cy='-46.2'/><circle r='1'cx='247.1'cy='-46.0'/><circle r='1'cx='247.3'cy='-45.8'/><circle r='1'cx='247.6'cy='-45.6'/><circle r='1'cx='247.8'cy='-45.4'/><circle r='1'cx='247.9'cy='-45.1'/><circle r='1'cx='248.1'cy='-44.9'/><circle r='1'cx='248.3'cy='-44.7'/><circle r='1'cx='248.4'cy='-44.4'/><circle r='1'cx='248.6'cy='-44.2'/><circle r='1'cx='248.7'cy='-43.9'/><circle r='1'cx='248.8'cy='-43.7'/><circle r='1'cx='248.9'cy='-43.4'/><circle r='1'cx='249.0'cy='-43.1'/><circle r='1'cx='249.1'cy='-42.9'/><circle r='1'cx='249.1'cy='-42.6'/><circle r='1'cx='249.2'cy='-42.3'/><circle r='1'cx='249.2'cy='-42.0'/><circle r='1'cx='249.2'cy='-41.8'/><circle r='1'cx='249.2'cy='-41.5'/><circle r='1'cx='249.2'cy='-41.2'/><circle r='1'cx='249.2'cy='-40.9'/><circle r='1'cx='249.2'cy='-40.6'/><circle r='1'cx='249.1'cy='-40.3'/><circle r='1'cx='249.0'cy='-40.0'/><circle r='1'cx='249.0'cy='-39.7'/><circle r='1'cx='248.9'cy='-39.4'/><circle r='1'cx='248.8'cy='-39.0'/><circle r='1'cx='248.7'cy='-38.7'/><circle r='1'cx='248.5'cy='-38.4'/><circle r='1'cx='248.4'cy='-38.1'/><circle r='1'cx='248.2'cy='-37.7'/><circle r='1'cx='248.0'cy='-37.4'/><circle r='1'cx='247.9'cy='-37.1'/><circle r='1'cx='247.7'cy='-36.7'/><circle r='1'cx='247.4'cy='-36.4'/><circle r='1'cx='247.2'cy='-36.1'/><circle r='1'cx='247.0'cy='-35.7'/><circle r='1'cx='246.7'cy='-35.4'/><circle r='1'cx='246.4'cy='-35.0'/><circle r='1'cx='246.1'cy='-34.7'/><circle r='1'cx='245.8'cy='-34.3'/><circle r='1'cx='245.5'cy='-33.9'/><circle r='1'cx='245.2'cy='-33.6'/><circle r='1'cx='244.9'cy='-33.2'/><circle r='1'cx='244.5'cy='-32.9'/><circle r='1'cx='244.1'cy='-32.5'/><circle r='1'cx='243.7'cy='-32.1'/><circle r='1'cx='243.4'cy='-31.7'/><circle r='1'cx='242.9'cy='-31.4'/><circle r='1'cx='242.5'cy='-31.0'/><circle r='1'cx='242.1'cy='-30.6'/><circle r='1'cx='241.6'cy='-30.2'/><circle r='1'cx='241.1'cy='-29.9'/><circle r='1'cx='240.7'cy='-29.5'/><circle r='1'cx='240.2'cy='-29.1'/><circle r='1'cx='239.7'cy='-28.7'/><circle r='1'cx='239.1'cy='-28.3'/><circle r='1'cx='238.6'cy='-27.9'/><circle r='1'cx='238.1'cy='-27.5'/><circle r='1'cx='237.5'cy='-27.1'/><circle r='1'cx='236.9'cy='-26.8'/><circle r='1'cx='236.3'cy='-26.4'/><circle r='1'cx='235.7'cy='-26.0'/><circle r='1'cx='235.1'cy='-25.6'/><circle r='1'cx='234.5'cy='-25.2'/><circle r='1'cx='233.8'cy='-24.8'/><circle r='1'cx='233.2'cy='-24.4'/><circle r='1'cx='232.5'cy='-24.0'/><circle r='1'cx='231.8'cy='-23.5'/><circle r='1'cx='231.1'cy='-23.1'/><circle r='1'cx='230.4'cy='-22.7'/><circle r='1'cx='229.7'cy='-22.3'/><circle r='1'cx='228.9'cy='-21.9'/><circle r='1'cx='228.2'cy='-21.5'/><circle r='1'cx='227.4'cy='-21.1'/><circle r='1'cx='226.7'cy='-20.7'/><circle r='1'cx='225.9'cy='-20.3'/><circle r='1'cx='225.1'cy='-19.8'/><circle r='1'cx='224.3'cy='-19.4'/><circle r='1'cx='223.4'cy='-19.0'/><circle r='1'cx='222.6'cy='-18.6'/><circle r='1'cx='221.8'cy='-18.2'/><circle r='1'cx='220.9'cy='-17.8'/><circle r='1'cx='220.0'cy='-17.3'/><circle r='1'cx='219.2'cy='-16.9'/><circle r='1'cx='218.3'cy='-16.5'/><circle r='1'cx='217.4'cy='-16.1'/><circle r='1'cx='216.5'cy='-15.6'/><circle r='1'cx='215.5'cy='-15.2'/><circle r='1'cx='214.6'cy='-14.8'/><circle r='1'cx='213.7'cy='-14.4'/><circle r='1'cx='212.7'cy='-13.9'/><circle r='1'cx='211.8'cy='-13.5'/><circle r='1'cx='210.8'cy='-13.1'/><circle r='1'cx='209.8'cy='-12.7'/><circle r='1'cx='208.8'cy='-12.2'/><circle r='1'cx='207.8'cy='-11.8'/><circle r='1'cx='206.8'cy='-11.4'/><circle r='1'cx='205.8'cy='-10.9'/><circle r='1'cx='204.8'cy='-10.5'/><circle r='1'cx='203.8'cy='-10.1'/><circle r='1'cx='202.7'cy='-9.6'/><circle r='1'cx='201.7'cy='-9.2'/><circle r='1'cx='200.7'cy='-8.8'/><circle r='1'cx='199.6'cy='-8.3'/><circle r='1'cx='198.5'cy='-7.9'/><circle r='1'cx='197.5'cy='-7.5'/><circle r='1'cx='196.4'cy='-7.0'/><circle r='1'cx='195.3'cy='-6.6'/><circle r='1'cx='194.3'cy='-6.2'/><circle r='1'cx='193.2'cy='-5.7'/><circle r='1'cx='192.1'cy='-5.3'/><circle r='1'cx='191.0'cy='-4.9'/><circle r='1'cx='189.9'cy='-4.4'/><circle r='1'cx='188.8'cy='-4.0'/><circle r='1'cx='187.7'cy='-3.6'/><circle r='1'cx='186.6'cy='-3.1'/><circle r='1'cx='185.5'cy='-2.7'/><circle r='1'cx='184.4'cy='-2.3'/><circle r='1'cx='183.3'cy='-1.8'/><circle r='1'cx='182.1'cy='-1.4'/><circle r='1'cx='181.0'cy='-0.9'/><circle r='1'cx='179.9'cy='-0.5'/><circle r='1'cx='178.8'cy='-0.1'/><circle r='1'cx='177.7'cy='0.4'/><circle r='1'cx='176.6'cy='0.8'/><circle r='1'cx='175.5'cy='1.2'/><circle r='1'cx='174.4'cy='1.7'/><circle r='1'cx='173.2'cy='2.1'/><circle r='1'cx='172.1'cy='2.5'/><circle r='1'cx='171.0'cy='3.0'/><circle r='1'cx='169.9'cy='3.4'/><circle r='1'cx='168.8'cy='3.9'/><circle r='1'cx='167.7'cy='4.3'/><circle r='1'cx='166.6'cy='4.7'/><circle r='1'cx='165.5'cy='5.2'/><circle r='1'cx='164.5'cy='5.6'/><circle r='1'cx='163.4'cy='6.0'/><circle r='1'cx='162.3'cy='6.5'/><circle r='1'cx='161.2'cy='6.9'/><circle r='1'cx='160.2'cy='7.3'/><circle r='1'cx='159.1'cy='7.8'/><circle r='1'cx='158.0'cy='8.2'/><circle r='1'cx='157.0'cy='8.6'/><circle r='1'cx='155.9'cy='9.1'/><circle r='1'cx='154.9'cy='9.5'/><circle r='1'cx='153.9'cy='9.9'/><circle r='1'cx='152.9'cy='10.4'/><circle r='1'cx='151.8'cy='10.8'/><circle r='1'cx='150.8'cy='11.2'/><circle r='1'cx='149.8'cy='11.7'/><circle r='1'cx='148.8'cy='12.1'/><circle r='1'cx='147.9'cy='12.5'/><circle r='1'cx='146.9'cy='12.9'/><circle r='1'cx='145.9'cy='13.4'/><circle r='1'cx='145.0'cy='13.8'/><circle r='1'cx='144.0'cy='14.2'/><circle r='1'cx='143.1'cy='14.7'/><circle r='1'cx='142.2'cy='15.1'/><circle r='1'cx='141.3'cy='15.5'/><circle r='1'cx='140.3'cy='15.9'/><circle r='1'cx='139.5'cy='16.4'/><circle r='1'cx='138.6'cy='16.8'/><circle r='1'cx='137.7'cy='17.2'/><circle r='1'cx='136.8'cy='17.6'/><circle r='1'cx='136.0'cy='18.0'/><circle r='1'cx='135.2'cy='18.5'/><circle r='1'cx='134.3'cy='18.9'/><circle r='1'cx='133.5'cy='19.3'/><circle r='1'cx='132.7'cy='19.7'/><circle r='1'cx='131.9'cy='20.1'/><circle r='1'cx='131.1'cy='20.5'/><circle r='1'cx='130.4'cy='21.0'/><circle r='1'cx='129.6'cy='21.4'/><circle r='1'cx='128.9'cy='21.8'/><circle r='1'cx='128.1'cy='22.2'/><circle r='1'cx='127.4'cy='22.6'/><circle r='1'cx='126.7'cy='23.0'/><circle r='1'cx='126.0'cy='23.4'/><circle r='1'cx='125.3'cy='23.8'/><circle r='1'cx='124.7'cy='24.2'/><circle r='1'cx='124.0'cy='24.6'/><circle r='1'cx='123.4'cy='25.0'/><circle r='1'cx='122.8'cy='25.4'/><circle r='1'cx='122.2'cy='25.8'/><circle r='1'cx='121.6'cy='26.2'/><circle r='1'cx='121.0'cy='26.6'/><circle r='1'cx='120.4'cy='27.0'/><circle r='1'cx='119.8'cy='27.4'/><circle r='1'cx='119.3'cy='27.8'/><circle r='1'cx='118.8'cy='28.2'/><circle r='1'cx='118.2'cy='28.6'/><circle r='1'cx='117.7'cy='29.0'/><circle r='1'cx='117.2'cy='29.4'/><circle r='1'cx='116.8'cy='29.7'/><circle r='1'cx='116.3'cy='30.1'/><circle r='1'cx='115.9'cy='30.5'/><circle r='1'cx='115.4'cy='30.9'/><circle r='1'cx='115.0'cy='31.3'/><circle r='1'cx='114.6'cy='31.6'/><circle r='1'cx='114.2'cy='32.0'/><circle r='1'cx='113.8'cy='32.4'/><circle r='1'cx='113.5'cy='32.7'/><circle r='1'cx='113.1'cy='33.1'/><circle r='1'cx='112.8'cy='33.5'/><circle r='1'cx='112.5'cy='33.8'/><circle r='1'cx='112.1'cy='34.2'/><circle r='1'cx='111.8'cy='34.5'/><circle r='1'cx='111.6'cy='34.9'/><circle r='1'cx='111.3'cy='35.2'/><circle r='1'cx='111.0'cy='35.6'/><circle r='1'cx='110.8'cy='35.9'/><circle r='1'cx='110.6'cy='36.3'/><circle r='1'cx='110.4'cy='36.6'/><circle r='1'cx='110.2'cy='37.0'/><circle r='1'cx='110.0'cy='37.3'/><circle r='1'cx='109.8'cy='37.6'/><circle r='1'cx='109.7'cy='38.0'/><circle r='1'cx='109.5'cy='38.3'/><circle r='1'cx='109.4'cy='38.6'/><circle r='1'cx='109.3'cy='38.9'/><circle r='1'cx='109.2'cy='39.3'/><circle r='1'cx='109.1'cy='39.6'/><circle r='1'cx='109.0'cy='39.9'/><circle r='1'cx='109.0'cy='40.2'/><circle r='1'cx='108.9'cy='40.5'/><circle r='1'cx='108.9'cy='40.8'/><circle r='1'cx='108.9'cy='41.1'/><circle r='1'cx='108.9'cy='41.4'/><circle r='1'cx='108.9'cy='41.7'/><circle r='1'cx='108.9'cy='42.0'/><circle r='1'cx='108.9'cy='42.2'/><circle r='1'cx='109.0'cy='42.5'/><circle r='1'cx='109.0'cy='42.8'/><circle r='1'cx='109.1'cy='43.1'/><circle r='1'cx='109.2'cy='43.3'/><circle r='1'cx='109.3'cy='43.6'/><circle r='1'cx='109.4'cy='43.8'/><circle r='1'cx='109.5'cy='44.1'/><circle r='1'cx='109.7'cy='44.3'/><circle r='1'cx='109.8'cy='44.6'/><circle r='1'cx='110.0'cy='44.8'/><circle r='1'cx='110.2'cy='45.1'/><circle r='1'cx='110.4'cy='45.3'/><circle r='1'cx='110.6'cy='45.5'/><circle r='1'cx='110.8'cy='45.7'/><circle r='1'cx='111.0'cy='45.9'/><circle r='1'cx='111.2'cy='46.2'/><circle r='1'cx='111.5'cy='46.4'/><circle r='1'cx='111.8'cy='46.6'/><circle r='1'cx='112.0'cy='46.8'/><circle r='1'cx='112.3'cy='46.9'/><circle r='1'cx='112.6'cy='47.1'/><circle r='1'cx='112.9'cy='47.3'/><circle r='1'cx='113.2'cy='47.5'/><circle r='1'cx='113.6'cy='47.6'/><circle r='1'cx='113.9'cy='47.8'/><circle r='1'cx='114.3'cy='47.9'/><circle r='1'cx='114.6'cy='48.1'/><circle r='1'cx='115.0'cy='48.2'/><circle r='1'cx='115.4'cy='48.4'/><circle r='1'cx='115.8'cy='48.5'/><circle r='1'cx='116.2'cy='48.6'/><circle r='1'cx='116.6'cy='48.7'/><circle r='1'cx='117.0'cy='48.9'/><circle r='1'cx='117.4'cy='49.0'/><circle r='1'cx='117.8'cy='49.1'/><circle r='1'cx='118.3'cy='49.2'/><circle r='1'cx='118.7'cy='49.2'/><circle r='1'cx='119.2'cy='49.3'/><circle r='1'cx='119.6'cy='49.4'/><circle r='1'cx='120.1'cy='49.5'/><circle r='1'cx='120.6'cy='49.5'/><circle r='1'cx='121.1'cy='49.6'/><circle r='1'cx='121.5'cy='49.6'/><circle r='1'cx='122.0'cy='49.6'/><circle r='1'cx='122.5'cy='49.7'/><circle r='1'cx='123.0'cy='49.7'/><circle r='1'cx='123.5'cy='49.7'/><circle r='1'cx='124.1'cy='49.7'/><circle r='1'cx='124.6'cy='49.7'/><circle r='1'cx='125.1'cy='49.7'/><circle r='1'cx='125.6'cy='49.7'/><circle r='1'cx='126.1'cy='49.7'/><circle r='1'cx='126.7'cy='49.7'/><circle r='1'cx='127.2'cy='49.7'/><circle r='1'cx='127.7'cy='49.6'/><circle r='1'cx='128.3'cy='49.6'/><circle r='1'cx='128.8'cy='49.5'/><circle r='1'cx='129.3'cy='49.5'/><circle r='1'cx='129.9'cy='49.4'/><circle r='1'cx='130.4'cy='49.4'/><circle r='1'cx='131.0'cy='49.3'/><circle r='1'cx='131.5'cy='49.2'/><circle r='1'cx='132.0'cy='49.1'/><circle r='1'cx='132.6'cy='49.0'/><circle r='1'cx='133.1'cy='48.9'/><circle r='1'cx='133.7'cy='48.8'/><circle r='1'cx='134.2'cy='48.7'/><circle r='1'cx='134.7'cy='48.6'/><circle r='1'cx='135.3'cy='48.4'/><circle r='1'cx='135.8'cy='48.3'/><circle r='1'cx='136.3'cy='48.2'/><circle r='1'cx='136.9'cy='48.0'/><circle r='1'cx='137.4'cy='47.9'/><circle r='1'cx='137.9'cy='47.7'/><circle r='1'cx='138.5'cy='47.5'/><circle r='1'cx='139.0'cy='47.4'/><circle r='1'cx='139.5'cy='47.2'/><circle r='1'cx='140.0'cy='47.0'/><circle r='1'cx='140.5'cy='46.8'/><circle r='1'cx='141.0'cy='46.7'/><circle r='1'cx='141.5'cy='46.5'/><circle r='1'cx='142.0'cy='46.3'/><circle r='1'cx='142.5'cy='46.0'/><circle r='1'cx='143.0'cy='45.8'/><circle r='1'cx='143.5'cy='45.6'/><circle r='1'cx='144.0'cy='45.4'/><circle r='1'cx='144.5'cy='45.2'/><circle r='1'cx='145.0'cy='44.9'/><circle r='1'cx='145.4'cy='44.7'/><circle r='1'cx='145.9'cy='44.5'/><circle r='1'cx='146.4'cy='44.2'/><circle r='1'cx='146.8'cy='44.0'/><circle r='1'cx='147.3'cy='43.7'/><circle r='1'cx='147.7'cy='43.5'/><circle r='1'cx='148.2'cy='43.2'/><circle r='1'cx='148.6'cy='42.9'/><circle r='1'cx='149.1'cy='42.6'/><circle r='1'cx='149.5'cy='42.4'/><circle r='1'cx='149.9'cy='42.1'/><circle r='1'cx='150.4'cy='41.8'/><circle r='1'cx='150.8'cy='41.5'/><circle r='1'cx='151.2'cy='41.2'/><circle r='1'cx='151.6'cy='40.9'/><circle r='1'cx='152.0'cy='40.6'/><circle r='1'cx='152.4'cy='40.3'/><circle r='1'cx='152.8'cy='40.0'/><circle r='1'cx='153.2'cy='39.7'/><circle r='1'cx='153.6'cy='39.4'/><circle r='1'cx='154.0'cy='39.1'/><circle r='1'cx='154.4'cy='38.8'/><circle r='1'cx='154.8'cy='38.4'/><circle r='1'cx='155.2'cy='38.1'/><circle r='1'cx='155.5'cy='37.8'/><circle r='1'cx='155.9'cy='37.5'/><circle r='1'cx='156.3'cy='37.1'/><circle r='1'cx='156.6'cy='36.8'/><circle r='1'cx='157.0'cy='36.5'/><circle r='1'cx='157.3'cy='36.1'/><circle r='1'cx='157.7'cy='35.8'/><circle r='1'cx='158.0'cy='35.4'/><circle r='1'cx='158.4'cy='35.1'/><circle r='1'cx='158.7'cy='34.7'/><circle r='1'cx='159.1'cy='34.4'/><circle r='1'cx='159.4'cy='34.0'/><circle r='1'cx='159.7'cy='33.6'/><circle r='1'cx='160.0'cy='33.3'/><circle r='1'cx='160.4'cy='32.9'/><circle r='1'cx='160.7'cy='32.5'/><circle r='1'cx='161.0'cy='32.2'/><circle r='1'cx='161.3'cy='31.8'/><circle r='1'cx='161.6'cy='31.4'/><circle r='1'cx='161.9'cy='31.1'/><circle r='1'cx='162.2'cy='30.7'/><circle r='1'cx='162.5'cy='30.3'/><circle r='1'cx='162.8'cy='29.9'/><circle r='1'cx='163.1'cy='29.5'/><circle r='1'cx='163.4'cy='29.2'/><circle r='1'cx='163.7'cy='28.8'/><circle r='1'cx='164.0'cy='28.4'/><circle r='1'cx='164.3'cy='28.0'/><circle r='1'cx='164.5'cy='27.6'/><circle r='1'cx='164.8'cy='27.2'/><circle r='1'cx='165.1'cy='26.8'/><circle r='1'cx='165.4'cy='26.4'/><circle r='1'cx='165.6'cy='26.0'/><circle r='1'cx='165.9'cy='25.6'/><circle r='1'cx='166.2'cy='25.2'/><circle r='1'cx='166.4'cy='24.8'/><circle r='1'cx='166.7'cy='24.4'/><circle r='1'cx='166.9'cy='24.0'/><circle r='1'cx='167.2'cy='23.6'/><circle r='1'cx='167.5'cy='23.2'/><circle r='1'cx='167.7'cy='22.8'/><circle r='1'cx='168.0'cy='22.4'/><circle r='1'cx='168.2'cy='22.0'/><circle r='1'cx='168.5'cy='21.6'/><circle r='1'cx='168.7'cy='21.2'/><circle r='1'cx='168.9'cy='20.7'/><circle r='1'cx='169.2'cy='20.3'/><circle r='1'cx='169.4'cy='19.9'/><circle r='1'cx='169.7'cy='19.5'/><circle r='1'cx='169.9'cy='19.1'/><circle r='1'cx='170.1'cy='18.7'/><circle r='1'cx='170.4'cy='18.2'/><circle r='1'cx='170.6'cy='17.8'/><circle r='1'cx='170.8'cy='17.4'/><circle r='1'cx='171.1'cy='17.0'/><circle r='1'cx='171.3'cy='16.6'/><circle r='1'cx='171.5'cy='16.1'/><circle r='1'cx='171.7'cy='15.7'/><circle r='1'cx='172.0'cy='15.3'/><circle r='1'cx='172.2'cy='14.9'/><circle r='1'cx='172.4'cy='14.4'/><circle r='1'cx='172.6'cy='14.0'/><circle r='1'cx='172.8'cy='13.6'/><circle r='1'cx='173.1'cy='13.2'/><circle r='1'cx='173.3'cy='12.7'/><circle r='1'cx='173.5'cy='12.3'/><circle r='1'cx='173.7'cy='11.9'/><circle r='1'cx='173.9'cy='11.4'/><circle r='1'cx='174.1'cy='11.0'/><circle r='1'cx='174.3'cy='10.6'/><circle r='1'cx='174.6'cy='10.1'/><circle r='1'cx='174.8'cy='9.7'/><circle r='1'cx='175.0'cy='9.3'/><circle r='1'cx='175.2'cy='8.8'/><circle r='1'cx='175.4'cy='8.4'/><circle r='1'cx='175.6'cy='8.0'/><circle r='1'cx='175.8'cy='7.5'/><circle r='1'cx='176.0'cy='7.1'/><circle r='1'cx='176.2'cy='6.7'/><circle r='1'cx='176.4'cy='6.2'/><circle r='1'cx='176.6'cy='5.8'/><circle r='1'cx='176.8'cy='5.4'/><circle r='1'cx='177.0'cy='4.9'/><circle r='1'cx='177.2'cy='4.5'/><circle r='1'cx='177.4'cy='4.1'/><circle r='1'cx='177.7'cy='3.6'/><circle r='1'cx='177.9'cy='3.2'/><circle r='1'cx='178.1'cy='2.8'/><circle r='1'cx='178.3'cy='2.3'/><circle r='1'cx='178.5'cy='1.9'/><circle r='1'cx='178.7'cy='1.4'/><circle r='1'cx='178.9'cy='1.0'/><circle r='1'cx='179.1'cy='0.6'/><circle r='1'cx='179.3'cy='0.1'/><circle r='1'cx='179.5'cy='-0.3'/><circle r='1'cx='179.7'cy='-0.7'/>

\$\endgroup\$
5
  • 1
    \$\begingroup\$ Set k=a*(1-e*e) to be reused in r and t. Divide 10 in r to remove *0.01 in t. \$\endgroup\$
    – akamayu
    Commented 2 days ago
  • \$\begingroup\$ @akamayu k is now being used, but p=a-a*e*e is now available for a total savings of 6 bytes \$\endgroup\$
    – guest4308
    Commented 20 hours ago
  • 1
    \$\begingroup\$ @guest4308 Explanation in 1 hour, golfing tomorrow. The change from a*(1-e*e) to (a-a*e*e) will help combine the formulas where r is calculated & used into one, eliminating need for r and the proposed k. I've introduced k for a different purpose since akamayu's comment, to record longitude of 1st point plotted. By checking k against longitude at start of each new orbit (within a margin) the iterations are stopped if the ground track starts to repeat (LCM of orbit and planet rotation period.) I've changed some variable names (including removal of p) to facilitate explanation. \$\endgroup\$ Commented 20 hours ago
  • \$\begingroup\$ @LevelRiverSt it looks to me like the -6 bytes works with your code and with your explanation; what was the problem with it? \$\endgroup\$
    – guest4308
    Commented 11 hours ago
  • 1
    \$\begingroup\$ @guest4308 combining the formulas that generate and use r into one is a bigger saving t+=d*((a-a*e*e)**3/u)**0.5/(1+e*Math.cos(v+=d))**2 . I am trying out several golf ideas and will post the golfed version in about 12 hours (as I have other things to do today) in addition to the ungolfed version. \$\endgroup\$ Commented 10 hours ago

Not the answer you're looking for? Browse other questions tagged or ask your own question.