#ifndef COLLIDE

#define COLLIDE

 

#include <stdio.h>

#include "iostream.h"

#include <stdlib.h>

#include <math.h>

 

#define free  1

#define collide 0

 

struct Polygon {

    int npoints;

    float x[10], y[10];

};

 

Polygon obs[20];

struct Vehicle{

   float x[4],y[4];

};

Vehicle car;

 

int numObstacles;

class Collision{

 

public:

    void collision(){}

    int collision(float,float);

    int c;

    coll(float, float);

    objcoll();

    polygon();

private:

   float x,y;

};

 

Collision::collision(float x1,float y1){

    x=x1;

    y=y1;

}

 

 

Collision::polygon(){

//------------Parking ---------------//

//numObstacles=7;

  

//World  Geometry

/* case 4

numObstacles=8;

   obs[0].npoints=4;

   obs[0].x[0]=0, obs[0].y[0]=0;

   obs[0].x[1]=100, obs[0].y[1]=0;

   obs[0].x[2]=100, obs[0].y[2]=280;

   obs[0].x[3]=0, obs[0].y[3]=280;

 

   obs[1].npoints=4;

   obs[1].x[0]=0, obs[1].y[0]=280;

   obs[1].x[1]=60, obs[1].y[1]=280;

   obs[1].x[2]=60, obs[1].y[2]=320;

   obs[1].x[3]=0, obs[1].y[3]=320;

 

  obs[2].npoints=4;

   obs[2].x[0]=0, obs[2].y[0]=320;

   obs[2].x[1]=100, obs[2].y[1]=320;

   obs[2].x[2]=100, obs[2].y[2]=500;

   obs[2].x[3]=0, obs[2].y[3]=500;

 

  obs[3].npoints=4;

   obs[3].x[0]=150, obs[3].y[0]=0;

   obs[3].x[1]=350, obs[3].y[1]=0;

   obs[3].x[2]=350, obs[3].y[2]=100;

   obs[3].x[3]=150, obs[3].y[3]=100;

 

obs[4].npoints=4;

   obs[4].x[0]=400, obs[4].y[0]=0;

   obs[4].x[1]=450, obs[4].y[1]=0;

   obs[4].x[2]=450, obs[4].y[2]=100;

   obs[4].x[3]=400, obs[4].y[3]=100;

 

obs[5].npoints=4;

   obs[5].x[0]=220, obs[5].y[0]=350;

   obs[5].x[1]=250, obs[5].y[1]=350;

   obs[5].x[2]=250, obs[5].y[2]=500;

   obs[5].x[3]=220, obs[5].y[3]=500;

 

obs[6].npoints=4;

   obs[6].x[0]=300, obs[6].y[0]=350;

   obs[6].x[1]=370, obs[6].y[1]=350;

   obs[6].x[2]=370, obs[6].y[2]=500;

   obs[6].x[3]=300, obs[6].y[3]=500;

 

obs[7].npoints=4;

   obs[7].x[0]=350, obs[7].y[0]=0;

   obs[7].x[1]=400, obs[7].y[1]=0;

   obs[7].x[2]=400, obs[7].y[2]=75;

   obs[7].x[3]=350, obs[7].y[3]=75;

*/

 //case 3 Geometry

   numObstacles=7;

   obs[0].npoints=4;

   obs[0].x[0]=0, obs[0].y[0]=100;

   obs[0].x[1]=100, obs[0].y[1]=100;

   obs[0].x[2]=100, obs[0].y[2]=350;

   obs[0].x[3]=0, obs[0].y[3]=350;

 

  obs[1].npoints=4;

   obs[1].x[0]=200, obs[1].y[0]=0;

   obs[1].x[1]=250, obs[1].y[1]=0;

   obs[1].x[2]=250, obs[1].y[2]=250;

   obs[1].x[3]=200, obs[1].y[3]=250;

 

   obs[2].npoints=4;

   obs[2].x[0]=200, obs[2].y[0]=300;

   obs[2].x[1]=250, obs[2].y[1]=300;

   obs[2].x[2]=250, obs[2].y[2]=570;

   obs[2].x[3]=200, obs[2].y[3]=570;

 

   obs[3].npoints=4;

   obs[3].x[0]=300, obs[3].y[0]=100;

   obs[3].x[1]=400, obs[3].y[1]=100;

   obs[3].x[2]=400, obs[3].y[2]=400;

   obs[3].x[3]=300, obs[3].y[3]=400;

 

obs[4].npoints=4;

   obs[4].x[0]=410, obs[4].y[0]=440;

   obs[4].x[1]=450, obs[4].y[1]=440;

   obs[4].x[2]=450, obs[4].y[2]=480;

   obs[4].x[3]=410, obs[4].y[3]=480;

  

 

obs[5].npoints=4;

   obs[5].x[0]=430, obs[5].y[0]=480;

   obs[5].x[1]=450, obs[5].y[1]=480;

   obs[5].x[2]=450, obs[5].y[2]=530;

   obs[5].x[3]=430, obs[5].y[3]=530;

 

obs[6].npoints=4;

   obs[6].x[0]=410, obs[6].y[0]=530;

   obs[6].x[1]=450, obs[6].y[1]=530;

   obs[6].x[2]=450, obs[6].y[2]=560;

   obs[6].x[3]=410, obs[6].y[3]=560;

 

/*

case1

 numObstacles=4;

   obs[0].npoints=4;

   obs[0].x[0]=50, obs[0].y[0]=0;

   obs[0].x[1]=150, obs[0].y[1]=0;

   obs[0].x[2]=150, obs[0].y[2]=200;

   obs[0].x[3]=50, obs[0].y[3]=200;

 

  obs[1].npoints=4;

   obs[1].x[0]=250, obs[1].y[0]=0;

   obs[1].x[1]=350, obs[1].y[1]=0;

   obs[1].x[2]=350, obs[1].y[2]=250;

   obs[1].x[3]=250, obs[1].y[3]=250;

 

   obs[2].npoints=4;

   obs[2].x[0]=50, obs[2].y[0]=570;

   obs[2].x[1]=150, obs[2].y[1]=570;

   obs[2].x[2]=150, obs[2].y[2]=350;

   obs[2].x[3]=50, obs[2].y[3]=350;

 

   obs[3].npoints=4;

   obs[3].x[0]=250, obs[3].y[0]=570;

   obs[3].x[1]=350, obs[3].y[1]=570;

   obs[3].x[2]=350, obs[3].y[2]=400;

   obs[3].x[3]=250, obs[3].y[3]=400;

 */

 

/* case 4

 numObstacles=4;

   obs[0].npoints=4;

   obs[0].x[0]=440, obs[0].y[0]=0;

   obs[0].x[1]=470, obs[0].y[1]=0;

   obs[0].x[2]=470, obs[0].y[2]=415;

   obs[0].x[3]=440, obs[0].y[3]=415;

 

  obs[1].npoints=4;

   obs[1].x[0]=300, obs[1].y[0]=0;

   obs[1].x[1]=440, obs[1].y[1]=0;

   obs[1].x[2]=440, obs[1].y[2]=450;

   obs[1].x[3]=300, obs[1].y[3]=450;

 

   obs[2].npoints=4;

   obs[2].x[0]=270, obs[2].y[0]=350;

   obs[2].x[1]=300, obs[2].y[1]=350;

   obs[2].x[2]=300, obs[2].y[2]=450;

   obs[2].x[3]=270, obs[2].y[3]=450;

 

   obs[3].npoints=4;

   obs[3].x[0]=270, obs[3].y[0]=300;

   obs[3].x[1]=100, obs[3].y[1]=300;

   obs[3].x[2]=100, obs[3].y[2]=450;

   obs[3].x[3]=270, obs[3].y[3]=450;

 */

}

 

Collision::coll(float x, float y) {  // collision detection function

                int i, j,k;

               

                 c = free;

                for(k=0;k<numObstacles;k++){

                 

                  for (i=0, j=obs[k].npoints-1; i<obs[k].npoints; j=i++) {

                        if ((( (obs[k].y[i]<=y) && (y<obs[k].y[j])) ||

                                ( (obs[k].y[j]<=y) && (y<obs[k].y[i]))) &&

                                (x<(obs[k].x[j]-obs[k].x[i]) *

                                (y - obs[k].y[i]) / (obs[k].y[j] - obs[k].y[i])

                                  + obs[k].x[i])){

                        if(c==free) c=collide;

                                 else c=free;

                              

                                    }

                }

              }

                 return c;

           

}

#endif