************************************************************************ * * * NAME: INPOLY * * * * FUNCTION: THIS PROGRAM DETERMINES WHETHER A GIVEN POINT LIES * * WITHIN A SPECIFIED POLYGON. * * * * INPUT: NUMVRT - THE # OF VERTICES IN THE POLYGON * * * * (POLYX(I),POLYY(I)) (I = 1,2,...,NUMVRT) - THE VERTICES * * MAKING UP THE POLYGON * * * * N.B. - THE VERTICES MUST BE IN A CYCLIC ORDER * * - THE ALGORITHM REQUIRES THAT THE ARRAYS BE * * DIMENSIONED TO (NUMVRT+1) * * * * (POINTX,POINTY) - THE POINT IN QUESTION * * * * OUTPUT: INPOLY - TRUE IF THE POINT IS INSIDE THE POLYGON * * FALSE IF THE POINT IS OUTSIDE THE POLYGON * * * * COMPILER: VS FORTRAN LEVEL 1.3.0 * * * * AUTHOR: TERRY ARSENAULT * * * * HISTORY: MAR 12, 1985 - VERSION 1.0 * * * ************************************************************************ LOGICAL FUNCTION INPOLY(NUMVRT,POLYX,POLYY,POINTX,POINTY) INTEGER*2 I INTEGER*2 NUMVRT REAL*8 POINTX REAL*8 POINTY REAL*8 POLYX(NUMVRT+1) REAL*8 POLYY(NUMVRT+1) EJECT POLYX(NUMVRT+1) = POLYX(1) POLYY(NUMVRT+1) = POLYY(1) INPOLY = .TRUE. DO 100, I=1,NUMVRT IF ((POLYY(I+1)-POLYY(I)) .EQ. 0) GO TO 100 IF ((POINTY.LE.POLYY(I) .EQV. POINTY.GT.POLYY(I+1)) .AND. & POINTX-POLYX(I)-(POINTY-POLYY(I))* & (POLYX(I+1)-POLYX(I))/(POLYY(I+1)-POLYY(I)) .LT. 0) & INPOLY = .NOT.(INPOLY) 100 CONTINUE INPOLY = .NOT.(INPOLY) RETURN END