Bonjour tout le monde,
A partir de ce site, j'ai trouvé un code pour savoir si un point est à l'intérieur d'un polygone 2D:
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
|
// Globals which should be set before calling this function:
//
// int polySides = how many corners the polygon has
// float polyX[] = horizontal coordinates of corners
// float polyY[] = vertical coordinates of corners
// float x, y = point to be tested
//
// (Globals are used in this example for purposes of speed. Change as
// desired.)
//
// The function will return YES if the point x,y is inside the polygon, or
// NO if it is not. If the point is exactly on the edge of the polygon,
// then the function may return YES or NO.
//
// Note that division by zero is avoided because the division is protected
// by the "if" clause which surrounds it.
bool pointInPolygon()
{
int i, j=polySides-1 ;
bool oddNodes=NO ;
for (i=0; i<polySides; i++)
{
if ((polyY[i]< y && polyY[j]>=y
|| polyY[j]< y && polyY[i]>=y)
&& (polyX[i]<=x || polyX[j]<=x))
{
oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x);
}
j=i;
}
return oddNodes;
} |
J'ai testé sur différents exemples et il fonctionne. Malheureusement, je ne comprends pas du tout comment
J'ai lu plusieurs fois leur explication mais il doit me manquer des notions mathématiques...
Quelqu'un peut-il m'expliquer ce test?
oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x);
Merci beaucoup
Partager