1. orbits
OK, this is for games programmers and physics majors,
I have my little orbitting planets program here that I've been messing
around with lately. After about 4 revolutions the sun runs off and
leaves the rest of the solar system behind. I can't find any reason for
this so any help would be appreciated. Also, my physics may not be
quite right so any suggestions of how to make it more realistic would be
considdered as well.
Note that the little lines sticking out of the planets shows their
current speed and direction.
Sincerely,
Lewis Townsend
LewisArt
---------------------CODE------------------------
include graphics.e
constant pos = 1, dir = 2, mass = 3, kuler = 4,
scale = 15, -- scales view down
X = 1, Y = 2, -- generic x/y positions in ordered pair
center = {320, 240} -- center of screen
object universe, junk, n -- n is the number of the centered planet
junk = graphics_mode (18)
universe = {{{2500, 3000}, {0, 0}, 1000, YELLOW},--sets up everything
{{500, 3000}, {0, 20}, 100, CYAN},
{{1000, 3000}, {0, 30}, 100, GREEN},
{{1500, 3000}, {0, 40}, 100, WHITE},
{{3500, 3000}, {0, -40}, 100, BLUE},
{{4000, 3000}, {0, -30}, 100, BROWN},
{{4500, 3000}, {0, -20}, 100, MAGENTA}}
function convert (sequence c)-- converts a vector into a distance of 1
object s -- speed (distance of vector)
while 1 do
s = sqrt (c [X] * c [X] + c [Y] * c [Y]) --finds distance
--of vector
if s > 1 then
c = c/s -- resets vector
else return c
end if
end while
end function
function dist2d (sequence p1, sequence p2) --find 2 diminsional
--distance
return sqrt (((p1 [1] - p2 [1]) * (p1 [1] - p2 [1])) +
((p1 [2] - p2 [2]) * (p1 [2] - p2 [2])))
end function
procedure delay () -- unoptimized delay routine
object t -- I don't want to include machine.e
t = time ()
while time () - t < .0010 do end while
end procedure
function recalc (sequence U) -- calculates new directions and
-- positions
object this, that, other -- for each object effected by the
-- gravity
for i = 1 to length (U) do -- and positions of all the others
this = U [i]
other = U [1..i-1] & U [i+1..length(U)]
for j = 1 to length (other) do
that = other [j]
-- THESE COMENTED LINES DEAL WITH COLLISION DETECTION AND WHAT TO DO
-- WITH THE OBJECTS IF THEY COLLIDE. UNCOMENT THEM AND THEY STICK
-- TOGETHER WHEN THEY HIT INSTEAD OF BOUNCING OFF AT THE CORRECT --
ANGLES
-- if dist2d (this [pos], that [pos]) <= this [mass]/2 + that
--[mass]/2 then
-- this [dir] = this [dir] * (this [dir] - that [dir]) / --(this
[mass]/2)
-- else
this [dir] = this [dir] - convert(this [pos] - that [pos])
*( that [mass] - this [mass])
/(dist2d (this [pos], that [pos]) +.0001)
-- end if
end for
this [pos] = (this [pos] + this [dir])
U [i] = this
end for
return U
end function
procedure drawstuff (sequence U, atom c) -- draw the objects
for i = 1 to length (U) do
ellipse (c * U [i] [kuler], 1, -- draw objects
((U [i] [pos]) - (U [i] [mass]/2) - (U [n] [pos])) /scale
+center,
((U [i] [pos]) + (U [i] [mass]/2) - (U [n] [pos])) /scale
+center)
draw_line (c * (U [i] [kuler]+8), -- draw direction lines
{((U [i] [pos]) - (U [n] [pos])) /scale +center,
(((U [i] [pos]) - (U [n] [pos])) /scale +center + (U [i]
[dir]))})
end for
end procedure
n = 1 -- begin counter is on the sun (or first object)
while 1 do
junk = get_key ()
if junk = 27 then exit
elsif junk = 32 then n = n + 1
if n > length (universe) then n = 1 end if
--clear_screen () -- this doesn't seem to be necesary
end if
universe = recalc (universe) -- recalculate universe
drawstuff (universe ,1) -- draw the universe
position (30,1) puts (1,"Spacebar cycles through objects and ESC
exits")
delay () -- delay while the stuff is drawn
drawstuff (universe ,0) -- erase the universe
end while
junk = graphics_mode (-1) -- revert back to original graphics
-- mode so windows can kill the window
______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com
2. Re: orbits
Hey Lewis, can you resend that as an attachment -- it gut all funktified, and
won't
run.
thx
snortboy
3. Re: orbits
Haven't you heard? The universe is expanding!
Deuce
bjackson at printinginc.com
OK, this is for games programmers and physics majors,
I have my little orbitting planets program here that I've been messing
around with lately. After about 4 revolutions the sun runs off and
leaves the rest of the solar system behind. I can't find any reason for
this so any help would be appreciated. Also, my physics may not be
quite right so any suggestions of how to make it more realistic would be
considdered as well.
Note that the little lines sticking out of the planets shows their
current speed and direction.
Sincerely,
Lewis Townsend
LewisArt
4. Re: orbits
- Posted by lithex <lithex at INTERGATE.BC.CA>
Oct 07, 1998
-
Last edited Oct 08, 1998
Lewis said
> I have my little orbitting planets program here that I've been messing
> around with lately. After about 4 revolutions the sun runs off and
> leaves the rest of the solar system behind. I can't find any reason for
> this so any help would be appreciated. Also, my physics may not be
> quite right so any suggestions of how to make it more realistic would be
> considdered as well.
I think that you've rediscovered the fact that orbital systems are in
general unstable. In terms of analysis, the future trajectories of
two bodies acting under the influence of gravity only is completely predictable,
but the trajectories of three or more bodies is not predictable.
I've written gravity simulations that demonstrate the same thing as
you've discovered. No matter how finely I tuned the initial
parameters, eventually, if I had more than three objects, everything
would just go shooting out of my viewing space.
Instead of trying to simulate the solar system, I tried just putting
one hundred masses evenly spaced on a grid, and plotted their
trajectories in 2d. What happened was I started to get solar system
like features. Most of the masses would shoot off, but some would
glom together, and the gloms would start to orbit each other.
You might want to try that with your code.
Bye
Martin
or more bodies