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