1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
#define sqr(x) ((x)*(x))
#define Maxs(a, b) (((a) > (b)) ? (a) : (b))
#define Mins(a, b) (((a) < (b)) ? (a) : (b))
bool Inside (Double X[], Double Y[], short n) // X,Y coordonnées des n sommets 0.. n-1
{ // X[n] et Y[] coordonn(e du point à tester
Double A = 0, A1=0, Xp = X[n], Yp = Y[n];
for (short i=0; i < n; i++ ) A += (Y[(i+1) % n] - Y[i])* ( X[(i+1)%n]+X[i]) /2;
short j1 = -1, j2;
double D = 1e300;
// recherche du sommet le + pret
for (short i=0; i< n; i++ )
{
double d = sqr(Xp-X[i]) + sqr(Yp-Y[i]);
if ( d < D)
{
D=d;
j1=i;
}
}
double D_prev = sqr(Xp-X[(j1-1+n) % n]) + sqr(Yp-Y[(j1-1+n)%n]);
double D_next = sqr(Xp-X[(j1+1) % n]) + sqr(Yp-Y[(j1+1)%n]);
if (D_next < D_prev ) j2 = (j1+1) % n;
else j2 = (j1-1+n) % n;
short k= Maxs(j1, j2);
j1 = Mins(j1,j2);
j2 = k;
if ((j2-j1) == 1)
{
for (short i=n-1; i >=j2; i--)
{
X[i+1]=X[i];
Y[i+1]=Y[i];
}
X[j2] = Xp;
Y[j2] = Yp;
}
n++;
for (short i=0; i < n; i++ ) A1 += (Y[(i+1) % n ] - Y[i])* ( X[(i+1)%n]+X[i]) /2;
return fabs(A) > fabs(A1); // true si IN
} |
Partager