#include <stdio.h>
#include <math.h>
#include <stdbool.h>
#include <float.h>

//-----------------------------------------------------
// { to calculate angles between 2 vectors
float get_angle_clockwise_atan2(float Avec[2], float Bvec[2])
{
	float angle_rad = atan2(Avec[1], Avec[0]) - atan2(Bvec[1], Bvec[0]);
	float angle_deg = angle_rad * 180.0 / acos(-1.0);
	if (angle_deg >= 0.0) {
		return angle_deg;
	} else {
		return angle_deg + 360.0;
	}
}

float get_angle_clockwise_wrapper(float x1, float y1, float x2, float y2)
{
	float Avec[2];
	float Bvec[2];
	
	Avec[0] = x1;
	Avec[1] = y1;
	Bvec[0] = x2;
	Bvec[1] = y2;
	return get_angle_clockwise_atan2(Avec, Bvec);
}
// } to calculate angles between 2 vectors
//-----------------------------------------------------

bool isInside(float avec[2], float minvec[2], float maxvec[2])
{
	float aAndMin = get_angle_clockwise_atan2(minvec, avec);
	float minAndMax = get_angle_clockwise_atan2(minvec, maxvec);

#if 0 // debug
	printf("%f %f\n", aAndMin, minAndMax);
#endif	
	return (aAndMin <= minAndMax);
}
bool isInside_wrapper(float a_x, float a_y, float min_x, float min_y,
	float max_x, float max_y)
{
	float avec[2];
	float minvec[2];
	float maxvec[2];
	
	avec[0] = a_x;
	avec[1] = a_y;
	minvec[0] = min_x;
	minvec[1] = min_y;
	maxvec[0] = max_x;
	maxvec[1] = max_y;
	return isInside(avec, minvec, maxvec);
}

int main(void) {
	printf("%d \n", isInside_wrapper(1,1,  0,1, 1,0)); // inside
	printf("%d \n", isInside_wrapper(0,1,  0,1, 1,0)); // inside
	printf("%d \n", isInside_wrapper(1,0,  0,1, 1,0)); // inside
	printf("%d \n", isInside_wrapper(-1,-1,  0,1, 1,0)); // outside
	
	float ax, ay;
	float deg2rad = acos(-1.0) / 180.0;
	ax = 1.0 * cos(105 * deg2rad);
	ay = 1.0 * sin(105 * deg2rad);
	printf("%d \n", isInside_wrapper(ax,ay,  0,1, 1,0)); // outside
	ax = 1.0 * cos(359 * deg2rad);
	ay = 1.0 * sin(359 * deg2rad);
	printf("%d \n", isInside_wrapper(ax,ay,  0,1, 1,0)); // outside
	ax = 1.0 * cos(365 * deg2rad);
	ay = 1.0 * sin(365 * deg2rad);
	printf("%d \n", isInside_wrapper(ax,ay,  0,1, 1,0)); // inside

	return 0;
}
