Metropoli BBS
VIEWER: orbit2p.c MODE: TEXT (ASCII)
/* ***********************************************************************
   *									 *
   *		      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();
}



[ RETURN TO DIRECTORY ]