Previous: filpa2 Up: ../plot79_f.html Next: filpi
SUBROUTINE FILPA3 (XARRAY,INCX, YARRAY,INCY, ZARRAY,INCZ, N,
X PDIST, NPDIST, THETA, BOX, ALPHA)
C$ (Fill Polygon Absolute 3-D)
C$ Fill an arbitrary polygon with a user-defined pattern. The
C$ pattern is defined by a series of parallel lines with
C$ variable spacing and fixed slope. Two calls to this
C$ routine can be used to obtain cross-hatching. The
C$ arguments are:
C$
C$ XARRAY(*).........Array of absolute X coordinates of
C$ polygon vertices.
C$ INCX..............Displacement between successive X values
C$ in XARRAY(*) (normally 1).
C$ YARRAY(*).........Array of absolute Y coordinates of
C$ polygon vertices.
C$ INCY..............Displacement between successive Y values
C$ in YARRAY(*) (normally 1).
C$ ZARRAY(*).........Array of absolute Z coordinates of
C$ polygon vertices.
C$ INCZ..............Displacement between successive Z values
C$ in ZARRAY(*) (normally 1).
C$ N.................Number of data points defining the
C$ polygon. The polygon is automatically
C$ closed by connecting point N to point 1.
C$ A move will be done to the point 1 before
C$ beginning to draw the polygon.
C$ PDIST(*)..........Array of world coordinate perpendicular
C$ distances between successive lines of the
C$ pattern. The sign of PDIST(K) is
C$ ignored. In order to prevent an
C$ excessive number of lines being drawn
C$ because of tiny PDIST(*) values (which
C$ might cause a pen plotter to cut through
C$ the paper), a minimal distance is
C$ enforced internally, corresponding to
C$ MAXLIN (=1000 in a DATA statement) lines
C$ across the box.
C$ NPDIST............Number of entries in PDIST(*) (.GE. 1).
C$ Line K will be spaced a distance PDIST(1
C$ + MOD(K-1,NPDIST)) from line K-1, so that
C$ PDIST(*) is used circularly. It is an
C$ error if NPDIST .LE. 0.
C$ THETA.............Angle of lines (in degrees) measured
C$ counterclockwise from the X axis.
C$ BOX............... .TRUE. - Draw the polygon outline.
C$ .FALSE. - Do not draw an outline.
C$ ALPHA(N)..........REAL working array for temporary storage
C$ of line segment parameters during
C$ clipping.
C$
C$ If an increment INCX, INCY, or INCZ is negative, the
C$ starting vertex is taken as (1-N)*INC + 1 instead of 1, so
C$ that the array is stepped through in reverse order.
C$
C$ In order to fill a 2-D polygon defined in 3-D coordinates,
C$ it is necessary to rotate the 3-D object into a 2-D plane,
C$ here chosen to be the XY plane. The filling angle THETA is
C$ then measured counterclockwise from the base of the
C$ smallest enclosing rectangle in the XY plane. Because of
C$ numerical roundoff problems, one cannot in general expect
C$ the clipping of the filling line segments against a 2-D
C$ polygon in a 3-D plane to succeed (such a line segment is
C$ unlikely to cross the polygon edges exactly), it is
C$ necessary to clip them against the 2-D polygon in the XY
C$ plane, then rotate them into the original 3-D polygon.
C$ This means that internal storage is necessary for the 2-D
C$ polygon. We use COMMON arrays XTEMP(*) and YTEMP(*) for
C$ this purpose; they are also used for temporary storage by
C$ PGNR2 and PGNR3, but their contents are not required after
C$ this routine is called.
C$ (31-MAY-88)