|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 9891 (0x26a3)
Types: TextFile
Names: »subs2.f«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/utep/subs2.f«
******************************************************************************
*
* subroutine cat(x1,y1,xt,yt) does the following:
* - performs concatenation transformation,
* on point (x1,y1) like this:
* (xt,yt,1)=(x,y,1) Q
* where Q is the current transformation
* matrix which is 3x3 matrix.
*
*******************************************************************************
subroutine cat(x1,y1,xt,yt)
real x1,y1,xt,yt
common/array/q(3,3)
c
xt=(q(1,1)*x1)+(q(2,1)*y1)+q(3,1)
yt=(q(1,2)*x1)+(q(2,2)*y1)+q(3,2)
return
end
*********************************************************************************
* subroutine clr does the following:
* + (re) initialize transformatio matrix (q).
* q=( 1 0 0 )
* ( 0 1 0 )
* ( 0 0 1 )
*
*******************************************************************************
subroutine clr
common/array/q(3,3)
c
q(1,1)=1.0
q(1,2)=0.0
q(1,3)=0.0
q(2,1)=0.0
q(2,2)=1.0
q(2,3)=0.0
q(3,1)=0.0
q(3,2)=0.0
q(3,3)=1.0
return
end
******************************************************************************
*
* subroutine scl(sx,sy) does the following:
* - matrix (s) is the scaling matrix.
* - forms matrix s=( sx 0 0 )
* ( 0 sy 0 )
* ( 0 0 1 )
* - update transformation matrix after
* scaling .
* - tranformation matrix ( q = q . s )
*
******************************************************************************
subroutine scl(sx,sy)
real sx,sy
common/array/q(3,3)
dimension s(3,3)
c
s(1,1)=sx
s(1,2)=0.0
s(1,3)=0.0
s(2,1)=0.0
s(2,2)=sy
s(2,3)=0.0
s(3,1)=0.0
s(3,2)=0.0
s(3,3)=1.0
call matmlt(q,s)
return
end
****************************************************************************
*
* subroutine rot(theta) does the following:
* - matrix (r) is the rotation matrix
* - convert (theta) to radians (tr).
* -forms matrix (r) as follows:
* r=( cos(tr) -sin(tr) 0 )
* ( sin(tr) cos(tr) 0 )
* ( 0 0 1 )
* - update transformation matrix after
* rotation .
* - transformation matrix ( q = q . r)
* by calling MATMLT.
*
****************************************************************************
subroutine rot(theta)
real theta
common/array/q(3,3)
dimension r(3,3)
real tr,pi
c
pi=3.14159265
tr=((pi/180.0)*theta)
r(1,1)=cos(tr)
r(1,2)=-sin(tr)
r(1,3)=0.0
r(2,1)=sin(tr)
r(2,2)=cos(tr)
r(2,3)=0.0
r(3,1)=0.0
r(3,2)=0.0
r(3,3)=1.0
call matmlt(q,r)
return
end
*****************************************************************************
*
* subroutine tlt(tx,ty) does the following:
* - matirx (t) is the translation matrix.
* - forms matirx t=( 1 0 0 )
* ( 0 1 0 )
* (tx ty 1 )
* - update transformation matrix after
* translation.
* - transformation matrix ( q = q . t )
*
*****************************************************************************
subroutine tlt(tx,ty)
real tx,ty
common/array/q(3,3)
dimension t(3,3)
c
t(1,1)=1.0
t(1,2)=0.0
t(1,3)=0.0
t(2,1)=0.0
t(2,2)=1.0
t(2,3)=0.0
t(3,1)=tx
t(3,2)=ty
t(3,3)=1.0
call matmlt(q,t)
return
end
************************************************************************
*
* subroutine clip(x1,y1,x2,y2,ic) does the following:
* - using Conleys algorithm.
* - clips line (x1,y1) to (x2,y2)
* to the window.
* - (ic) is the visibility flag.
* ic= 1
* (line fullly or partially visible).
* ic= -1
* (line is invisible).
*
***************************************************************************
subroutine clip(x1,y1,x2,y2,ic)
real x1,y1,x2,y2
integer ic
common/windo/wxmin,wxmax,wymin,wymax
integer iswap,odd
c
c (iswap) is the no. of times points (x1,y1) &
c (x2,y2) swaped.
iswap=0
odd=0
c check if x1>x2 then swap the two points
if(x1.gt.x2)then
call swap(x1,y1,x2,y2)
iswap=iswap+1
endif
c check if point (x1,y1) out of window bounds.
c if so clip line to windows left edge.
if((x1.lt.wxmin).and.(x2.ge.wxmin))then
y1=(((y2-y1)/(x2-x1))*(wxmin-x1))+y1
x1=wxmin
endif
c check if point (x2,y2) out of window bounds.
c if so clip line to windows rigth edge.
if((x1.le.wxmax).and.(x2.gt.wxmax))then
y2=(((y2-y1)/(x2-x1))*(wxmax-x1))+y1
x2=wxmax
endif
c check if y1>y2 then swap the two points.
if(y1.gt.y2)then
call swap(x1,y1,x2,y2)
iswap=iswap+1
endif
c check if point (x1,y1) out of window bounds,
c if so clip line to windows bottom edge.
if((y1.lt.wymin).and.(y2.ge.wymin))then
x1=(((x2-x1)/(y2-y1))*(wymin-y1))+x1
y1=wymin
endif
c check if point (x2,y2) is out of window bounds,
c if so clip line to windows top edge.
if((y1.le.wymax).and.(y2.gt.wymax))then
x2=(((x2-x1)/(y2-y1))*(wymax-y1))+x1
y2=wymax
endif
odd=iswap-((mod(iswap,2))*2)
c if no. of swaps is odd then swap one more time.
if(odd.eq.1)then
call swap
endif
c if both points not in clipping rectangle then ic=-1
if((((x1.ge.wxmin).and.(x1.le.wxmax)).and.
* ((y1.ge.wymin).and.(y1.le.wymax))).and.
* (((x2.ge.wxmin).and.(x2.le.wxmax)).and.
* ((y2.ge.wymin).and.(y2.le.wymax))))then
ic=1
else
ic=-1
endif
return
end
******************************************************************
*
* subroutine swap(x1,y1,x2,y2) does the following:
* - swap the two points
* (x1,y1) and (x2,y2).
*
*************************************************************
subroutine swap(x1,y1,x2,y2)
real x1,y1,x2,y2,xtemp,ytemp
c
xtemp=x1
ytemp=y1
x1=x2
y1=y2
x2=xtemp
y2=ytemp
return
end
*****************************************************************************
*
* subroutine line does the following:
* - calls cat(x,y,xtt,ytt), to see if any
* transformation has been done .
* - sets world point (u1,v1)to(xlast,ylast).
* and world point (u2,v2)to(xtt,ytt)
* and (xlast,ylast)to(xtt,ytt)
* - call clip to see if line is within window
* if flag ic=1 then visible else
* - if ic=-1 then (line invisible)return.
* - if line visible then do the following
* - transforms(u1,v1)to device coords
* (i,j) if the latter not equal to
* (lastx,lasty) then call movepr.
* - transforms (u2,v2) to device coords(k,l)
* -output device is the AED TERMINAL
* + set the decimal code 65 for the hardware
* line drawing
* + call xyaed(k,l)
* + set(lastx,lasty) to (k,l).
*
******************************************************************************
subroutine line(x,y)
real x,y
common/device/lastx,lasty,numpag
common/worldc/xlast,ylast
real u1,v1,u2,v2
character*1 a
c
call cat(x,y,xtt,ytt)
u1=xlast
v1=ylast
u2=xtt
v2=ytt
xlast=xtt
ylast=ytt
c clip line to window ,then check visibility flag (ic).
call clip(u1,v1,u2,v2,ic)
if(ic.eq.1)then
c line is visible or partially visible.
c transform line from world coords to device coords.
c begin with starting point (u1,v1).
call wdscrn(u1,v1,ssx,ssy)
call driver(ssx,ssy,i,j)
c check (lastx,lasty) if not in proper position call movepr.
if((i.ne.lastx).or.(j.ne.lasty))then
call movepr(i,j)
endif
c now convert ending point to device coords.
call wdscrn(u2,v2,sx,sy)
call driver(sx,sy,k,l)
c output device is AED terminal .
ia=65
a=char(ia)
call store(a)
call xyaed(k,l)
lastx=k
lasty=l
endif
return
end
******************************************************************************
*
* subroutine move(x,y) does the following:
* - specify device coordinates
* - transform point if it had under
* gone any transformation,call cat
* then set world last drawing position
* to transformed point.
* (xlast,ylast)=(xtt,ytt)
* - transform xtt,ytt to device coords i,j
* - if (i,j) within device bounds then
* move to (i,j) else return
*
*******************************************************************************
subroutine move(x,y)
real x,y
common/worldc/xlast,ylast
real xtt,ytt,ssx,ssy
integer idxmin,idxmax,idymin,idymax,i,j
c
idxmin=0
idxmax=511
idymin=0
idymax=482
c
call cat(x,y,xtt,ytt)
xlast=xtt
ylast=ytt
c transforme point coords from world to device .
call wdscrn(xtt,ytt,ssx,ssy)
call driver(ssx,ssy,i,j)
c check if (i,j) is witin device bounds
if(((i.ge.idxmin).and.(i.le.idxmax)).and.
* ((j.ge.idymin).and.(j.le.idymax)))then
c if every thing checks OK then call movepr(i,j).
call movepr(i,j)
endif
return
end
*******************************************************************************
*
* subroutine matmlt(a,b) does the following:
* - performs multiplication between
* two matrices (a,b) and puts the
* result in (a).
*
*******************************************************************************
subroutine matmlt(a,b)
dimension a(3,3),b(3,3),result(3,3)
c
do 20 n=1,3
do 10 m=1,3
result(m,n)=0.0
10 continue
20 continue
do 50 i=1,3
do 40 j=1,3
do 30 k=1,3
result(i,j)=result(i,j)+(a(i,k)*b(k,j))
30 continue
40 continue
50 continue
do 70 li=1,3
do 60 lj=1,3
a(li,lj)=result(li,lj)
60 continue
70 continue
return
end
*********************************************************************************
* subroutine term does the following:
* + insert code in (jpage) to return to
* alpha mode.
* + outputs (jpage) contents.
* + print on unit 0
* number of pages = numpag.
********************************************************************************
subroutine term
common/contr/icnt
common/page/jpage(6000)
common/device/lastx,lasty,numpag
character*1 ers,alpha
character*1 jpage
c output device is AED terminal .
ialpha=1
iers=126
ers=char(iers)
call store(ers)
alpha=char(ialpha)
call store(alpha)
do 300 j=1,icnt-1
call prnt(jpage(j))
300 continue
c
write(0,45) numpag
45 format(1x,'NUMBER OF PAGES=',i2)
return
end