#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxmbG9hdC5oPgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB7IHRvIGNhbGN1bGF0ZSBhbmdsZXMgYmV0d2VlbiAyIHZlY3RvcnMKZmxvYXQgZ2V0X2FuZ2xlX2Nsb2Nrd2lzZV9hdGFuMihmbG9hdCBBdmVjWzJdLCBmbG9hdCBCdmVjWzJdKQp7CglmbG9hdCBhbmdsZV9yYWQgPSBhdGFuMihBdmVjWzFdLCBBdmVjWzBdKSAtIGF0YW4yKEJ2ZWNbMV0sIEJ2ZWNbMF0pOwoJZmxvYXQgYW5nbGVfZGVnID0gYW5nbGVfcmFkICogMTgwLjAgLyBhY29zKC0xLjApOwoJaWYgKGFuZ2xlX2RlZyA+PSAwLjApIHsKCQlyZXR1cm4gYW5nbGVfZGVnOwoJfSBlbHNlIHsKCQlyZXR1cm4gYW5nbGVfZGVnICsgMzYwLjA7Cgl9Cn0KCmZsb2F0IGdldF9hbmdsZV9jbG9ja3dpc2Vfd3JhcHBlcihmbG9hdCB4MSwgZmxvYXQgeTEsIGZsb2F0IHgyLCBmbG9hdCB5MikKewoJZmxvYXQgQXZlY1syXTsKCWZsb2F0IEJ2ZWNbMl07CgkKCUF2ZWNbMF0gPSB4MTsKCUF2ZWNbMV0gPSB5MTsKCUJ2ZWNbMF0gPSB4MjsKCUJ2ZWNbMV0gPSB5MjsKCXJldHVybiBnZXRfYW5nbGVfY2xvY2t3aXNlX2F0YW4yKEF2ZWMsIEJ2ZWMpOwp9Ci8vIH0gdG8gY2FsY3VsYXRlIGFuZ2xlcyBiZXR3ZWVuIDIgdmVjdG9ycwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpib29sIGlzSW5zaWRlKGZsb2F0IGF2ZWNbMl0sIGZsb2F0IG1pbnZlY1syXSwgZmxvYXQgbWF4dmVjWzJdKQp7CglmbG9hdCBhQW5kTWluID0gZ2V0X2FuZ2xlX2Nsb2Nrd2lzZV9hdGFuMihtaW52ZWMsIGF2ZWMpOwoJZmxvYXQgbWluQW5kTWF4ID0gZ2V0X2FuZ2xlX2Nsb2Nrd2lzZV9hdGFuMihtaW52ZWMsIG1heHZlYyk7CgojaWYgMCAvLyBkZWJ1ZwoJcHJpbnRmKCIlZiAlZlxuIiwgYUFuZE1pbiwgbWluQW5kTWF4KTsKI2VuZGlmCQoJcmV0dXJuIChhQW5kTWluIDw9IG1pbkFuZE1heCk7Cn0KYm9vbCBpc0luc2lkZV93cmFwcGVyKGZsb2F0IGFfeCwgZmxvYXQgYV95LCBmbG9hdCBtaW5feCwgZmxvYXQgbWluX3ksCglmbG9hdCBtYXhfeCwgZmxvYXQgbWF4X3kpCnsKCWZsb2F0IGF2ZWNbMl07CglmbG9hdCBtaW52ZWNbMl07CglmbG9hdCBtYXh2ZWNbMl07CgkKCWF2ZWNbMF0gPSBhX3g7CglhdmVjWzFdID0gYV95OwoJbWludmVjWzBdID0gbWluX3g7CgltaW52ZWNbMV0gPSBtaW5feTsKCW1heHZlY1swXSA9IG1heF94OwoJbWF4dmVjWzFdID0gbWF4X3k7CglyZXR1cm4gaXNJbnNpZGUoYXZlYywgbWludmVjLCBtYXh2ZWMpOwp9CgppbnQgbWFpbih2b2lkKSB7CglwcmludGYoIiVkIFxuIiwgaXNJbnNpZGVfd3JhcHBlcigxLDEsICAwLDEsIDEsMCkpOyAvLyBpbnNpZGUKCXByaW50ZigiJWQgXG4iLCBpc0luc2lkZV93cmFwcGVyKDAsMSwgIDAsMSwgMSwwKSk7IC8vIGluc2lkZQoJcHJpbnRmKCIlZCBcbiIsIGlzSW5zaWRlX3dyYXBwZXIoMSwwLCAgMCwxLCAxLDApKTsgLy8gaW5zaWRlCglwcmludGYoIiVkIFxuIiwgaXNJbnNpZGVfd3JhcHBlcigtMSwtMSwgIDAsMSwgMSwwKSk7IC8vIG91dHNpZGUKCQoJZmxvYXQgYXgsIGF5OwoJZmxvYXQgZGVnMnJhZCA9IGFjb3MoLTEuMCkgLyAxODAuMDsKCWF4ID0gMS4wICogY29zKDEwNSAqIGRlZzJyYWQpOwoJYXkgPSAxLjAgKiBzaW4oMTA1ICogZGVnMnJhZCk7CglwcmludGYoIiVkIFxuIiwgaXNJbnNpZGVfd3JhcHBlcihheCxheSwgIDAsMSwgMSwwKSk7IC8vIG91dHNpZGUKCWF4ID0gMS4wICogY29zKDM1OSAqIGRlZzJyYWQpOwoJYXkgPSAxLjAgKiBzaW4oMzU5ICogZGVnMnJhZCk7CglwcmludGYoIiVkIFxuIiwgaXNJbnNpZGVfd3JhcHBlcihheCxheSwgIDAsMSwgMSwwKSk7IC8vIG91dHNpZGUKCWF4ID0gMS4wICogY29zKDM2NSAqIGRlZzJyYWQpOwoJYXkgPSAxLjAgKiBzaW4oMzY1ICogZGVnMnJhZCk7CglwcmludGYoIiVkIFxuIiwgaXNJbnNpZGVfd3JhcHBlcihheCxheSwgIDAsMSwgMSwwKSk7IC8vIGluc2lkZQoKCXJldHVybiAwOwp9Cg==