Function InRegion(ByVal MatX As Range, ByVal MatY As Range, ByVal X As Double, ByVal Y As Double) 'Renvoi 1 si (X,Y) se trouve dans la Région fermée défini par MatX et MatY 'Renvoi 0 si extérieur à la région 'Renvoi -1 si sur la frontière 'Tailles matrices Dim L As Long, L2 As Long, C As Long, C2 As Long L = MatX.Rows.Count L2 = MatY.Rows.Count C = MatX.Columns.Count C2 = MatY.Columns.Count 'Erreur de taille If C > 1 Or C2 > 1 Then InRegion = "#COLONNE!": Exit Function If L <> L2 Then InRegion = "#LIGNE!": Exit Function 'Paramètres Dim t As Long, nb As Double, D As Double Dim X1 As Double, X2 As Double, X3 As Double, Y1 As Double, Y2 As Double 'compte le nb de coupure For t = 1 To L - 1 X1 = MatX.Cells(t) Y1 = MatY.Cells(t) X2 = MatX.Cells(t + 1) Y2 = MatY.Cells(t + 1) 'Le point se trouve-t-il sur un segment verticale If ((X1 = X2) And (X1 = X)) And ((Y1 <= Y And Y < Y2) Or (Y1 >= Y And Y > Y2)) Then InRegion = -1 Exit Function End If 'Le point se trouve-t-il entre le segment [(X1,Y1);(X2,Y2)[ ? If (X1 <= X And X < X2) Or (X1 >= X And X > X2) Then 'Calcul distance entre le segment et le point D = Y - Y1 + (Y1 - Y2) * (X1 - X) / (X1 - X2) 'Test distance D If D = 0 Then 'Sur frontière InRegion = -1 Exit Function ElseIf D > 0 Then 'point coupe le segment nb = nb + 1 If X = X1 Then 'a l'aplomb du départ d'un segment X3 = MatX(t - 1) If t = 1 Then X3 = MatX(L) If (X3 < X And X2 < X) Or (X3 > X And X2 > X) Then nb = nb + 1 End If End If End If Next t 'Renvoi vrai (=1) si pair ou faux (=0) si impair InRegion = nb And 1 End Function