DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ T s

⟦886e199e3⟧ TextFile

    Length: 16086 (0x3ed6)
    Types: TextFile
    Names: »subsd.f«

Derivation

└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
    └─ ⟦this⟧ »EUUGD11/euug-87hel/sec1/utep/subsd.f« 

TextFile

*************************************************************************
*
* subroutine rstotbl does the following:
*  (reset segments overlapping table)
*     + (re) initialize segments overlapping table
*************************************************************************
	subroutine rstotbl
	common/ovlap/iovlap(21,21)
c
	   do 20 i=1,21
	      do 30 j=1,21
	           iovlap(i,j)=0
30            continue
20         continue
	return
	end
*************************************************************************
*
* subroutine ckovlap(itemnum) does the following:
*  (check overlapping)
*      + segment number (itemnum)
*      + special case:
*       - check if segment overlaps segment page
*         (boundary of page)
*      + general case:
*       - check if segment overlaps other segments
*************************************************************************
	subroutine ckovlap(itemnum)
	integer itemnum
	common/num/numitms
c
c check overlapping between segment page & segment itemnum.
	i=itemnum
	call stovlap(i,21)
	   if(numitms.gt.1)then
	       do 30 j=1,i-1
	           call stovlap(i,j)
30	       continue
	        do 40 k=i+1,numitms
	           call stovlap(i,k)
40	        continue
	    endif
	return
	end
************************************************************************
*
* subroutine stovlap(segone,segtwo) does the following:
* (segments overlaps)
*     + segments numbers are (segone) and (segtwo)
*     + set segment page flag (ipgflag) to zero
*       (in case one of the segments is the page 
*        segment then ipgflag will be set to one
*        to handle it differently from other segments)
*     + box each segment
*     + compare segments for overlapping one way
*     + compare segments the other way (in case one 
*       segment contained fully the other one and the 
*       first check did not pick it up)
*     + segments overlaps?
*      - yes-->
*         * set the corresponding entries in the 
*           overlapping table
*      - no-->
*         * return
************************************************************************
	subroutine stovlap(segone,segtwo)
	integer segone,segtwo
	common/pgflg/ipgflag
	real a(8),b(8)
	integer overlap
c
	ipgflag=0
	call boxitm(segone,a)
	call boxitm(segtwo,b)
	call compare(a,b,overlap)
	if(overlap.eq.0.and.ipgflag.eq.0)then
	   call compare(b,a,overlap)
	endif
	  if(overlap.eq.1)then
	         call setovlp(segone,segtwo)
	  endif
	return
	end
**************************************************************************
*
* subroutine boxitm(oneitm,box) does the following:
* (box item)
*     + segment number (oneitm)
*     + (box) holds boxs four corner coords
*     + special case:
*      - yes-->
*        * page segment
*          # set page flag (ipgflag=1)
*          # access auxiliary table to get pages (blc)
*            and (trc)
*          # build box
*        * background segment
*          # box contains zeros
*        * (ucp)
*          # box contains ones
*     + general case:
*      - yes-->
*        * box a standard item (square,rectangle,triangle
*          , circle,line)
**************************************************************************
	subroutine boxitm(oneitm,box)
	integer oneitm
	real box(8)
	common/table/tblitms(20,10),icolor(20),items(20)
	common/at/asegtbl(2,10),isgclr(2),seg(2)
	common/pgflg/ipgflag
	character*1 items,seg
	real xb,yb,xt,yt
c
	if(oneitm.eq.21)then
	   ipgflag=1
	   xb=asegtbl(1,2)
	   yb=asegtbl(1,3)
	   xt=asegtbl(1,4)
	   yt=asegtbl(1,5)
	   call boxit(xb,yb,xt,yt,box)
	else
	if(items(oneitm).eq.'b')then
	     do 22 i=1,8
	        box(i)=0.0
22	     continue
	elseif(items(oneitm).eq.'u')then
	     do 23 j=1,8
	        box(j)=1.0
23	     continue
	else
	     call boxsitm(oneitm,box)
	endif
	endif
	return
	end
******************************************************************************
*
* subroutine boxsitm(itemno,array) does the following:
* (box a standard item)
*    + segment number (itemno)
*    + box is (array)
*    + access (pwb) for (blc),(trc) and side length
*    + (square,rectangle,line)
*      - pass (blc) and (trc) to build box routine (boxit)
*    + (triangle)
*      - calculate (trc)
*      - pass (blc) and (trc) to build box routine (boxit)
*    + (circle)
*      - calculate (blc) and (trc)
*      - pass (blc) and (trc) to build box routine (boxit)
******************************************************************************
	subroutine boxsitm(itemno,array)
	integer itemno
	real array(8)
	common/table/tblitms(20,10),icolor(20),items(20)
	character*1 items
	real xb,yb,xt,yt,slen,xtemp,ytemp
c
	slen=tblitms(itemno,1)
	xb=tblitms(itemno,2)
	yb=tblitms(itemno,3)
	xt=tblitms(itemno,4)
	yt=tblitms(itemno,5)
c
	if(items(itemno).eq.'s'.or.items(itemno).eq.'r'.or.
     *     items(itemno).eq.'l')then
	     call boxit(xb,yb,xt,yt,array)
	elseif(items(itemno).eq.'c')then
	     xtemp=xb
	     ytemp=yb
	     xb=xb-slen
	     yb=yb-slen
	     xt=xtemp+slen
	     yt=ytemp+slen
	     call boxit(xb,yb,xt,yt,array)
	elseif(items(itemno).eq.'t')then
	     xt=xb+slen
	     yt=yb+slen
	     call boxit(xb,yb,xt,yt,array)
	else
	     continue
	endif
	return
	end
****************************************************************************
*
* subroutine boxout(segbox,answer) does the following:
* (box out of page bounds)
*    + segment box (segbox)
*    + box is out?
*     - yes-->
*        * return (answer=1)
*     - no-->
*        * return (answer=0)
*    + check segbox four corners against page bounds
*    + if one corner is out then item considered out
*      return now with (answer=1)
*    + if all corners in item considered in return 
*      (answer=0)
****************************************************************************
	subroutine boxout(segbox,answer)
	real segbox(8)
	integer answer,out
	real tempnt(2)
c
	j=1
	do 35 i=1,4
	   tempnt(1)=segbox(j)
	   tempnt(2)=segbox(j+1)
	   call checkit(tempnt,out)
	      if(out.eq.1)then
	                      answer=1
                              return
	      else
	                      j=j+2
	      endif
35	continue
	answer=0
	return
	end
******************************************************************************
*
* subroutine checkit(point,reply) does the following:
* (check it)
*     + check if point (point) lies out of page bounds
*      - yes-->
*        * return (reply=1)
*      - no-->
*        * return (reply=0)
******************************************************************************
	subroutine checkit(point,reply)
	real point(2)
	integer reply
c
	if(point(1).lt.0.0.or.point(1).gt.10.0.or.
     *     point(2).lt.0.0.or.point(2).gt.10.0)then
	      reply=1
	else
	      reply=0
	endif
	return
	end
***************************************************************************
*
* subroutine isboxpg(box,reply) does the following:
*  (is box page--is box coords equals page coords)
*     + segment box is (box)
*     + check if they are equal?
*      - yes-->
*       * return (reply=1)
*      - no-->
*       * return (reply=0)
***************************************************************************
	subroutine isboxpg(box,reply)
	real box(8)
	integer reply
c
	reply=0
	if(box(1).eq.0.0.and.box(2).eq.10.0.and.
     *     box(5).eq.10.0.and.box(6).eq.10.0)then
	   reply=1
	endif
	return
	end
**************************************************************************
*
* subroutine pobound(pnt,reply) does the following:
* (point overlap boundary)
*   + point coords is (pnt)
*   + check if point (pnt) lies on page bounds?
*    - yes-->
*     * return (reply=1)
*    - no-->
*     * return (reply=0)
**************************************************************************
	subroutine pobound(pnt,reply)
	real pnt(2)
	integer reply
c
	reply=0
	if(pnt(1).eq.0.0.or.pnt(1).eq.10.0.or.
     *     pnt(2).eq.0.0.or.pnt(2).eq.10.0)then
	   reply=1
	endif
	return
	end
*****************************************************************************
*
* subroutine boxit(x1,y1,x2,y2,bbox) does the following:
*  (box it)
*      + items (blc) and (trc) are (x1,y1) and (x2,y2)
*        respectivly
*      + build boxs four corners and store in (bbox)
*      + return (bbox)
*****************************************************************************
	subroutine boxit(x1,y1,x2,y2,bbox)
	real x1,y1,x2,y2,bbox(8)
c
	bbox(1)=x1
	bbox(2)=y1
	bbox(3)=x2
	bbox(4)=y1
	bbox(5)=x2
	bbox(6)=y2
	bbox(7)=x1
	bbox(8)=y2
	return
	end
****************************************************************************
*
* subroutine compare(boxone,boxtwo,ovlpflg) does the following:
*  (compare)
*       + segments boxes are (boxone) and (boxtwo)
*       + check if boxes overlaps?
*        - yes-->
*         * return (ovlpflg=1)
*        - no-->
*         * return (ovlpflg=0)
*       + special cases:
*        - either (boxone) or (boxtwo) is
*          * (ucp) or (bkgd)
*          * (ucp)-- (ovlpflg=1)
*          * (bkgd)-- (ovlpflg=0)
*        - either (boxone) or (boxtwo) is
*          * horizontal line (hl) or vertical line (vl)
*          * handle seperatly by calling (boxlin)
*       + general cases:
*        - check the four corners of (boxone) 
*          against (boxtwo)
*        - if one corner overlaps return now
*          with (ovlpflg=1)
*        -if four corners in return (ovlpflg=0)
****************************************************************************
	subroutine compare(boxone,boxtwo,ovlpflg)
	integer ovlpflg,reply
	real boxone(8),boxtwo(8),tempnt(2)
	integer ans1,ans2,ans3,ans4
c
	call zeroone(boxone,ans1)
	call zeroone(boxtwo,ans2)
	call isblin(boxtwo,ans3)
	call isblin(boxone,ans4)
	if(ans1.eq.0.or.ans2.eq.0)then
	      ovlpflg=0
	elseif(ans1.eq.1.or.ans2.eq.1)then
	      ovlpflg=1
	elseif(ans3.eq.1.or.ans3.eq.2)then
	      call boxlin(boxone,boxtwo,ans3,ovlpflg)
	elseif(ans4.eq.1.or.ans4.eq.2)then
	      call boxlin(boxtwo,boxone,ans4,ovlpflg)
	else
	      j=1
	      do 25 i=1,4
	         tempnt(1)=boxone(j)
	         tempnt(2)=boxone(j+1)
	         call check(boxtwo,tempnt,reply)
	         if(reply.eq.1)then
	           ovlpflg=1
	           return
	
	         else
	           j=j+2
	         endif
25	      continue
	      ovlpflg=0
	endif
	return
	end
*****************************************************************************
*
* subroutine isblin(boxx,boxans) does the following:
* (is box a line )
*     + items box (boxx)
*     + if line is horizontal return (boxans=1)
*     + if line is vertical return (boxans=2)
*     + else return (boxans=0)
******************************************************************************
	subroutine isblin(boxx,boxans)
	real boxx(8)
	integer boxans
c
	if(boxx(2).eq.boxx(6))then
	          boxans=1
	elseif(boxx(1).eq.boxx(3))then
	          boxans=2
	else
	          boxans=0
	endif
	return
	end

******************************************************************************
*
*  SUBROUTINE BONDRY
*                    + draw the boundary of the image.
******************************************************************************


c
	subroutine bondry
	call clr
	call sec(18)
	call scl(10.0,10.0)
	call sqr
	return
	end


******************************************************************************
*
* subroutine boxlin(boxa,boxb,ansbox,ovlpln) does the following:
*  ( box line - at least one box is a (hl) or (vl) )
*       + items boxes are (box) and (boxb)
*       + type of line (ansbox)
*       + overlapping answer (ovlpln)
*       + special case:
*        - (boxa) is page segment
*         * check if any of (boxb)s four corners lies on page
*           bounds
*          # yes-->
*            -- return (ovlpln=1)
*          # no-->
*            -- return (ovlpln=0)
*       + general case:
*        - (hl)
*          * check if (boxb)--(hl) lies anywhere between
*            (boxa)s (ymin,ymax) if so return (ovlpln=1)
*            else (ovlpln=0).
*        - (vl)
*          * check if (boxb)--(vl) lies anywhere between
*            (boxa)s (xmin,xmax) if so return (ovlpln=1)
*            else (ovlpln=0)
*
*****************************************************************************
	subroutine boxlin(boxa,boxb,ansbox,ovlpln)
	common/pgflg/ipgflag
	real boxa(8),point(2),boxb(8)
	integer ansbox,ovlpln,anspnt
c
	ovlpln=0
	if(ipgflag.eq.1)then
	    j=1
	    do 20 i=1,2
	       point(1)=boxb(j)
	       point(2)=boxb(j+1)
	       call pobound(point,anspnt)
	       if(anspnt.eq.1)then
	          ovlpln=1
	          return
	       else
	          j=j+4
	       endif
20	    continue
	else
	    if(ansbox.eq.1)then
	       if((boxb(2).ge.boxa(2)).and.(boxb(2).le.boxa(6)))then
	              ovlpln=1
	              return
	       endif
	    elseif(ansbox.eq.2)then
	       if((boxb(1).ge.boxa(1)).and.(boxb(1).le.boxa(3)))then
	              ovlpln=1
	              return
	       endif
	    else
	       continue
	    endif
	endif
	return
	end
***************************************************************************
*
* subroutine zeroone(array,ans) does the following:
* (zeros or ones)
*       + check if (array) contains :
*        - all zeros return (ans=0)
*        - all ones return (ans=1)
*        - otherwise return (ans=2)
**************************************************************************
	subroutine zeroone(array,ans)
	real array(8)
	integer ans,flag
c
	flag=100
	j=1
10	if(j.le.8)then
	   if(array(j).eq.0.0)then
	              j=j+1
	   else
	              j=flag
	   endif
	go to 10
	endif
c
	if(j.ne.flag)then
	     ans=0
	     return
	else
	   j=1
20	   if(j.le.8)then
	      if(array(j).eq.1.0)then
	             j=j+1
	      else
	             j=flag
	      endif
	    go to 20
	    endif
c
	    if(j.ne.flag)then
	         ans=1
	         return
	    else
	         ans=2
	    endif
	endif
	return
	end
*****************************************************************************
*
* subroutine check(itmbox,point,answer) does the following:
* (check)
*       + check if one points coords (point) lies within
*         one items box ,if so return (answer=1) else
*         return (answer=0)
*       + special case:
*        - (itmbox) represent boxed segment page
*        - check if (point) actually lies on page bounds
*       + general case:
*        - check if (point)s x-coords between (itmbox)s
*          (xmin,xmax) and (point)s y-coords between
*          (itmbox)s (ymin,ymax) return (answer) accordingly.
*
*****************************************************************************
	subroutine check(itmbox,point,answer)
	real itmbox(8),point(2)
	integer answer,yesorno
	common/pgflg/ipgflag
c
	if(ipgflag.eq.1)then
	   call pobound(point,yesorno)
	   if(yesorno.eq.1)then
	         answer=1
	   else
	         answer=0
	   endif
	else
	if(point(1).ge.itmbox(1).and.point(1).le.itmbox(3).and.
     *     point(2).ge.itmbox(2).and.point(2).le.itmbox(6))then
c
c
	answer=1
	else
	answer=0
	endif
	endif
	return
	end
*****************************************************************************
*
* subroutine setovlp(itmone,itmtwo) does the following:
* ( set overlapping)
*        + segments numbers (itmone) and (itmtwo)
*        + access overlapping table (iovlap)
*          to set corresponding entries.
*
*****************************************************************************
	subroutine setovlp(itmone,itmtwo)
	integer itmone,itmtwo
	common/ovlap/iovlap(21,21)
c
	iovlap(itmone,itmtwo)=1
	iovlap(itmtwo,itmone)=1
	return
	end
****************************************************************************
*
* subroutine upotbl(itemno) does the following:
*  (update segments overlapping table)
*      + after deleting a segment update table
*        to show changes.
*
****************************************************************************
	subroutine upotbl(itemno)
	integer itemno
	common/num/numitms
	common/ovlap/iovlap(21,21)
c
c update the rows first.
	do 25 i=itemno,numitms-1
	   do 30 j=1,21
	      iovlap(i,j)=iovlap(i+1,j)
30	   continue
25	continue
c update the columns next.
	do 35 j=itemno,numitms-1
	   do 40 i=1,21
	      iovlap(i,j)=iovlap(i,j+1)
40	   continue
35	continue
	return
	end