/* Jin Ding -- pd 3 -- 5/13/98 */
/* Smissile.cpp */

#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <glaux.h>
#include "/usr/pvm3/include/pvm3.h"
#define MAXVEL 400

const double PI=3.141592654;
const int MAXBAR=5;
int prevBar=MAXBAR,numbar;
double dist,range;
double bar[MAXBAR*4];

double abs (double x) {
  return sqrt(x*x);
}

int hitthebar (double x,double y) {
int i=0,hit=0;

  while ((i < numbar) && (!hit)) {
    hit = ((x < bar[i*4] + bar[i*4+1]) && (x > bar[i*4]) && (y < bar[i*4+2] + bar[i*4+3]) && (y > bar[i*4+2]));
    i++;
  }
  if (hit)
    if (prevBar == (i-1))
      hit = 0;
    else prevBar = i-1;
  return hit;
}

double calc (double theta,double vel) {
double a,x,y,time,tstep,vy,vx,xbarhit,vxorig;
int barhit=0,fac=-1;

  tstep = .01;
  time=0.0;
  a=32.0;
  y=.1;
  vx = vel*cos(theta);
  vy = vel*sin(theta);
  while (y > 0) {
    time += tstep;
    y = vy * time -.5 * a * time * time;
    if (barhit)
      x = xbarhit - fac*(vx*time-vxorig);
    else x = vx*time;
    if (numbar && hitthebar(x,y)) {
      barhit++;
      xbarhit = x;
      vxorig = vx*time;
      fac *= -1;
    }
  }
  return x;
}

int main () {
int master,msgtype,tasknum;
double theta,end;
//2*MAXVEL*20*3 
double result[MAXVEL*120];

  msgtype=0;
  pvm_recv(-1,msgtype);
  pvm_upkdouble(&dist,1,1);
  pvm_upkdouble(&range,1,1);
  pvm_upkint(&tasknum,1,1);
  pvm_upkdouble(bar,MAXBAR*4,1);
  pvm_upkint(&numbar,1,1);

  for (int j=0;j<20;j++) {
    theta=(20*tasknum+j)/4.0*PI/180.0;
    for (int i=0;i<2*MAXVEL*3;i+=3) {
      end=calc(theta,i/6.0);
      int index=j*6*MAXVEL+i;
      if (abs(end-dist) < range) {
        double factor = 1.2 - (((int)abs(end-dist))%(int)range)/range;
        result[index]=1.2*factor;
        result[index+1]=.4*factor*factor;
        result[index+2]=.1*factor*factor;
      } else {
	result[index]=0;
	result[index+1]=0;
	result[index+2]=0;
      }
    }
  }

  pvm_initsend(PvmDataDefault);
  pvm_pkint(&tasknum,1,1);
  pvm_pkdouble(result,MAXVEL*120,1);
  msgtype=5;
  master=pvm_parent();
  pvm_send(master,msgtype);

  pvm_exit();
}
