-
Notifications
You must be signed in to change notification settings - Fork 5
/
pnpoly.for
88 lines (87 loc) · 5.94 KB
/
pnpoly.for
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
!C PNP1
!C http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
!C ..................................................................
!C
!C SUBROUTINE PNPOLY
!C
!C PURPOSE
!C TO DETERMINE WHETHER A POINT IS INSIDE A POLYGON
!C
!C USAGE
!C CALL PNPOLY (PX, PY, XX, YY, N, INOUT )
!C
!C DESCRIPTION OF THE PARAMETERS
!C PX - X-COORDINATE OF POINT IN QUESTION.
!C PY - Y-COORDINATE OF POINT IN QUESTION.
!C XX - N LONG VECTOR CONTAINING X-COORDINATES OF
!C VERTICES OF POLYGON.
!C YY - N LONG VECTOR CONTAING Y-COORDINATES OF
!C VERTICES OF POLYGON.
!C N - NUMBER OF VERTICES IN THE POLYGON.
!C INOUT - THE SIGNAL RETURNED:
!C -1 IF THE POINT IS OUTSIDE OF THE POLYGON,
!C 0 IF THE POINT IS ON AN EDGE OR AT A VERTEX,
!C 1 IF THE POINT IS INSIDE OF THE POLYGON.
!C
!C REMARKS
!C THE VERTICES MAY BE LISTED CLOCKWISE OR ANTICLOCKWISE.
!C THE FIRST MAY OPTIONALLY BE REPEATED, IF SO N MAY
!C OPTIONALLY BE INCREASED BY 1.
!C THE INPUT POLYGON MAY BE A COMPOUND POLYGON CONSISTING
!C OF SEVERAL SEPARATE SUBPOLYGONS. IF SO, THE FIRST VERTEX
!C OF EACH SUBPOLYGON MUST BE REPEATED, AND WHEN CALCULATING
!C N, THESE FIRST VERTICES MUST BE COUNTED TWICE.
!C INOUT IS THE ONLY PARAMETER WHOSE VALUE IS CHANGED.
!C THE SIZE OF THE ARRAYS MUST BE INCREASED IF N > MAXDIM
!C WRITTEN BY RANDOLPH FRANKLIN, UNIVERSITY OF OTTAWA, 7/70.
!C
!C SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
!C NONE
!C
!C METHOD
!C A VERTICAL LINE IS DRAWN THRU THE POINT IN QUESTION. IF IT
!C CROSSES THE POLYGON AN ODD NUMBER OF TIMES, THEN THE
!C POINT IS INSIDE OF THE POLYGON.
!C
!C ..................................................................
!C
SUBROUTINE PNPOLY(PX,PY,XX,YY,N,INOUT)
use precision,only:p_
implicit none
integer,intent(in):: n
integer,intent(inout):: inout
real(p_),intent(in):: px,py
integer:: i,j,maxdim
!yj REAL(p_):: X(200),Y(200),XX(N),YY(N)
REAL(p_):: X(N),Y(N),XX(N),YY(N) !yj
LOGICAL MX,MY,NX,NY
INTEGER O
!C OUTPUT UNIT FOR PRINTED MESSAGES
DATA O/6/
!yj MAXDIM=200
MAXDIM=n !yj
IF(N.LE.MAXDIM)GO TO 6
WRITE(O,7)
7 FORMAT('0WARNING:',I5,' TOO GREAT FOR pnp1, RESULTS INVALID')
RETURN
6 DO 1 I=1,N
X(I)=XX(I)-PX
1 Y(I)=YY(I)-PY
INOUT=-1
DO 2 I=1,N
J=1+MOD(I,N)
MX=X(I).GE.0.0
NX=X(J).GE.0.0
MY=Y(I).GE.0.0
NY=Y(J).GE.0.0
IF(.NOT.((MY.OR.NY).AND.(MX.OR.NX)).OR.(MX.AND.NX)) GO TO 2
IF(.NOT.(MY.AND.NY.AND.(MX.OR.NX).AND..NOT.(MX.AND.NX))) GO TO 3
INOUT=-INOUT
GO TO 2
3 IF((Y(I)*X(J)-X(I)*Y(J))/(X(J)-X(I))) 2,4,5
4 INOUT=0
RETURN
5 INOUT=-INOUT
2 CONTINUE
RETURN
END