//Dan Mayer danmanwointernet@excite.com
//EYES.cxx
//Gillet Ian Bratt
//1:00
//Makes eyes follow the mouse on screen.

#include <iostream.h>
#include <stdlib.h>
#include <winbgim.h>
#include <math.h>

CONST int PIXEL_SIZE=500;
CONST int LEFT_EYE_CENTERX=int((1.5*PIXEL_SIZE)/5);
CONST int LEFT_EYE_CENTERY=(PIXEL_SIZE/2);                 //constants for the program
CONST int RIGHT_EYE_CENTERX=int((3.5*PIXEL_SIZE)/5);
CONST int RIGHT_EYE_CENTERY=(PIXEL_SIZE)/2;
CONST double XRADI=PIXEL_SIZE/8;                          
CONST double YRADI=PIXEL_SIZE/16;
CONST int RADIUS=15;

double solveposition(int mousex, int mousey, double centerx, double centery,double& m);
void draweye(double x,double centerx,double centery,double m,int color,int mouseyy,int mousexx);  //functions

int main()
{
    int mousexx,mouseyy,colorl,colorr;
    double m,ellipsex;

    colorl=GREEN;          //stars each eye green
    colorr=GREEN;
    initwindow(PIXEL_SIZE, PIXEL_SIZE);

    
    while(kbhit()==0)                 //loop to do until the user presses a key
    {
	delay(1);	
	mousexx = mousex();
	mouseyy = mousey();
	
	if (ismouseclick(WM_LBUTTONDOWN)) // Left button.       // changes color of left eye
	{
	    getmouseclick(WM_LBUTTONDOWN, mousexx, mouseyy);
	    colorl=colorl+1;
	    if(colorl>14)
		colorl=0;
	}
	if (ismouseclick(WM_RBUTTONDOWN)) // Left button.
	{
	    getmouseclick(WM_RBUTTONDOWN, mousexx, mouseyy);
	    colorr=colorr+1;
	    if(colorr>14)
		colorr=0;
	}                                                       //changes color of right eye
	
	
	ellipsex=solveposition(mousexx,mouseyy,LEFT_EYE_CENTERX,LEFT_EYE_CENTERY,m);  //left eye math and draw
	draweye(ellipsex,LEFT_EYE_CENTERX,LEFT_EYE_CENTERY,m,colorl,mouseyy,mousexx);
	ellipsex=solveposition(mousexx,mouseyy,RIGHT_EYE_CENTERX,RIGHT_EYE_CENTERY,m);  //right eye math and draw
	draweye(ellipsex,RIGHT_EYE_CENTERX,RIGHT_EYE_CENTERY,m,colorr,mouseyy,mousexx);
	
	
    }

    
    closegraph();                 //close the graph
    return EXIT_SUCCESS;
}


double solveposition(int mousexx, int mouseyy,double centerx,double centery,double& m)
{
    int y1,ct=0;
    double x,x1,x2;
    x1=int(mousexx-centerx);
    y1=int(mouseyy-centery);
    
    if(x1!=0)          //make sure not to divide by zero
	m=(y1/x1);
    else
	x1=0;       //set x equal to zero if there is no slope

    if(x1!=0)                   //calculates values if there is a slope
    {
	x1=double(sqrt(double(1.0/(  (1.0/double((XRADI*XRADI)))  + (double((m*m))/double((YRADI*YRADI)))  ))));
	x2=-double(sqrt(double(1.0/(  (1.0/double((XRADI*XRADI)))  + (double((m*m))/double((YRADI*YRADI)))  ))));

	if(mousexx>=centerx)                      //uses the point closest to the mouse
	    x=x1;  
	if(mousexx<centerx)
	    x=x2;
    }
    else
	x=x1;                   

    return x;     //returns a double value
}



void draweye(double x,double centerx,double centery,double m,int color,int mouseyy,int mousexx)
{
    int y;
    x=x+centerx;
    if(x==centerx)                    //if no slope creates the y values
    {
	if(mouseyy>centery)            
	    y=int(YRADI+centery);
	if(mouseyy<centery)
	    y=int(centery-YRADI);
    }	
    else
	y=int((m *(x-int(centerx)))+ int(centery));
    
    if(((mousexx<(centerx+(.75*XRADI)))&&(mousexx>(centerx-(.75*XRADI))))&&((mouseyy<(centery+(.75*YRADI)))&&(mouseyy>(centery-(.75*YRADI)))))
    {
	y=mouseyy;  //takes care of if mouse is inside the eye
	x=mousexx;
    }
    
    setfillstyle(SOLID_FILL, WHITE);
    fillellipse(int(centerx),int(centery),int(XRADI+(1.2*RADIUS)),int(YRADI+(1.2*RADIUS))); //draws white part
    setfillstyle(SOLID_FILL, color);
    fillellipse(int(x),y,RADIUS,RADIUS);                  //draws pupil
    
}
