37 lines
1.5 KiB
Plaintext
37 lines
1.5 KiB
Plaintext
include c:\cxpl\codes; \intrinsic 'code' declarations
|
|
|
|
proc Ball(X0, Y0, R, C); \Draw a filled circle
|
|
int X0, Y0, R, C; \center coordinates, radius, color
|
|
int X, Y;
|
|
for Y:= -R to R do
|
|
for X:= -R to R do
|
|
if X*X + Y*Y <= R*R then Point(X+X0, Y+Y0, C);
|
|
|
|
|
|
def L = 2.0, \pendulum arm length (meters)
|
|
G = 9.81, \acceleration due to gravity (meters/second^2)
|
|
Pi = 3.14,
|
|
DT = 1.0/72.0; \delta time = screen refresh rate (seconds)
|
|
def X0=640/2, Y0=480/2; \anchor point = center coordinate
|
|
real S, V, A, T; \arc length, velocity, acceleration, theta angle
|
|
int X, Y; \ball coordinates
|
|
|
|
[SetVid($101); \set 640x480x8 graphic display mode
|
|
T:= Pi*0.75; V:= 0.0; \starting angle and velocity
|
|
S:= T*L;
|
|
repeat A:= -G*Sin(T);
|
|
V:= V + A*DT;
|
|
S:= S + V*DT;
|
|
T:= S/L;
|
|
X:= X0 + fix(L*100.0*Sin(T)); \100 scales to fit screen
|
|
Y:= Y0 + fix(L*100.0*Cos(T));
|
|
Move(X0, Y0); Line(X, Y, 7); \draw pendulum
|
|
Ball(X, Y, 10, $E\yellow\);
|
|
while port($3DA) & $08 do []; \wait for vertical retrace to go away
|
|
repeat until port($3DA) & $08; \wait for vertical retrace signal
|
|
Move(X0, Y0); Line(X, Y, 0); \erase pendulum
|
|
Ball(X, Y, 10, 0\black\);
|
|
until KeyHit; \keystroke terminates program
|
|
SetVid(3); \restore normal text screen
|
|
]
|