orbit

new topic     » topic index » view thread      » older message » newer message

Hello, someone was asking about an orbit program... Well, I recently
made this.  I know the physics aren't quite right and it all goes
haywire after about 4 perfect orbits but it has some nifty effects:

1. every thing's speed and direction is effected by everything elses
mass and relative position
2. the screen is always centered on the first object in the "universe"
sequence; it's the sun but it doesn't have to be.
3. the "universe" is set up for a cool orbit thing happenin'
4. Umm, I can't think of any more right now

Note that some commented lines got wrapped in my mailer so you might
want to fix them (only if you want it to run).


include graphics.e

constant pos = 1, dir = 2, mass = 3, kuler = 4,
scale = 15, X = 1, Y = 2, center = {320, 240}

object universe, junk

junk = graphics_mode (18)
universe = {{{2500, 3000}, {0,   0}, 1000, YELLOW},
            {{ 500, 3000}, {0,  20}, 100,  CYAN},
            {{1000, 3000}, {0,  30}, 100,  GREEN},
            {{1500, 3000}, {0,  40}, 100,  GRAY},
            {{3500, 3000}, {0, -40}, 100,  BLUE},
            {{4000, 3000}, {0, -30}, 100,  BROWN},
            {{4500, 3000}, {0, -20}, 100,  MAGENTA}}

function convert (sequence c)
        object s
        while 1 do
            s = sqrt (c [X] * c [X] + c [Y] * c [Y])
            if s > 1 then
                c = c/s
                --position (1,1) print (1, c)
            else return c
            end if
        end while
end function

function dist2d (sequence p1, sequence p2)
    return sqrt (((p1 [1] - p2 [1]) * (p1 [1] - p2 [1])) +
        ((p1 [2] - p2 [2]) * (p1 [2] - p2 [2])))
end function

procedure delay ()
    object t
    t = time ()
    while time () - t < .010 do end while
end procedure

function recalc (sequence U)
    object this, that, other
    for i = 1 to length (U) do
        this = U [i]
        other = U [1..i-1] & U [i+1..length(U)]
        for j = 1 to length (other) do
            that = other [j]
            --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)
        for i = 1 to length (U) do
            ellipse (c * U [i] [kuler], 1,
                ((U [i] [pos] - U [i] [mass]/2) /scale) + (-U [1] [pos] /scale
+center),
                ((U [i] [pos] + U [i] [mass]/2) /scale) + (-U [1] [pos] /scale
+center))
        end for
end procedure

while get_key () != 27 do
    universe = recalc (universe)
    drawstuff (universe ,1)
    delay ()
    drawstuff (universe ,0)
--    position (1,1) print (1, floor ((universe +.5)))
end while

junk = graphics_mode (-1)
--------------end code----------------------

todays asci code: alt + 253 = 2

sincerely,
Lewis Townsend

______________________________________________________
Get Your Private, Free Email at http://www.hotmail.com

new topic     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu