C PROGRAM DYN2.FT C ---------------- C C C C ###SUBROUTINE DYN2(JX,JY,IOPR) C C PETER LEMKIN C IMAGE PROCESSING UNIT, DCBD C NATIONAL CANCER INSTITUTE C NATIONAL INSTITUTES OF HEALTH C 9000 ROCKVILLE PIKE C BETHESDA, MD. 20014 C C MAY 12, 1978 C MAY 9, 1978 C MAY 5, 1978 C MAY 4, 1978 C MAY 2, 1978 C APRIL 27, 1978 C APRIL 18, 1978 C C PURPOSE C ------- C DYN2 FOLLOWS THE CURVE SPECIFIED BY (IX,IY) WHEN IT C IS INITIALIZED BY OPR #1. SUCCESSIVE CALLS RETURN C NEW CURVE POINTS UNTIL THE INITIAL POINT IS LOCATED C IN WHICH CASE (-1,0) IS RETURNED IN (IX,IY). C C C IOPR FUNCTION C ---- -------- C 1 START NEW BOUNDARY FOLLOWING STARTING AT C POINT (IX,IY) ==>(IXFIRST,IYFIRST). C C 2 GET NEXT (IX,IY) POINT ON BOUNDARY. NOTE THAT C THE BINARY NEIGHBORHOOD IS GIVEN I10:I18. C RETURN C (IX,IY) IF VALID NEXT POINT, CHAIN CODE DIRECTION ==>MQ C (-1,0) IF REACHED THE INITIAL (IXFIRST,IYFIRST), C (-2,0) IF ISOLATED PIXEL, C (-3,0) IF COMPONENT GOT LOST. C C 3 TEST IF CAUGHT IN A LOOP OF THE BOUNDARY BY LOOKING C BACKWARDS A LENGTH "LSUCLOOPLENGTH" POINTS IN THE STACK C FOR REPEATING SUBPATTERN WHICH OCCURS TWICE AND IS CAUGHT BY C THE 3RD OCCURRENCE OF THE FIRST POINT (JX,JY) OF C THE LOOP. IF TRUE THEN RETURN (IVAL=1, IZ=PTR TO 2ND C OCCURRENCE OF (JX,JY) IN STACK) ELSE RETURN (IVAL=0). C OPDEFS C ------ S OPDEF TADI 1400 S OPDEF DCAI 3400 C C S OPDEF DISP1 6435 S OPDEF DISP2 6436 C C S OPDEF MUY 7405 S OPDEF DVI 7407 C S OPDEF MQA 7501 S OPDEF MQL 7421 S OPDEF BSW 7002 C C C [0] DISPATCH S DUMMY JX S DUMMY JY S DUMMY IOPR S ENTRY DYN2 C S CPAGE 10 S JX, BLOCK 2 S JY, BLOCK 2 S IOPR, BLOCK 2 C S DYN2, BLOCK 2 C C GET THE ARGS S TAD I DYN2 S DCA JX S INC DYN2# S TAD I DYN2 S DCA JX# S INC DYN2# C S TAD I JX S DCA \JX C S TAD I DYN2 S DCA JY S INC DYN2# S TAD I DYN2 S DCA JY# S INC DYN2# C S TAD I JY S DCA \JY C S TAD I DYN2 S DCA IOPR S INC DYN2# S TAD I DYN2 S DCA IOPR# S INC DYN2# C S TAD I IOPR S DCA \IOPR C C J=0 K=0 C C C DISPATCH GOTO (1,2,3), IOPR C C [0.1] RETURN 2047 CONTINUE S RETRN DYN2 C [1] INIT THE FIRST (X,Y)<==(JX,JY) 1 IXFIRST=JX IYFIRST=JY LSTX=JX LSTY=JY ITHETA=45 C GOTO 2047 C C C C [2] FOLLOW THE OUTSIDE BORDER 1 POINT. C COPY J10[1:9]<==I10[1:9]; 2 J10=I10 J11=I11 J12=I12 J13=I13 J14=I14 J15=I15 J16=I16 J17=I17 J18=I18 C C C TEST FOR ILL-FORMED COMPONENT C IF J18=0 C THEN GOTO [2.6.1]; S TAD \J18 S SNA CLA S JMP \261 /=0 C C C [2.1] GET NEIGHBORHOOD IX=LSTX IY=LSTY C C C GET NEIGHBORHOOD OF BMj MEM=JBM IBYTE=JHGH CALL GETI1 C C NOTE: BMJ NGH IN I10:I18 C C [2.2] TEST IF ISOLATED PIXEL C THEN RETURN (-2,-2)==>(JX,JY) IF(J10+J11+J12+J13+J14+J15+J16+J17)910,902,910 902 JX=-2 JY=0 S TAD \JX S DCA I JX S TAD \JY S DCA I \JY GOTO 2047 C C C [2.3] FIND THE MINIMUM COMPUTING WINDOW 910 NUMBERTIMESAROUND=0 C C C [2.4] DISPATCH ACCORDING TO ANGLE IN DEGREES S\900, TAD \ITHETA S MQL S CPAGE 2 S DVI S 55 /45 DECIMAL S CLA C C 0:315==>1:9 S MQA S IAC /+1 S DCA \IVAL C C GOTO(1000,1045,1090,1135,1180,1225,1270,1315),IVAL C C C C C [2.5.1.45] 1045 IF(J11-1)1000,845,745 745 IF(I11-255)1000,845,1000 C BEGIN "45 DEGREES" 845 IY=IY-1 IX=IX+1 JTHETA=1 ITHETA=180 GOTO 207 C END "45" C C C [2.5.1.0] 1000 IF(J10-1)1315,800,700 700 IF(I10-255)1315,800,1315 C BEGIN "00 DEGREES" 800 IX=IX+1 JTHETA=0 ITHETA=90 GOTO 207 C END "00" C C C [2.5.1.315] 1315 IF(J17-1)1270,831,731 731 IF(I17-255)1270,831,1270 C BEGIN "315 DEGREES" 831 IY=IY+1 IX=IX+1 JTHETA=7 ITHETA=90 GOTO 207 C END "315" C C C [2.5.1.270] 1270 IF(J16-1)1225,827,727 727 IF(J15-255)1225,827,1225 C BEGIN "270 DEGREES" 827 IY=IY+1 JTHETA=6 ITHETA=0 GOTO 207 C END "270" C C C [2.5.1.225] 1225 IF(I15-1)1180,822,722 722 IF(I15-255)1180,822,1180 C BEGIN "225 DEGREES" 822 IY=IY+1 IX=IX-1 JTHETA=5 ITHETA=0 GOTO 207 C END "225" C C C [2.5.1.180] 1180 IF(J14-1)1135,818,718 718 IF(I14-255)1135,818,1135 C BEGIN "180 DEGREES" 818 IX=IX-1 JTHETA=4 ITHETA=270 GOTO 207 C END "180" C C C C [2.5.1.135] 1135 IF(J13-1)1090,813,713 713 IF(I13-255)1090,813,1090 C BEGIN "135 DEGREES" 813 IY=IY-1 IX=IX-1 JTHETA=3 ITHETA=270 GOTO 207 C END "135" C C C C [2.5.1.90] 1090 IF(J12-1)209,890,790 790 IF(I12-255)209,890,209 C BEGIN "90 DEGREES" 890 IY=IY-1 JTHETA=2 ITHETA=180 GOTO 207 C END "90" C C C C C C C [2.6] TEST IF WENT AROUND TWICE C THEN FAIL C ELSE GOTO [2.5.45] 209 NUMBEROFTIMESAROUND=NUMBEROFTIMESAROUND+1 S TAD (-2 S TAD \NUMBERTIMESAROUND S SPA CLA S JMP \1045 /NOT YET C C C [2.6.1] GOT LOST. RETURN FAILURE. 261 JX=-3 JY=0 S TAD \JX S DCA I JX S TAD \JY S DCA I JY GOTO 2047 C C C [2.6.2] FOUND VALID (IX,IY). 207 CONTINUE C RETURN JTHETA IN THE MQ S TAD \JTHETA S MQL C***********DEBUG***** S TAD PISW S TAD (23 / "/T" S DCA 7 S CPAGE 5 S 6211 S TADI 7 S DCA \INDEX S TAD \INDEX S SNA CLA S JMP \1999 JTHETA=JTHETA*45 WRITE(3,1998)JX,JY,J13,J12,I13,I12,I11,J14,J18,J10,I14,I18 1,I10(1),J15,J16,J17,I15,I16,I17,JTHETA,IX,IY,ITHETA JX,JY,J13,J12,I13,I12,I11,J14,J18,J10,I14,I18,I10(1),J15,J16,J17,I15,I16,I17 1998 FORMAT(' DYN2[',I3,',',I3,'] ',3(/,' ',3I1,' ',3I4) 1,/,' MOVED THETA=',I4,',[IX:IY]=[',I3,':',I3 2,'], NEW THETA=',I4) 1999 CONTINUE C************************* C C SAVE LAST XY LSTX=IX LSTY=IY C C PASS BACK (X,Y) AND TEST IF DONE JX=IX JY=IY S TAD \JX S DCA I JX S TAD \JY S DCA I JY C C C [2.6.3] IF (IX=IXFIRST AND IY=IYFIRST) C THEN GOTO [2.7] C ELSE RETURN; S TAD \IX S CIA S TAD \IXFIRST S SZA CLA S JMP \2047 /NO C S TAD \IY S CIA S TAD \IYFIRST S SZA CLA S JMP \2047 /NO C C C [2.7] YES, DONE WITH FSM CLOSE OUT THE SEGMENT JX=-1 JY=0 S TAD \JX S DCA I JX S TAD \JY S DCA I JY GOTO 2047 C [3] TEST IF CAUGHT IN A LOOP OF THE BOUNDARY BY LOOKING C BACKWARDS A LENGTH "LSUCLOOPLENGTH" POINTS IN THE STACK FOR C REPEATING SUBPATTERN WHICH OCCURS TWICE AND IS CAUGHT BY C THE 3RD OCCURRENCE OF THE FIRST POINT (JX,JY) OF C THE LOOP. IF TRUE THEN RETURN (IVAL=1, IZ=PTR TO 2ND C OCCURRENCE OF (JX,JY) IN STACK) ELSE RETURN (IVAL=0). C C SAVE IX,IY 3 IXS=IX IYS=IY C C C [3.1] COMPUTE MIN INDEX ON SEARCH K. C K=MAX(1,(IPTOP-LSUCLOOPLENGTH)) S TAD \LSUCLOOPLENGTH S CIA S TAD \IPTOP S SPA S CLA IAC /+1 S SNA S IAC S DCA \K C@C***DEBUG**** C@C IF FBW4[11]=1 C@C THEN LPT ELSE TTY: C@S 6344 C@S AND (0001 C@S SZA CLA C@S TAD (2 C@S IAC C@S DCA \LSNEW C@ WRITE(LSNEW,1886)K,IPTOP C@1886 FORMAT(' [3.1] K=',I5,' IPTOP=',I5) C@C*************** C C C [3.2] IF IPTOP < 2 THEN RETURN FALSE IVAL=0 S TAD (-2 S TAD \IPTOP S SPA CLA S JMP \399 /RETURN FALSE C C C [3.3] LOOK BACKWARD IN STACK A MAX OF LSUCLOOPLENGTH POINTS C FOR (IX,IY) PAIR MATCH (JX,JY) DO 330 LCNT=K,IPTOP INDEX=(IPTOP-LCNT)+K S JMS LOOKUP /(IX,IY)<==LOOKUP(INDEX) C IF [(IX=JX) AND (IY=JY)] EQV CITYBLOCK=0 C THEN "HIT" S JMS CHECKXY /J=CITYBLOCK((IX,IY),(JX,JY)) C@C***DEBUG*** C@ WRITE(LSNEW,1885)LCNT,INDEX,J C@1885 FORMAT(' [3.3] LCNT=',I5,', INDEX=',I5,', CHECKXY=',I5) C@C************* S TAD \J S SNA CLA S JMP \340 /YES, HIT 330 CONTINUE C "FAILED" GOTO 399 C C C [3.4] FOUND 1ST REPEAT POINT AT INDEX "J11". C NOW TEST IF 2ND OCCURRENCE. 340 J11=INDEX C@C****DEBUG**** C@ WRITE(LSNEW,1888)J11,IPTOP C@1888 FORMAT(' [3.4] FOUND 1ST REPEAT AT ',I5,', IPTOP AT ',I5) C@C**************** C COMPUTE 2ND REPEAT PTR INTO STACK OF POTENTIAL C MATCH INDEX=J11-(IPTOP-J11) C IF INDEX < 1 C THEN FAIL S CLA CMA S TAD \INDEX S SPA CLA S JMP \399 /FAIL C C OK S JMS LOOKUP C IF [(IX=JX) AND (IY=JY)] EQV CITYBLOCK=0 C THEN "HIT" S JMS CHECKXY /J=CITYBLOCK((IX,IY),(JX,JY)) S TAD \J S SZA CLA S JMP \399 /FAILED! C C SUCCESS! SAVE INDEX J12=INDEX C C C [3.5] FOUND 2ND REPEAT AT "J12" C IN EXTENDED ALGORITHM COULD MATCH SUB-STRINGS. BUT FOR NOW C IGNORE THEM. C@C*******DEBUG**** C@ WRITE(LSNEW,1887)INDEX C@1887 FORMAT(' [3.5] 2ND BACKWARD OCCURRANCE AT ',I5) C@C***************** C C ==>LOOP IS TRUE. C RETURN (IVAL=1, IZ=2ND STACK PTR). IVAL=1 IZ=J11 C C C [3.6] RESTORE IX,IY AND RETURN 399 IX=IXS IY=IYS GOTO 2047 C C C *************************************************** C *SUBROUTINE L O O K U P C *************************************************** C LOOKUP (IX,IY) FROM BM3H STACK(INDEX). S CPAGE 3 SRLOOKUP, JMP I LOOKUP S LOOKUP, 0 C C C LOOKUP TWO BYTES MEM=3 IBYTE=1 S CLA CMA S TAD \INDEX S CLL RAL /*2 S MQL S MQA S AND (377 S DCA \IX S MQA S BSW; RTR S AND (0017 S DCA \IY CALL FETCH2D C SAVE X S TAD \IZ S DCA \DDTGSTATUS C S CLA CMA S TAD \INDEX S CLL RAL /*2 S IAC S MQL S MQA S AND (377 S DCA \IX S MQA S BSW; RTR S AND (0017 S DCA \IY CALL FETCH2D IY=IZ C RESTORE X S TAD \DDTGSTATUS S DCA \IX S JMP RLOOKUP C C *************************************************** C *SUBROUTINE C H E C K X Y C *************************************************** C RETURN J = CITYBLOCK!DISTANCE = |IX-JX| + |IY-JY|; S CPAGE 3 SRCHECKXY, JMP I CHECKXY S CHECKXY, 0 C C S CLA S TAD \IX S CIA S TAD \JX S SPA S CIA S DCA 7 S TAD \IY S CIA S TAD \JY S SPA S CIA S TAD 7 S DCA \J S JMP RCHECKXY C POINTERS C -------- C S PISW, \ISW C END