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:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
oddNodes^=(polyX[i]+(y-polyY[i])/(polyY[j]-polyY[i])*(polyX[j]-polyX[i])<x);

Merci beaucoup