|
program Ley; const cuerpos = 13; WindowID = 129; {Resource ID for my
window} var x, y, vx, vy, ax, ay, m, dx, dy: array[1..cuerpos] of real; r,
dt: real; i, j, tiempo, der, aba: integer; myevent: eventrecord; mycolor:
array[1..cuerpos] of RGBColor; ret: rect; screenPort: GrafPtr; myWindow:
WindowPtr; {our window} wRecord: WindowRecord; {storage for
window record} screenRect: rect; {size of screen; could be
machine-dependent} fin: boolean; procedure color_Cuerpos; var i: integer;
begin for i := 2 to cuerpos do begin with mycolor[i] do begin blue
:= random; red := random; green := random; end; end; end; begin
getdatetime(randseed); {Get the port which is the whole screen, to use
when deactivating our window.} { This prevents the current grafPort
pointer from ever dangling.} GetWMgrPort(screenPort); {get whole screen port
that window mgr uses} {get window: use wRecord storage. Port is set to
that of the new window.} { GetNewCWindow posts an update event for
the new window,} { so it will be redrawn right away.} {
This is the one we want on top to start.} myWindow := GetNewCWindow(windowID,
nil, POINTER(-1)); {-1 => frontmost window} SetPort(myWindow); {and
start off with it} ShowWindow(MyWindow); {set up dragRect; we can drag
the window within it} screenRect := screenBits.bounds; {don't assume
screen size} {set drag rect to avoid menu bar, and keep at least 4
pixels on screen} SetRect(ret, 0, 0, screenRect.right, screenRect.bottom); der
:= screenRect.right; aba := screenRect.bottom; dt := 0.5; color_cuerpos; for
i := 2 to cuerpos do begin m[i] := abs(random mod aba) / 5 + 50; x[i] :=
abs(random mod der); y[i] := abs(random mod aba); end; m[1] := der; x[1] :=
der / 2; y[1] := aba / 2; repeat tiempo := tiempo + 1; if tiempo = 1000
then begin eraserect(ret); color_cuerpos; tiempo := 0 end; for
i := 1 to cuerpos do begin rgbForeColor(MyColor[i]);
paintcircle(round(x[i]), round(y[i]), round(m[i] / 10));
invertcircle(round(x[i]), round(y[i]), round(m[i] / 9)); ax[i] := 0; ay[i]
:= 0; for j := 1 to cuerpos do begin if j <> i then begin
dx[i] := (x[i] - x[j]); dx[i] := dx[i] * dx[i]; dy[i] := (y[i] -
y[j]); dy[i] := dy[i] * dy[i]; r := sqrt(dx[i] + dy[i]); if r >
M[i] then begin r := r * r * r; ax[i] := -M[j] * (x[i] - x[j])
/ r + ax[i]; ay[i] := -M[j] * (y[i] - y[j]) / r + ay[i]; end end
end; vx[i] := vx[i] + ax[i] * dt; vy[i] := vy[i] + ay[i] * dt; x[i] :=
x[i] + vx[i] * 2 * dt; y[i] := y[i] + vy[i] * 2 * dt; end; fin :=
GetNextEvent(everyEvent, myEvent); until (myEvent.what = keydown) or
(myEvent.what = mousedown) end.
|