/* ***********************************************************************
* *
* Two Particle Orbit Simulator *
* *
* *
* Program by *
* Christopher D. Watkins *
* *
* 'C' conversion by *
* Larry Sharp *
* *
***********************************************************************
increase "dt" for speed
*/
#include "stdio.h"
#include "dos.h"
#include "conio.h"
#include "math.h"
#include "math.inc"
#include "graph.inc"
int MSize;
int x, y;
int oVx1, oVy1;
int oAx1, oAy1;
int oVx2, oVy2;
int oAx2, oAy2;
void InitMeters()
{
MSize=30;
Circle(MSize, MSize, MSize-4, 35);
oVx1=MSize;
oVy1=MSize;
oAx1=MSize;
oAy1=MSize;
oVx2=MSize;
oVy2=MSize;
oAx2=MSize;
oAy2=MSize;
}
void Meter(float dx, float dy, int *xt, int *yt, int Radius, int Color)
{
float r;
Draw(MSize, MSize, *xt, *yt, 0);
r=Radius/sqrt(SqrFP(dx)+SqrFP(dy))-5;
x=Round(dx*r)+MSize;
y=-Round(dy*r)+MSize;
*xt=x;
*yt=y;
Draw(MSize, MSize, x, y, Color);
}
float X1, Y1, Vx1, Vy1, Ax1, Ay1;
float X2, Y2, Vx2, Vy2, Ax2, Ay2;
float OneOverDistSqr, dt;
float Dx, Dy, Tx, Ty;
int M1, M2, Xp1, Yp1, Xp2, Yp2;
void main()
{
M1=6;
M2=6;
X1= -40; Y1= 00.0;
X2= 40; Y2= 00.0;
Vx1= 0.000; Vy1= 1.000;
Vx2= 0.000; Vy2=-1.000;
dt=0.1;
InitGraphics();
InitMeters();
do
{
Xp1=160+Trunc(X1);
Yp1=100-Trunc(Y1);
Xp2=160+Trunc(X2);
Yp2=100-Trunc(Y2);
Draw(Xp1, Yp1, Xp2, Yp2,0);
Circle(Xp1, Yp1, M1, 71);
Circle(Xp2, Yp2, M2, 143);
X1+=Vx1*dt;
Y1+=Vy1*dt;
X2+=Vx2*dt;
Y2+=Vy2*dt;
Dx=X2-X1;
Dy=Y2-Y1;
OneOverDistSqr=1.0/(Sqr(Dx)+Sqr(Dy));
Tx=Dx*OneOverDistSqr;
Ty=Dy*OneOverDistSqr;
Ax1=M2*Tx;
Ay1=M2*Ty;
Ax2=-M1*Tx;
Ay2=-M1*Ty;
Vx1+=Ax1*dt;
Vy1+=Ay1*dt;
Vx2+=Ax2*dt;
Vy2+=Ay2*dt;
Meter(Vx1, Vy1, &oVx1, &oVy1, 25, 51);
Meter(Ax1, Ay1, &oAx1, &oAy1, 12, 71);
Meter(Vx2, Vy2, &oVx2, &oVy2, 25, 123);
Meter(Ax2, Ay2, &oAx2, &oAy2, 12, 143);
Draw(Xp1, Yp1, Xp2, Yp2, 0);
Circle(Xp1, Yp1, M1, 0);
Circle(Xp2, Yp2, M2, 0);
}
while(!(kbhit()));
ExitGraphics();
}