      PROGRAM POLYGON
      DIMENSION XP(100),YP(100)
      INTEGER ISEED
      DATA XP/200.,300.,400.,500.,600.,700.,800.,600.,500.,400.,
     1 300.,250.,250.,200.,86*0./
      DATA YP/4*500.,600.,300.,100.,2*200.,100.,250.,3*400.,
     1 86*0./
      DATA ISEED/4567891/
C
C          TESTING PROGRAM FOR SUBROUTINE INSIDE.
C
c     CALL INITT(960)
CCC      DO 300 I = 3,10
      N = 14
CCC      DO 50 K = 1,N
CCC      XP(K) = 1000.*RAN(ISEED)
CCC   50 YP(K) = 750.*RAN(ISEED)
c     CALL ERASE
      IX = XP(1)
      IY = YP(1)
c     CALL MOVABS(IX,IY)
      DO 100 J = 1,N
      IX = XP(J+1)
      IY = YP(J+1)
      IF (J.LT.N) GO TO 100
      IX = XP(1)
      IY = YP(1)
c 100 CALL DRWABS(IX,IY)
  100 continue
C     CALL TIMING(T,SYS,AIO)
      DO 200 K = 1,250
CCC      IF (K.GT.175) GO TO 150
      X = 1020.*RAN(ISEED)
      Y = 500
      IF (K.GT.25) Y = 400
      IF (K.GT.50) Y = 200
      IF (K.GT.75) Y = 100
      IF (K.GT.100) Y = 600
      IF (K.GT.125) Y = 300.
      IF (K.GT.150) Y = 250.
      IF (K.GT.175) Y = 700.*RAN(ISEED)
CCC      GO TO 160
CCCC                     SET POINTS ON LINES JOINING VERTICES.
CCC  150 I1 = N*RAN(ISEED)+1
CCC      I2 = I1+1
CCC      IF (I2.GT.N) I2 = 1
CCC      C = RAN(ISEED)
CCC      X = (XP(I2)-XP(I1))*C+XP(I1)
CCC      Y = (YP(I2)-YP(I1))*C+YP(I1)
  160 CALL INSIDE(N,X,Y,XP,YP,IN)
      IX = X
      IY = Y
      IF (IN.EQ.0) GO TO 180
c     CALL MOVABS(IX-3,IY)
c     CALL DRWABS(IX+3,IY)
      GO TO 200
c 180 CALL MOVABS(IX,IY+3)
  180 continue
c     CALL DRWABS(IX,IY-3)
  200 CONTINUE
c     CALL FINITT(0,767)
C     CALL TIMING(TT,SYS,AIO)
      T = TT-T
      PRINT 9999, I,T
 9999 FORMAT (I5,1P2E20.7)
      READ 9002,INP
  300 CONTINUE
 9002 FORMAT (I1)
      END
      SUBROUTINE INSIDE(N,X,Y,XP,YP,IN)
C     THIS SUBROUTINE DETERMINES WHETHER A POINT LIES INSIDE OR OUTSIDE
C     OF A POLYGON (REGULAR OR IRREGULAR, INCLUDING CONCAVE AND
C     RE-ENTRANT).  WRITTEN BY MELVIN L. PRUEITT.  VERSION AUG. 25,1980.
C  N  IS THE NUMBER OF VERTICES OF THE POLYGON.
C  X  IS THE X COORDINATE OF THE POINT IN QUESTION.
C  Y  IS THE Y COORDINATE OF THE POINT IN QUESTION.
C  XP, YP ARE ARRAYS GIVING THE COORDINATES OF THE POLYGON VERTICES.
C  IN IS RETURNED TO THE CALLER AS A 1 IF THE POINT (X,Y)
C     IS INSIDE THE POLYGON, 0 IF OUTSIDE.  POINTS ON THE BOUNDARY ARE
C     CONSIDERED TO BE OUTSIDE, BUT ROUNDING ERRORS SOMETIMES
C     CAUSE BOUNDARY POINTS TO BE INSIDE.
      DIMENSION XP(1),YP(1)
      K = 0
      I = N
  100 F = YP(1)-YP(I)
      IF (F.NE.0.) GO TO 200
      I = I-1
      IF (I.GT.1) GO TO 100
      GO TO 600
  200 DO 500 I = 1,N
      J = MOD(I,N)+1
      IF ((Y-YP(I))*(Y-YP(J)).GT.0.) GO TO 500
      IF (Y.EQ.YP(J)) GO TO 500
      IF (Y.NE.YP(I)) GO TO 400
      IF (F*(YP(J)-Y).LT.0.) GO TO 500
  400 IF (X.LT.(Y-YP(I))*(XP(J)-XP(I))/(YP(J)-YP(I))+XP(I)) K = K+1
  500 IF (YP(J).NE.YP(I)) F = YP(J)-YP(I)
  600 IN = K.AND.1
      RETURN
      END
