please dont rip this site

Method IO Graphics PART01.SH

# ! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 5)."
# Contents:  2DClip 2DClip/Makefile 2DClip/box.h 2DClip/line.h AALines
#   AALines/00README AALines/AALines.h AALines/AAMain.c
#   AALines/LongConst.h AALines/Makefile AALines/utah.h BinRec.c
#   CircleRect.c DigitalLine.c FastJitter.c FixedTrig.c HSLtoRGB.c
#   Hash3D.c HypotApprox.c MANIFEST MatrixOrtho.c PixelInteger.c
#   PolyScan PolyScan/Makefile README RGBTo4Bits.c RayBox.c
#   RayPolygon.c Sturm Sturm/Makefile Sturm/solve.h Sturm/util.c
#   TransBox.c ViewTrans.c
# Wrapped by craig@weedeater on Wed Dec 12 20:45:12 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test ! -d '2DClip' ; then
    echo shar: Creating directory \"'2DClip'\"
    mkdir '2DClip'
fi
if test -f '2DClip/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'2DClip/Makefile'\"
else
echo shar: Extracting \"'2DClip/Makefile'\" \(212 characters\)
sed "s/^X//" >'2DClip/Makefile' <<'END_OF_FILE'
XLIBFILE = ../gemslib.a
X
XCFLAGS = $(GENCFLAGS) -I..
X
XOFILES = clip.o bio.o cross.o
X
X$(LIBFILE): $(OFILES)
X	ar rcs $(LIBFILE) $(OFILES)
X
Xclean:
X	/bin/rm -f clip.o bio.o cross.o
X
X$(OFILES): line.h ../GraphicsGems.h
END_OF_FILE
if test 212 -ne `wc -c <'2DClip/Makefile'`; then
    echo shar: \"'2DClip/Makefile'\" unpacked with wrong size!
fi
# end of '2DClip/Makefile'
fi
if test -f '2DClip/box.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'2DClip/box.h'\"
else
echo shar: Extracting \"'2DClip/box.h'\" \(186 characters\)
sed "s/^X//" >'2DClip/box.h' <<'END_OF_FILE'
X
X/* 
X * file box.h
X *	a short include file is better then no include file
X */
Xtypedef	struct	{		/* guess what this is		*/
X	long	_lowx;
X	long	_lowy;
X	long	_highx;
X	long	_highy;
X} BOX;
X
X 
END_OF_FILE
if test 186 -ne `wc -c <'2DClip/box.h'`; then
    echo shar: \"'2DClip/box.h'\" unpacked with wrong size!
fi
# end of '2DClip/box.h'
fi
if test -f '2DClip/line.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'2DClip/line.h'\"
else
echo shar: Extracting \"'2DClip/line.h'\" \(1795 characters\)
sed "s/^X//" >'2DClip/line.h' <<'END_OF_FILE'
X
X/*
XTwo-Dimensional Clipping: A Vector Based Approach
Xby Hans Spoelder and Fons Ullings
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X
X/*
X * file line.h
X * 	contains major definitions for the clipping routines
X *
X */
X#define	NFAC		10		/* discrete measure	*/
X	
X#define	SCALE		(1 << NFAC)	/* 1024 points/cm	*/
X#define	TO_INT(X)	((int)((X)*SCALE))
X#define	TO_FLT(X)	(((float)(X))/SCALE)
X
X#define	COINCIDE		1		/* what do the lines do	*/
X#define	PARALLEL		2
X#define	CROSS		3
X#define	NO_CROSS		4
X
X#define	STD			0		/* crossing types	*/
X#define	DELAY		1
X
X#define	CLIP_NORMAL	1
X
Xtypedef	struct	{		/* holds a point	*/
X	long	_x;			/* holds x coordinate	*/
X	long	_y;			/* holds y coordinate	*/
X} POINT;
X
Xtypedef	struct	{		/* holds a cross point	*/
X	POINT	_p;			/* holds the solution	*/
X	short	_type;		/* more information	*/
X} CLIST;
X	
Xstruct	segment	{			/* holds a segment	*/
X	POINT	_from;			/* start coordinates	*/
X	POINT	_to;			/* stop coordinates	*/
X	struct	segment	*_next;
X	struct	segment	*_prev;
X};
X
X
X#define	SEGMENT		struct segment
X
Xstruct	contour {			/* holds a contour	*/
X	short	_no;			/* contour counter	*/
X	short	_status;			/* holds information	*/
X	short	_cnt;			/* number of elements	*/
X	SEGMENT	*_s;			/* the segments		*/
X	struct	contour *_next;	/* linked list		*/
X	long	_minx;			/* coordinates of box	*/
X	long	_miny;
X	long	_maxx;
X	long	_maxy;
X};
X
X#define	CONTOUR		struct contour
X
X#define	ACTIVE		01		/* polygon attributes	*/
X#define	NORMAL		02
X
X#define	SET_ON(p)	((p)->_status |=  ACTIVE)
X#define	SET_NORMAL(p)	((p)->_status |= NORMAL)
X
X#define	SET_OFF(p)	((p)->_status &= ~ACTIVE)
X#define	SET_INVERSE(p)	((p)->_status &= ~NORMAL)
X
X#define	IS_ON(p)	((p)->_status & ACTIVE)
X#define	IS_NORMAL(p)	((p)->_status & NORMAL)
X
Xextern	CONTOUR	*CL;
X
XCONTOUR	*get_contour_ptr();
X
Xextern	short	C_COUNT;
X 
END_OF_FILE
if test 1795 -ne `wc -c <'2DClip/line.h'`; then
    echo shar: \"'2DClip/line.h'\" unpacked with wrong size!
fi
# end of '2DClip/line.h'
fi
if test ! -d 'AALines' ; then
    echo shar: Creating directory \"'AALines'\"
    mkdir 'AALines'
fi
if test -f 'AALines/00README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'AALines/00README'\"
else
echo shar: Extracting \"'AALines/00README'\" \(1074 characters\)
sed "s/^X//" >'AALines/00README' <<'END_OF_FILE'
XThis group of files is a simple demonstration of an anti-aliased line
Xrenderer from _Grahpics_Gems_.  Files in the release are:
X
X  00README -- This information file.
X
X  Makefile -- Makefile for creating the demo executable.
X
X  AALines.h -- Include file for demo source files.
X
X  AALines.c -- Rendering code from _Grahpics_Gems_ pages 690-693.
X
X  AATables.c -- Initialization code for frame buffer and lookup tables.
X
X  AAMain.c -- Calling routine for the renderer.
X
X  utah.h -- Include file for friendly Utah RLE front end.
X
X  utah.c -- Source for friendly Utah RLE front end.
X
XAs it is written, the program dumps its frame buffer to a Utah RLE
Xfile.  You need to obtain the Utah RLE library from another source;
Xtry the following FTP sites:
X
X        cs.utah.edu (128.110.4.21)
X        weedeater.math.yale.edu (130.132.23.17)
X        freebie.engin.umich.edu (35.2.68.23)
X
XIt should be fairly easy to dump the frame buffer to another type
Xof file, or straight to a display device.  See AAMain.c.
X
XHave fun.
X
X    -- Kelvin Thompson, 18 August 1990
X       kelvin@cs.utexas.edu
END_OF_FILE
if test 1074 -ne `wc -c <'AALines/00README'`; then
    echo shar: \"'AALines/00README'\" unpacked with wrong size!
fi
# end of 'AALines/00README'
fi
if test -f 'AALines/AALines.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'AALines/AALines.h'\"
else
echo shar: Extracting \"'AALines/AALines.h'\" \(1371 characters\)
sed "s/^X//" >'AALines/AALines.h' <<'END_OF_FILE'
X/*  FILENAME:  AALines.h  [revised 17 AUG 90]
X
X    AUTHOR:  Kelvin Thompson
X
X    DESCRIPTION:  Symbols and globals for the anti-aliased line
X      renderer.
X
X    #INCLUDED IN:
X      AAMain.c -- Calling routine for renderer.
X      AATables.c -- Initialization routines for lookup tables.
X      AALines.c -- Rendering code.
X*/
X
X/* frame buffer to hold the anti-aliased line */
X#define xpix 60
X#define ypix 60
Xextern char *fbuff;
X
X/* macros to access the frame buffer */
X#define PIXADDR(xx,yy) (fbuff+(yy)*xpix+(xx))
X#define PIXINC(dx,dy)  ((dy)*xpix+(dx))
X
X/* fixed-point data types and macros */
Xtypedef int FX;
Xtypedef unsigned int UFX;
X#define FX_FRACBITS 16  /* bits of fraction in FX format */
X#define FX_0        0   /* zero in fixed-point format */
X#define FLOAT_TO_FX(flt)  ((FX)((flt)*(1<<FX_FRACBITS)+0.5))
X
X/* some important constants */
X#define PI      3.1415926535897932384626433832795028841971693993751
X#define SQRT_2  1.4142135623730950488016887242096980785696718753769
X
X/* square-root function globals */
Xextern UFX *sqrtfunc;
Xextern int sqrtcells;
Xextern int sqrtshift;
X#define SQRTFUNC(fxval)  (sqrtfunc[ (fxval) >> sqrtshift ])
X
X/* AA globals */
Xextern float line_r;  /* line radius */
Xextern float pix_r;   /* pixel radius */
Xextern FX *coverage;
Xextern int covercells;
Xextern int covershift;
X#define COVERAGE(fxval) (coverage[ (fxval) >> covershift ])
END_OF_FILE
if test 1371 -ne `wc -c <'AALines/AALines.h'`; then
    echo shar: \"'AALines/AALines.h'\" unpacked with wrong size!
fi
# end of 'AALines/AALines.h'
fi
if test -f 'AALines/AAMain.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'AALines/AAMain.c'\"
else
echo shar: Extracting \"'AALines/AAMain.c'\" \(1578 characters\)
sed "s/^X//" >'AALines/AAMain.c' <<'END_OF_FILE'
X/*  FILENAME:  AAMain.c  [revised 17 AUG 90]
X
X    AUTHOR:  Kelvin Thompson
X
X    DESCRIPTION:  Calling routine for anti-aliased line renderer.
X      This routine calls the line renderer to draw a single
X      anti-aliased line into a small frame buffer.  The
X      routine then dumps the frame buffer to a Utah RLE file
X      'anti.rle'.
X
X    LINK WITH:
X      utah.h -- Definitions for friendly Utah RLE front end.
X      AALines.h -- Shared tables, symbols, etc. for renderer.
X      AALines.c -- Rendering code.
X      AATables.c -- Table initialization.
X*/
X
X#include <stdio.h>
X#include <math.h>
X#include "AALines.h"
X#include "utah.h"
X
X
X
Xmain ( argc, argv )
Xint argc;
Xchar *argv[];
X{
Xint i;
Xchar *scanptr;
Xint x1,y1,x2,y2;
X
X/* initialize frame buffer and look-up tables */
XAnti_Init();
X
X/* set line endpoints */
Xx1 =  2;  y1 =  2;
Xx2 = 25;  y2 = 55;
X
X/* render anti-aliased line to a frame buffer */
XAnti_Line( x1,y1, x2,y2 );
X
X
X/* The code below dumps the frame buffer to a Utah RLE file.
X** It should be pretty easy to rewrite so that it dumps to
X** any other kind of output file...or straight to a display
X** device.  The frame buffer is an array of characters
X** starting at 'fbuff' with size 'xpix' by 'ypix'.  */
X
X  {
X  /* thanks to A.T. Campbell for the friendly front end */
X  UTAH_FILE *picout;
X  picout = utah_write_init( "anti.rle", xpix, ypix );
X  if ( picout == NULL )
X    { perror("anti.rle");  exit(1); }
X  for ( i=0; i<ypix; i++ )
X    {
X    scanptr = &fbuff[i*xpix];
X    utah_write_rgb( picout, scanptr, scanptr, scanptr );
X    }
X  utah_write_close(picout);
X  }
X}
END_OF_FILE
if test 1578 -ne `wc -c <'AALines/AAMain.c'`; then
    echo shar: \"'AALines/AAMain.c'\" unpacked with wrong size!
fi
# end of 'AALines/AAMain.c'
fi
if test -f 'AALines/LongConst.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'AALines/LongConst.h'\"
else
echo shar: Extracting \"'AALines/LongConst.h'\" \(1701 characters\)
sed "s/^X//" >'AALines/LongConst.h' <<'END_OF_FILE'
X/*  FILENAME:   LongConst.h  [revised 18 AUG 90]
X
X    AUTHOR:  Kelvin Thompson
X
X    DESCRIPTION:  High-precision constants.  If this file is included
X      in the same file as GraphicsGems.h, this file must come *after*
X      GraphicsGems.h.  (It's okay to use this file without GraphicsGems.h.)
X
X        The standard _Graphics_Gems_ include file has some constants
X      that do not have full double-precision accuracy.  This file
X      has the constants to a ridiculously high precision.  See pages
X      434-435 of _Graphics_Gems_.  I got the constants from Mathematica.
X      
X        Also, this file has a constant and macro for finding the base-two
X      logarithm of a number.
X*/
X
X/* prevent multiple inclusion */
X#ifndef __LONGCONST_H__
X#define __LONGCONST_H__
X
X/* first get rid of stuff from GraphicsGems.h */
X#undef PI
X#undef PITIMES2
X#undef PIOVER2
X#undef E
X#undef SQRT2
X#undef SQRT3
X#undef GOLDEN
X#undef DTOR
X#undef RTOD
X
X/* re-define basic constants with high precision */
X#define PI     3.141592653589793238462643383279502884197169399375105820975
X#define E      2.718281828459045235360287471352662497757247093699959574967
X#define SQRT2  1.414213562373095048801688724209698078569671875376948073177
X#define SQRT3  1.732050807568877293527446341505872366942805253810380628056
X#define GOLDEN 1.618033988749894848204586834365638117720309179805762862135
X
X/* re-define derived constants */
X#define PITIMES2  (2.0*PI)
X#define PIOVER2   (0.5*PI)
X#define DTOR      (PI/180.0)
X#define RTOD      (180.0/PI)
X
X/* macro and constant for base 2 logarithm */
X#define LN2    0.693147180559945309417232121458176568075500134360255254121
X#define LOG2(val) (log(val)*(1.0/LN_2))
X
X#endif  /* __LONGCONST_H__ */
END_OF_FILE
if test 1701 -ne `wc -c <'AALines/LongConst.h'`; then
    echo shar: \"'AALines/LongConst.h'\" unpacked with wrong size!
fi
# end of 'AALines/LongConst.h'
fi
if test -f 'AALines/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'AALines/Makefile'\"
else
echo shar: Extracting \"'AALines/Makefile'\" \(462 characters\)
sed "s/^X//" >'AALines/Makefile' <<'END_OF_FILE'
X# FILENAME:  Makefile  [revised 18 AUG 90]
X# 
X# AUTHOR:  Kelvin Thompson
X# 
X# DESCRIPTION:  Makefile for anti-aliased line rendering demo.
X
X# locations of Utah RLE information
XUTAH_RLE_INCLUDE_DIR = /public/graphics/rle/include
XUTAH_RLE_LIB_FILE = /p/lib/librle.a
X
XCFLAGS = -I$(UTAH_RLE_INCLUDE_DIR)
X
XOBJS = AAMain.o AALines.o AATables.o utah.o
X
X%.o : %.c
X	$(CC) -c $(CFLAGS) $(CPPFLAGS) $<
X
XAALine : $(OBJS)
X	cc $(CFLAGS) -o $@ $(OBJS) $(UTAH_RLE_LIB_FILE) -lm
END_OF_FILE
if test 462 -ne `wc -c <'AALines/Makefile'`; then
    echo shar: \"'AALines/Makefile'\" unpacked with wrong size!
fi
# end of 'AALines/Makefile'
fi
if test -f 'AALines/utah.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'AALines/utah.h'\"
else
echo shar: Extracting \"'AALines/utah.h'\" \(877 characters\)
sed "s/^X//" >'AALines/utah.h' <<'END_OF_FILE'
X/*
X	file:		utah.h
X	description:	interface to Utah RLE toolkit
X	author:		A. T. Campbell
X	date:		October 30, 1989
X*/
X
X#ifndef UTAH_H
X#define UTAH_H
X
X/******************************************************************************/
X
X/* include files */
X#include "svfb_global.h"
X
X/******************************************************************************/
X
X/* type definitions */
Xtypedef struct sv_globals UTAH_FILE;
X
X/******************************************************************************/
X
X/* return values */
Xextern int		utah_read_close();
Xextern UTAH_FILE	*utah_read_init();
Xextern int		utah_read_pixels();
Xextern int		utah_read_rgb();
Xextern int		utah_write_close();
Xextern UTAH_FILE	*utah_write_init();
Xextern int		utah_write_pixels();
Xextern int		utah_write_rgb();
X
X/******************************************************************************/
X
X#endif UTAH_H
END_OF_FILE
if test 877 -ne `wc -c <'AALines/utah.h'`; then
    echo shar: \"'AALines/utah.h'\" unpacked with wrong size!
fi
# end of 'AALines/utah.h'
fi
if test -f 'BinRec.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'BinRec.c'\"
else
echo shar: Extracting \"'BinRec.c'\" \(1171 characters\)
sed "s/^X//" >'BinRec.c' <<'END_OF_FILE'
X/*
X * Recording Animation in Binary Order for Progressive Temporal Refinement
X * by Paul Heckbert
X * from "Graphics Gems", Academic Press, 1990
X */
X
X/*
X * binrec.c: demonstrate binary recording order
X *
X * Paul Heckbert	Jan 90
X */
X
X#include <stdio.h>
X
Xmain(ac, av)
Xint ac;
Xchar **av;
X{
X    int nframes, i, start_frame, repeat_count;
X    if (ac!=2) {
X	fprintf(stderr, "Usage: binrec <nframes>\n");
X	exit(1);
X    }
X    nframes = atoi(av[1]);
X
X    printf("step startframe repeatcount\n");
X    for (i=0; i<nframes; i++) {
X	inside_out(nframes, i, &start_frame, &repeat_count);
X	printf(" %2d     %2d          %2d\n", i, start_frame, repeat_count);
X    }
X}
X
X/*
X * inside_out: turn a number "inside-out": a generalization of bit-reversal.
X * For n = power of two, this is equivalent to bit-reversal.
X *
X * Turn the number a inside-out, yielding b.  If 0<=a<n then 0<=b<n.
X * Also return r = min(n-b, largest power of 2 dividing b)
X */
X
Xinside_out(n, a, b, r)
Xint n, a, *b, *r;
X{
X    int k, m;
X
X    *r = m = n;
X    for (*b=0, k=1; k<n; k<<=1)
X	if (a<<1>=m) {
X	    if (*b==0) *r = k;
X	    *b += k;
X	    a -= m+1>>1;
X	    m >>= 1;
X	}
X	else m = m+1>>1;
X    if (*r>n-*b) *r = n-*b;
X}
END_OF_FILE
if test 1171 -ne `wc -c <'BinRec.c'`; then
    echo shar: \"'BinRec.c'\" unpacked with wrong size!
fi
# end of 'BinRec.c'
fi
if test -f 'CircleRect.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'CircleRect.c'\"
else
echo shar: Extracting \"'CircleRect.c'\" \(1513 characters\)
sed "s/^X//" >'CircleRect.c' <<'END_OF_FILE'
X/* 
XFast Circle-Rectangle Intersection Checking
Xby Clifford A. Shaffer
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X#include "GraphicsGems.h"
X
Xboolean Check_Intersect(R, C, Rad)
X
X/* Return TRUE iff rectangle R intersects circle with centerpoint C and
X   radius Rad. */
X Box2 *R;
X Point2 *C;
X double Rad;
X{
X double Rad2;
X
X Rad2 = Rad * Rad;
X /* Translate coordinates, placing C at the origin. */
X R->max.x -= C->x;  R->max.y -= C->y;
X R->min.x -= C->x;  R->min.y -= C->y;
X
X if (R->max.x < 0) 			/* R to left of circle center */
X   	if (R->max.y < 0) 		/* R in lower left corner */
X     		return ((R->max.x * R->max.x + R->max.y * R->max.y) < Rad2);
X   	else if (R->min.y > 0) 	/* R in upper left corner */
X     		return ((R->max.x * R->max.x + R->min.y * R->min.y) < Rad2);
X   	else 					/* R due West of circle */
X     		return(ABS(R->max.x) < Rad);
X 	else if (R->min.x > 0)  	/* R to right of circle center */
X   		if (R->max.y < 0) 	/* R in lower right corner */
X     			return ((R->min.x * R->min.x) < Rad2);
X   	else if (R->min.y > 0)  	/* R in upper right corner */
X     		return ((R->min.x * R->min.x + R->min.y + R->min.y) < Rad2);
X   	else 				/* R due East of circle */
X     		return (R->min.x < Rad);
X 	else				/* R on circle vertical centerline */
X   		if (R->max.y < 0) 	/* R due South of circle */
X     		return (ABS(R->max.y) < Rad);
X   	else if (R->min.y > 0)  	/* R due North of circle */
X     		return (R->min.y < Rad);
X   	else 				/* R contains circle centerpoint */
X     		return(TRUE);
X} 	
END_OF_FILE
if test 1513 -ne `wc -c <'CircleRect.c'`; then
    echo shar: \"'CircleRect.c'\" unpacked with wrong size!
fi
# end of 'CircleRect.c'
fi
if test -f 'DigitalLine.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'DigitalLine.c'\"
else
echo shar: Extracting \"'DigitalLine.c'\" \(943 characters\)
sed "s/^X//" >'DigitalLine.c' <<'END_OF_FILE'
X/*
X * Digital Line Drawing
X * by Paul Heckbert
X * from "Graphics Gems", Academic Press, 1990
X */
X
X/*
X * digline: draw digital line from (x1,y1) to (x2,y2),
X * calling a user-supplied procedure at each pixel.
X * Does no clipping.  Uses Bresenham's algorithm.
X *
X * Paul Heckbert	3 Sep 85
X */
X
X#include "GraphicsGems.h"
X
Xdigline(x1, y1, x2, y2, dotproc)
Xint x1, y1, x2, y2;
Xvoid (*dotproc)();
X{
X    int d, x, y, ax, ay, sx, sy, dx, dy;
X
X    dx = x2-x1;  ax = ABS(dx)<<1;  sx = SGN(dx);
X    dy = y2-y1;  ay = ABS(dy)<<1;  sy = SGN(dy);
X
X    x = x1;
X    y = y1;
X    if (ax>ay) {		/* x dominant */
X	d = ay-(ax>>1);
X	for (;;) {
X	    (*dotproc)(x, y);
X	    if (x==x2) return;
X	    if (d>=0) {
X		y += sy;
X		d -= ax;
X	    }
X	    x += sx;
X	    d += ay;
X	}
X    }
X    else {			/* y dominant */
X	d = ax-(ay>>1);
X	for (;;) {
X	    (*dotproc)(x, y);
X	    if (y==y2) return;
X	    if (d>=0) {
X		x += sx;
X		d -= ay;
X	    }
X	    y += sy;
X	    d += ax;
X	}
X    }
X}
END_OF_FILE
if test 943 -ne `wc -c <'DigitalLine.c'`; then
    echo shar: \"'DigitalLine.c'\" unpacked with wrong size!
fi
# end of 'DigitalLine.c'
fi
if test -f 'FastJitter.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'FastJitter.c'\"
else
echo shar: Extracting \"'FastJitter.c'\" \(1720 characters\)
sed "s/^X//" >'FastJitter.c' <<'END_OF_FILE'
X/*
X * Efficient Generation of Sampling Jitter Using Look-up Tables
X * by Joseph M. Cychosz
X * from "Graphics Gems", Academic Press, 1990
X */
X
X/*  	Jitter.c - Sampling jitter generation routines.  	    
X/*
X/*	Description:
X/*	    Jitter.c contains the routines for generation of sampling  
X/*	    jitter using look-up tables.
X/*
X/*	Contents:
X/*	    Jitter1	Generate random jitter function 1.
X/*	    Jitter2	Generate random jitter function 2.			
X/*	    JitterInit	Initialize look-up tables.
X/* */
X
X#define			NRAN	1024	/* Random number table length	*/
X
Xstatic	double	URANX[NRAN],		/* Random number tables		*/
X				URANY[NRAN];
Xstatic	int		IRAND[NRAN];	/* Shuffle table	*/
Xstatic	int		MASK = NRAN-1;	/* Mask for jitter mod function */
Xextern	double	xranf();		/* Random number generator pro- */
X					/* ducing uniform numbers 0 to 1 */
X
X/*  	Jitter1 - Generate random jitter. 	*/
X
Xvoid	Jitter1	(x,y,s,xj,yj)
X		int	x, y;		/* Pixel location	 */
X		int	s;		/* Sample number for the pixel */
X		double	*xj, *yj;	/* Jitter (x,y)	*/
X{
X		*xj = URANX[ (x + (y<<2) + IRAND[(x+s)&MASK]) & MASK ];
X		*yj = URANY[ (y + (x<<2) + IRAND[(y+s)&MASK]) & MASK ];
X}
X
X
X
X/*  	Jitter2 - Generate random jitter.  	*/
X
Xvoid	Jitter2	(x,y,s,xj,yj)
X		int	x, y;		/* Pixel location  */
X		int	s;		/* Sample number for the pixel */
X		double	*xj, *yj;	/* Jitter (x,y)	*/
X{
X		*xj = URANX[ ((x | (y<<2)) + IRAND[(x+s)&MASK]) & MASK ];
X		*yj = URANY[ ((y | (x<<2)) + IRAND[(y+s)&MASK]) & MASK ];
X}
X
X
X/*  	JitterInit - Initialize look-up tables.  	*/
X
Xvoid	JitterInit	()
X{
X		int	i;
X
X		for ( i = 0 ; i < NRAN ; i++ ) URANX[i] = xranf();
X		for ( i = 0 ; i < NRAN ; i++ ) URANY[i] = xranf();
X		for ( i = 0 ; i < NRAN ; i++ ) IRAND[i] = (int) (NRAN *
X						xranf());
X}
END_OF_FILE
if test 1720 -ne `wc -c <'FastJitter.c'`; then
    echo shar: \"'FastJitter.c'\" unpacked with wrong size!
fi
# end of 'FastJitter.c'
fi
if test -f 'FixedTrig.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'FixedTrig.c'\"
else
echo shar: Extracting \"'FixedTrig.c'\" \(1725 characters\)
sed "s/^X//" >'FixedTrig.c' <<'END_OF_FILE'
X/* 
XFixed-Point Trigonometry with CORDIC Iterations
Xby Ken Turkowski
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X#define COSCALE 0x22c2dd1c /* 0.271572 */
X#define QUARTER ((int)(3.141592654 / 2.0 * (1 << 28)))
Xstatic long arctantab[32] = {  /* MS 4 integral bits for radians */
X	297197971, 210828714, 124459457, 65760959, 33381290, 16755422,
X	8385879, 4193963, 2097109, 1048571, 524287, 262144, 131072,
X	65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64,
X	32, 16, 8, 4, 2, 1, 0, 0,
X};
X
XCordicRotate(px, py, theta)
Xlong *px, *py;
Xregister long theta;	/* Assume that abs(theta) <= pi */
X{
X	register int i;
X	register long x = *px, y = *py, xtemp;
X	register long *arctanptr = arctantab;
X
X	/* The -1 may need to be pulled out and done as a left shift */
X	for (i = -1; i <= 28; i++) {
X		if (theta < 0) {
X			xtemp = x + (y >> i);
X			y     = y - (x >> i);
X			x = xtemp;
X			theta += *arctanptr++;
X		} else {
X			xtemp = x - (y >> i);	
X			y     = y + (x >> i);
X			x = xtemp;	
X			theta -= *arctanptr++;
X		}
X	}
X
X	*px = frmul(x, COSCALE); /* Compensate for CORDIC enlargement */
X	*py = frmul(y, COSCALE); /* frmul(a,b)=(a*b)>>31, high part  */
X				 /* of 64-bit product */
X}
X
X
X
X
XCordicPolarize(argx, argy)
Xlong *argx, *argy;	/* We assume these are already in the */
X					/*  right half plane */
X{
X	register long theta, yi, i;
X	register long x = *argx, y = *argy;
X	register long *arctanptr = arctantab;
X	for (i = -1; i <= 28; i++) {
X		if (y < 0) {		/* Rotate positive */
X			yi = y + (x >> i);
X			x  = x - (y >> i);
X			y  = yi;
X			theta -= *arctanptr++;
X		} else { 		/* Rotate negative */
X			yi = y - (x >> i);
X			x  = x + (y >> i);
X			y  = yi;
X			theta += *arctanptr++;
X		}
X	}
X
X	*argx = frmul(x, COSCALE);
X	*argy = theta;
X}
END_OF_FILE
if test 1725 -ne `wc -c <'FixedTrig.c'`; then
    echo shar: \"'FixedTrig.c'\" unpacked with wrong size!
fi
# end of 'FixedTrig.c'
fi
if test -f 'HSLtoRGB.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'HSLtoRGB.c'\"
else
echo shar: Extracting \"'HSLtoRGB.c'\" \(1736 characters\)
sed "s/^X//" >'HSLtoRGB.c' <<'END_OF_FILE'
X/*
XA Fast HSL-to-RGB Transform
Xby Ken Fishkin
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X#include <math.h>
X#include <stdio.h>
X#include "GraphicsGems.h"
X
X    /*
X     * RGB-HSL transforms.
X     * Ken Fishkin, Pixar Inc., January 1989.
X     */
X
X    /*
X    * given r,g,b on [0 ... 1],
X    * return (h,s,l) on [0 ... 1]
X    */
Xvoid
XRGB_to_HSL	(r,g,b,h,s,l)
Xdouble 	r,g,b;
Xdouble *h, *s, *l;
X{
X    double v;
X    double m;
X    double vm;
X    double r2, g2, b2;
X
X    v = MAX(r,g);
X    v = MAX(v,b);
X    m = MIN(r,g);
X    m = MIN(m,b);
X
X    if ((*l = (m + v) / 2.0) <= 0.0) return;
X    if ((*s = vm = v - m) > 0.0) {
X		*s /= (*l <= 0.5) ? (v + m ) :
X			(2.0 - v - m) ;
X    } else
X	return;
X
X
X    r2 = (v - r) / vm;
X    g2 = (v - g) / vm;
X    b2 = (v - b) / vm;
X
X    if (r == v)
X		*h = (g == m ? 5.0 + b2 : 1.0 - g2);
X    else if (g == v)
X		*h = (b == m ? 1.0 + r2 : 3.0 - b2);
X    else
X		*h = (r == m ? 3.0 + g2 : 5.0 - r2);
X
X    	*h /= 6;
X	}
X
X    /*
X     * given h,s,l on [0..1],
X     * return r,g,b on [0..1]
X     */
Xvoid
XHSL_to_RGB(h,sl,l,r,g,b)
Xdouble 	h,sl,l;
Xdouble 	*r, *g, *b;
X{
X    double v;
X
X    v = (l <= 0.5) ? (l * (1.0 + sl)) : (l + sl - l * sl);
X    if (v <= 0) {
X		*r = *g = *b = 0.0;
X    } else {
X		double m;
X		double sv;
X		int sextant;
X		double fract, vsf, mid1, mid2;
X
X		m = l + l - v;
X		sv = (v - m ) / v;
X		h *= 6.0;
X		sextant = h;	
X		fract = h - sextant;
X		vsf = v * sv * fract;
X		mid1 = m + vsf;
X		mid2 = v - vsf;
X		switch (sextant) {
X			case 0: *r = v; *g = mid1; *b = m; break;
X			case 1: *r = mid2; *g = v; *b = m; break;
X			case 2: *r = m; *g = v; *b = mid1; break;
X			case 3: *r = m; *g = mid2; *b = v; break;
X			case 4: *r = mid1; *g = m; *b = v; break;
X			case 5: *r = v; *g = m; *b = mid2; break;
X		}
X    }
X}
X
X
END_OF_FILE
if test 1736 -ne `wc -c <'HSLtoRGB.c'`; then
    echo shar: \"'HSLtoRGB.c'\" unpacked with wrong size!
fi
# end of 'HSLtoRGB.c'
fi
if test -f 'Hash3D.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Hash3D.c'\"
else
echo shar: Extracting \"'Hash3D.c'\" \(1454 characters\)
sed "s/^X//" >'Hash3D.c' <<'END_OF_FILE'
X/*
XA 3D Grid Hashing Frunction
Xby Brian Wyvill
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X/* Test Program for 3D hash function.
XIn C the hash function can be defined in a macro which
Xavoids a function call
Xand the bit operations are defined in the language.
X*/
X
X#include <stdio.h>
X#include <math.h>
X#include "GraphicsGems.h"		
X
X#define RANGE       256
X#define NBITS       4
X#define RBITS       4
X#define MASK        0360
X#define HASH(a,b,c) ((((a&MASK)<<NBITS|b&MASK)<<NBITS|c&MASK)>>RBITS)
X#define HSIZE       1<<NBITS*3
X#define IABS(x)     (int)((x) < 0 ? -(x) : (x))
X
Xtypedef struct {
X  double x,y,z;
X} Triple, *RefTriple;
X
Xtypedef struct {   /* linked list of objects to be stored */
X  Triple origin;
X  struct Object *link;
X} Object, *RefObject;
X
Xtypedef struct {  /* linked list of voxels (object pointers) */
X  RefObject objectList;
X  struct Voxel *link;
X} Voxel, *RefVoxel;
X
XRefVoxel table[HSIZE];  /* Table of pointers to Voxels */
X
X
Xcheckrange(z) double z;
X{
X  if (z < 0 || z >= RANGE)
X	fprintf(stderr,"%f out of range\n",z), 		exit();
X}
X
Xdouble getcoord()
X{
X  char buf[80];
X  double z;
X  scanf("%s",buf);
X  z = atof(buf);
X  checkrange(z);  
X  return z;
X}
X
Xmain()
X{
X  Triple a;
X  while (TRUE) {
X    printf("Enter object position x y z ===> ");
X    a.x = getcoord();
X    a.y = getcoord();
X    a.z = getcoord();
X    printf("\ncoord: %d %d %d Hashes to %d\n",IABS(a.x),IABS(a.y),IABS(a.z),
X	   HASH(IABS(a.x), IABS(a.y), IABS(a.z) ));
X  };  
X}
END_OF_FILE
if test 1454 -ne `wc -c <'Hash3D.c'`; then
    echo shar: \"'Hash3D.c'\" unpacked with wrong size!
fi
# end of 'Hash3D.c'
fi
if test -f 'HypotApprox.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'HypotApprox.c'\"
else
echo shar: Extracting \"'HypotApprox.c'\" \(1545 characters\)
sed "s/^X//" >'HypotApprox.c' <<'END_OF_FILE'
X/*
XA Fast Approximation to the Hypotenuse
Xby Alan Paeth
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
Xint idist(x1, y1, x2, y2)
X 	int x1, y1, x2, y2;
X	{
X/*
X * gives approximate distance from (x1,y1) to (x2,y2)
X * with only overestimations, and then never by more
X * than (9/8) + one bit uncertainty.
X */
X	if ((x2 -= x1) < 0) x2 = -x2;
X	if ((y2 -= y1) < 0) y2 = -y2;
X	return (x2 + y2 - (((x2>y2) ? y2 : x2) >> 1) );
X	}
X
Xint PntOnCirc(xp, yp, xc, yc, r)
X    int xp, yp, xc, yc, r;
X    {
X/* returns true IFF a test point (xp, yp) is to within a
X * pixel of the circle of center (xc, yc) and radius r.
X * "d" is an approximate length to circle's center, with
X * 1.0*r < dist < 1.12*r < (9/8)*r used for coarse testing.
X * The 9/8 ratio suggests the code: (x)<<3 and ((x)<<3)-(x).
X * Variables xp, yp, r and d should be of 32-bit precision.
X *
X * Note: (9/8) forms a very tight, proper inner bound but
X * must be slackened by one pixel for the outside test (#2)
X * to account for the -1/2 pixel absolute error introduced
X * when "idist" halves an odd integer; else rough clipping
X * will trim occasional points on the circle's perimeter.
X */
X    int d = idist(xp, yp, xc, yc);
X    if (  r >      d)   return(0);    /* far-in  */
X    if (9*r < 8*(d-1))  return(0);    /* far-out */
X/* full test: r < hypot(xp-xc,yp-yc) < r+1 */
X    xp -= xc;
X    yp -= yc;
X    d = xp*xp + yp*yp;
X    if (d < r*r) return(0);          /* near-in */
X    r += 1;
X    if (d > r*r) return(0);          /* near-out */
X    return(1);                       /* WITHIN */
X    }
END_OF_FILE
if test 1545 -ne `wc -c <'HypotApprox.c'`; then
    echo shar: \"'HypotApprox.c'\" unpacked with wrong size!
fi
# end of 'HypotApprox.c'
fi
if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MANIFEST'\"
else
echo shar: Extracting \"'MANIFEST'\" \(4705 characters\)
sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
X   File Name		Archive #	Description
X-----------------------------------------------------------
X 2DClip                     1	2D Clipping: A Vector-Based Approach
X 2DClip/Makefile            1	Makefile	
X 2DClip/bio.c               2	Basic operations
X 2DClip/box.h               1	BOX definition
X 2DClip/clip.c              2	Clipping routines
X 2DClip/cross.c             4	Intersection calculation	
X 2DClip/line.h              1	Major definitions	
X AALines                    1	Rendering Anti-Aliased Lines
X AALines/00README           1	Information about AALines Gem
X AALines/AALines.c          4	Code to render an anti-aliased line
X AALines/AALines.h          1	Symbols & globals
X AALines/AAMain.c           1	Calling routine
X AALines/AATables.c         4	Initialization of tables and frame buffer
X AALines/FastMatMul.c       5	Fast routines to multiply 4x4 matrices
X AALines/LongConst.h        1	High-precision constants
X AALines/Makefile           1	Makefile
X AALines/utah.c             3	Interface to Utah Raster Toolkit
X AALines/utah.h             1	Declarations for URT interface
X AAPolyScan.c               4	Fast Anti_aliasing Polygon Scan Conversion	
X Albers.c                   3	Albers Equal-Area Conic Map Projection
X BinRec.c                   1	Recording Animation in Binary Order	
X BoundSphere.c              3	An Efficient Bounding Sphere	
X BoxSphere.c                2	Box-Sphere Intersection Checking
X CircleRect.c               1	Fast Circle-Rectangle Intersection Checking
X ConcaveScan.c              4	Concave Polygon Scan Conversion
X DigitalLine.c              1	Digital Line Drawing
X Dissolve.c                 3	A Digital "Dissolve" Effect
X DoubleLine.c               3	Symmetric Double Step Line Algorithm
X FastJitter.c               1	Efficient Generation of Sampling Jitter
X FitCurves.c                5	Automatically Fit Digitized Curves
X FixedTrig.c                1	Fixed-Point Trig with CORDIC Iterations
X Forms.c                    4	Forms, Vectors, and Transformations
X GGVecLib.c                 5	2D and 3D Vector C Library	
X GraphicsGems.h             3	Graphics Gems header file	
X HSLtoRGB.c                 1	A Fast HSL-to-RGB Transform
X Hash3D.c                   1	3D Grid Hashing Function
X HypotApprox.c              1	A Fast Approximation to the Hypotenuse	
X Interleave.c               4	Bit Interleaving for Quad- or Octrees
X Label.c                    2	Nice Numbers for Graph Labels
X LineEdge.c                 3	Fast Line-Edge Intersections on a Uniform Grid
X MANIFEST                   1	This shipping list
X Makefile                   2	Makefile for the whole shebang
X MatrixInvert.c             3	Matrix Inversion	
X MatrixOrtho.c              1	Matrix Orthogonalization
X MatrixPost.c               2	Efficient Post-Concatenation of Trans. Matrices	
X Median.c                   2	Median Finding on a 3x3 Grid
X NearestPoint.c             5	Nearest-Point-On-Curve and Bezier Root-Finder
X OrderDither.c              2	Ordered Dithering
X PixelInteger.c             1	Proper Treatment of Pixels As Integers
X PntOnLine.c                2	A Fast 2D Point-On-Line Test
X PolyScan                   1	Convex Polygon Scan Conversion & Clipping
X PolyScan/Makefile          1	Makefile
X PolyScan/fancytest.c       2	Phong-shading a Texture mapping test
X PolyScan/poly.c            2	Simple utilities for polygon data structure	
X PolyScan/poly.h            2	Definitions for polygon package
X PolyScan/poly_clip.c       3	Homogeneous 3D polygon clipper
X PolyScan/poly_scan.c       3	Convex polygon point-sampled scan conversion
X PolyScan/scantest.c        2	Gouraud shading and Z-buffer demo	
X Quaternions.c              2	Using Quaternions for Coding 3D Transformations	
X README                     1	General information
X RGBTo4Bits.c               1	Mapping RGB Triples Onto Four Bits	
X RayBox.c                   1	Fast Ray-Box Intersection
X RayPolygon.c               1	An Efficient Ray-Polygon Intersection
X Roots3And4.c               3	Cubic and Quartic Roots
X SeedFill.c                 2	A Seed Fill Algorithm
X SquareRoot.c               2	A High-Speed, Low-Precision Square Root
X Sturm                      1	Using Sturm Sequences to Bracket Real Roots
X Sturm/Makefile             1	Makefile
X Sturm/main.c               2	Sample driver program
X Sturm/solve.h              1	Useful constants and types
X Sturm/sturm.c              4	Functions to build and evaluate Sturm sequence
X Sturm/util.c               1	Root polishing and evaluating utilities
X TransBox.c                 1	Transforming Axis-Aligned Bounding Boxes
X TriPoints.c                2	Generating Random Points in Triangles
X ViewTrans.c                1	3D Viewing and Rotation using Orthonormal Bases
END_OF_FILE
if test 4705 -ne `wc -c <'MANIFEST'`; then
    echo shar: \"'MANIFEST'\" unpacked with wrong size!
fi
# end of 'MANIFEST'
fi
if test -f 'MatrixOrtho.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MatrixOrtho.c'\"
else
echo shar: Extracting \"'MatrixOrtho.c'\" \(1335 characters\)
sed "s/^X//" >'MatrixOrtho.c' <<'END_OF_FILE'
X/* 
XMatrix Orthogonalization
XEric Raible
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X/*
X * Reorthogonalize matrix R - that is find an orthogonal matrix that is
X * "close" to R by computing an approximation to the orthogonal matrix
X *
X *           T  -1/2
X *   RC = R(R R)
X *			        			 T      -1
X * [RC is orthogonal because (RC) = (RC) ]
X *				               	                    -1/2
X * To compute C, we evaluate the Taylor expansion of F(x) = (I + x)
X * (where x = C - I) about x=0.
X * This gives C = I - (1/2)x + (3/8)x^2 - (5/16)x^3 + ...
X */
X
X#include "GraphicsGems.h"
X
Xstatic float coef[10] = 			/* From mathematica */
X  { 1, -1/2., 3/8., -5/16., 35/128., -63/256.,
X    231/1024., -429/2048., 6435/32768., -12155/65536. };
X
XMATRIX_reorthogonalize (R, limit)
X     Matrix R;
X{
X  Matrix I, Temp, X, X_power, Sum;
X  int power;
X
X  limit = MAX(limit, 10);
X
X  MATRIX_transpose (R, Temp);		/* Rt */
X  MATRIX_multiply (Temp, R, Temp);	/* RtR */
X  MATRIX_identify (I);
X  MATRIX_subtract (Temp, I, X);	/* RtR - I */
X  MATRIX_identify (X_power);		/* X^0 */
X  MATRIX_identify (Sum);			/* coef[0] * X^0 */
X
X  for (power = 1; power < limit; ++power)
X    {
X      MATRIX_multiply (X_power, X, X_power);
X      MATRIX_constant_multiply (coef[power], X_power, Temp);
X      MATRIX_add (Sum, Temp, Sum);
X    }
X
X  MATRIX_multiply (R, Sum, R);
X}
END_OF_FILE
if test 1335 -ne `wc -c <'MatrixOrtho.c'`; then
    echo shar: \"'MatrixOrtho.c'\" unpacked with wrong size!
fi
# end of 'MatrixOrtho.c'
fi
if test -f 'PixelInteger.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'PixelInteger.c'\"
else
echo shar: Extracting \"'PixelInteger.c'\" \(1534 characters\)
sed "s/^X//" >'PixelInteger.c' <<'END_OF_FILE'
X/*
XProper Treatment of Pixels as Integers
Xby Alan Paeth
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X#define Min     code[2]
X#define Med     code[1]
X#define Max     code[0]
X#define NCODE   3
X
X/*
X * A call to getplanes of the form:
X * getplanes(&red, &green, &blue, 256, "grb");
X *
X * fills the first three integer pointers with (near) identical
X * values which maximize red*green*blue <= 256. The final parameter
X * string defines tie-break order, here green>=red>=blue (the usual
X * default). The present code procedure calls "err(string, arg)"
X * given bad parameters; it is a simple task to rewrite the code as
X * a function which returns a success/failure code(s), as needed.
X *
X * In the example given above the code fills in the values
X * red = 6, green = 7, blue = 6.
X */
X
Xgetplanes(r, g, b, n, bias)
X    int *r, *g, *b;
X    char *bias;
X    {
X    int i, code[NCODE];
X    if(strlen(bias) != NCODE )
X        err("bias string \"%s\" wrong length",bias);
X    Min = Med = Max = 0;
X    *r = *g = *b = 0;
X    while(Min*Min*Min <= n) Min++;
X    Min--;
X    while(Med*Med*Min <= n) Med++;
X    Med--;
X    Max = n/(Min*Med);
X    for( i = 0; i < NCODE; i++ )
X	   {
X        switch(bias[i])
X            {
X            case 'r': case 'R': *r = code[i]; break;
X            case 'g': case 'G': *g = code[i]; break;
X            case 'b': case 'B': *b = code[i]; break;
X            default: err("bad bias character: \'%c\'",bias[i]); break;
X            }
X        }
X    if (!(*r && *g && *b)) err("bias string \"%s\" deficient", bias);
X    }
X    
END_OF_FILE
if test 1534 -ne `wc -c <'PixelInteger.c'`; then
    echo shar: \"'PixelInteger.c'\" unpacked with wrong size!
fi
# end of 'PixelInteger.c'
fi
if test ! -d 'PolyScan' ; then
    echo shar: Creating directory \"'PolyScan'\"
    mkdir 'PolyScan'
fi
if test -f 'PolyScan/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'PolyScan/Makefile'\"
else
echo shar: Extracting \"'PolyScan/Makefile'\" \(380 characters\)
sed "s/^X//" >'PolyScan/Makefile' <<'END_OF_FILE'
X# Makefile for scantest, test program for generic convex polygon scan conversion
X#
X# Note: fancytest.c needs a main routine and several auxiliary routines
X# in order to be compiled.
X
XCFLAGS = $(GENCFLAGS)
X
Xscantest: scantest.o poly_scan.o poly.o
X	$(CC) $(CFLAGS) -o scantest scantest.o poly_scan.o poly.o -lm
X
Xclean:
X	/bin/rm -f scantest.o poly_clip.o poly_scan.o poly.o scantest
END_OF_FILE
if test 380 -ne `wc -c <'PolyScan/Makefile'`; then
    echo shar: \"'PolyScan/Makefile'\" unpacked with wrong size!
fi
# end of 'PolyScan/Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(5838 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
X[ This package last updated Wed Dec 12 20:45:09 EST 1990. ]
X
XREADME
X
XThis package contains the most up-to-date versions of the C source
Xfiles from the book "Graphics Gems" (Editor Andrew S. Glassner,
XAcademic Press, 1990 ISBM 0-12-286165-5, 833 pgs.).
X
XAll known bugs have been fixed, formatting problems have been
Xcorrected, and enchancements to some of the original Gems have
Xbeen made.
X
XMakefiles are provided that create stand-alone programs, many object
Xfiles, and "gemlib.a".  This Graphics Gem Library is created for
Xcompilation-testing only, and is not intended to be a usable library
X(although it may become so in the future).  Indeed, many of the Gems
Xwill not compile or run properly without the addition of functions,
Xtables, and the like.  See the book and the Makefile for more details.
X
XEach Gem is made available on an as-is basis; although 
Xconsiderable effort has been expended to check the programs 
Xas originally designed and their release in electronic form, 
Xthe authors and the publisher make no guarantees or 
Xwarrantees about the correctness of any of these programs or 
Xalgorithms.  
X
XThe authors and the publisher hold no copyright restrictions 
Xon any of these files; this source code is public domain, and 
Xis freely available to the entire computer graphics community 
Xfor study, use, and modification.  We do request that the 
Xcomment at the top of each file, identifying the original 
Xauthor and its original publication in the book Graphics 
XGems, be retained in all programs that use these files.
X
XAn archive of the most current versions of all the Gems is maintained
Xon weedeater.math.yale.edu (130.132.23.17) and is available via
Xanonymous ftp in pub/GraphicsGems/src.
X
XYou are encouraged to submit bug fixes, skeleton programs, and the like
Xto Craig Kolb (kolb@yale.edu).
X
XAndrew Glassner / Craig Kolb
X
X================
X
XThe table below gives the correspondence between each source
Xfile in this directory and the name of the Gem it implements.
XEach implementation illustrates one way to realize the
Xtechniques described by the accompanying Gem in the book. 
XThe files here contain only the source code for that 
Xrealization.  For a more complete description of the 
Xalgorithms and their applications see the Gems of the same 
Xname in the first 11 Chapters of the book.
X
X---------- header files ----------
XGraphicsGems.h         / Graphics Gems C Header File
X
X----------    C code    ----------
X2DClip/*               / Two-Dimensional Clipping: 
X                         A Vector-Based Approach
XAALines/*              / Rendering Anti-Aliased Lines
XAAPolyScan.c           / Fast Anti-Aliasing Polygon
X                         Scan Conversion
XAlbers.c               / Albers Equal-Area Conic Map
X                         Projection
XBinRec.c               / Recording Animation in Binary Order 
X                         For Progressive Temporal Refinement  
XBoundSphere.c          / An Efficient Bounding Sphere
XBoxSphere.c            / A Simple Method for Box-Sphere 
X                         Intersection Checking 
XCircleRect.c           / Fast Circle-Rectangle Intersection
X                         Checking 
XConcaveScan.c          / Concave Polygon Scan Conversion
XDigitalLine.c          / Digital Line Drawing
XDissolve.c 	       / A Digital "Dissolve" Effect
XDoubleLine.c           / Symmetric Double Step Line Algorithm
XFastJitter.c           / Efficient Generation of Sampling
X                         Jitter Using Look-up Tables
XFitCurves.c            / An Algorithm for Automatically 
X                         Fitting Digitized Curves
XFixedTrig.c            / Fixed-Point Trigonometry with 
X                         CORDIC Iterations
XForms.c                / Forms, Vectors, and Transforms
XGGVecLib.c             / 2D And 3D Vector C Library   
XHSLtoRGB.c             / A Fast HSL-to-RGB Transform
XHash3D.c               / 3D Grid Hashing Function
XHypotApprox.c          / A Fast Approximation to 
X                         the Hypotenuse
XInterleave.c           / Bit Interleaving for Quad- 
X                         or Octrees
XLabel.c                / Nice Numbers for Graph Labels
XLineEdge.c             / Fast Line-Edge Intersections On 
X                         A Uniform Grid   
XMatrixInvert.c         / Matrix Inversion
XMatrixOrtho.c          / Matrix Orthogonalization
XMatrixPost.c           / Efficient Post-Concatenation of 
X                         Transformation Matrices
XMedian.c               / Median Finding on a 3x3 Grid
XNearestPoint.c         / Solving the 
X                         Nearest-Point-On-Curve Problem
X                         and
X                         A Bezier Curve-Based Root-Finder
XOrderDither.c          / Ordered Dithering
XPixelInteger.c         / Proper Treatment of Pixels 
X                         As Integers
XPntOnLine.c            / A Fast 2D Point-On-Line Test
XPolyScan/*             / Generic Convex Polygon 
X                         Scan Conversion and Clipping
XQuaternions.c          / Using Quaternions for Coding 
X                         3D Transformations
XRGBTo4Bits.c           / Mapping RGB Triples Onto Four Bits
XRayBox.c               / Fast Ray-Box Intersection
XRayPolygon.c           / An Efficient Ray-Polygon 
X                         Intersection
XRoots3And4.c           / Cubic and Quartic Roots
XSeedFill.c             / A Seed Fill Algorithm
XSquareRoot.c           / A High-Speed, Low-Precision 
X                         Square Root
XSturm/*                / Using Sturm Sequences to Bracket 
X                         Real Roots of Polynomial Equations
XTransBox.c             / Transforming Axis-Aligned 
X                         Bounding Boxes
XTriPoints.c            / Generating Random Points 
X                         In Triangles   
XViewTrans.c            / 3D Viewing and Rotation Using
X                         Orthonormal Bases
END_OF_FILE
if test 5838 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'RGBTo4Bits.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'RGBTo4Bits.c'\"
else
echo shar: Extracting \"'RGBTo4Bits.c'\" \(1448 characters\)
sed "s/^X//" >'RGBTo4Bits.c' <<'END_OF_FILE'
X/*
XMapping RGB Triples onto Four Bits
Xby Alan Paeth
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
Xremap8(R, G, B, R2, G2, B2)
X    float R, G, B, *R2, *G2, *B2;
X    {
X/*
X * remap8 maps floating (R,G,B) triples onto quantized
X * (R2,B2,B2) triples and returns the code (vertex)
X * value/color table entry for the quantization. The
X * points (eight) are the vertices of the cube.
X */
X    int code;
X    *R2 = *G2 = *B2 = 0.0;
X    code = 0;
X    if (R >= 0.5) { *R2 = 1.0; code |= 1; }
X    if (G >= 0.5) { *G2 = 1.0; code |= 2; }
X    if (B >= 0.5) { *B2 = 1.0; code |= 4; }
X    return(code);
X    }
X
X/*
X * remap14 maps floating (R,G,B) triples onto quantized
X * (R2,B2,B2) triples and returns the code (vertex)
X * value/color table entry for the quantization. The
X * points (fourteen) are the vertices of the cuboctahedron.
X */
X
Xfloat rval[] = { 0.,.5 ,.5 , 1.,.0 , 0., 0.,.5,
X                .5 , 1., 1., 1., 0.,.5 ,.5 , 1.};
Xfloat gval[] = { 0.,.5 , 0., 0.,.5 , 1., 0.,.5,
X                .5 , 1., 0.,.5 , 1., 1.,.5 , 1.};
Xfloat bval[] = { 0., 0.,.5 , 0.,.5 , 0., 1.,.5,
X                .5 , 0., 1.,.5 , 1.,.5 , 1., 1.};
X
Xint remap14(R, G, B,  R2, G2, B2)
X    float R, G, B, *R2, *G2, *B2;
X    {
X    int code = 0;
X    if ( R + G + B > 1.5) code |= 8;
X    if (-R + G + B > 0.5) code |= 4;
X    if ( R - G + B > 0.5) code |= 2;
X    if ( R + G - B > 0.5) code |= 1;
X    *R2 = rval[code];
X    *G2 = gval[code];
X    *B2 = bval[code];
X    return(code);
X    }
END_OF_FILE
if test 1448 -ne `wc -c <'RGBTo4Bits.c'`; then
    echo shar: \"'RGBTo4Bits.c'\" unpacked with wrong size!
fi
# end of 'RGBTo4Bits.c'
fi
if test -f 'RayBox.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'RayBox.c'\"
else
echo shar: Extracting \"'RayBox.c'\" \(1793 characters\)
sed "s/^X//" >'RayBox.c' <<'END_OF_FILE'
X/* 
XFast Ray-Box Intersection
Xby Andrew Woo
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X#include "GraphicsGems.h"
X
X#define NUMDIM	3
X#define RIGHT	0
X#define LEFT	1
X#define MIDDLE	2
X
Xchar HitBoundingBox(minB,maxB, origin, dir,coord)
Xdouble minB[NUMDIM], maxB[NUMDIM];		/*box */
Xdouble origin[NUMDIM], dir[NUMDIM];		/*ray */
Xdouble coord[NUMDIM];				/* hit point */
X{
X	char inside = TRUE;
X	char quadrant[NUMDIM];
X	register int i;
X	int whichPlane;
X	double maxT[NUMDIM];
X	double candidatePlane[NUMDIM];
X
X	/* Find candidate planes; this loop can be avoided if
X   	rays cast all from the eye(assume perpsective view) */
X	for (i=0; i<NUMDIM; i++)
X		if(origin[i] < minB[i]) {
X			quadrant[i] = LEFT;
X			candidatePlane[i] = minB[i];
X			inside = FALSE;
X		}else if (origin[i] > maxB[i]) {
X			quadrant[i] = RIGHT;
X			candidatePlane[i] = maxB[i];
X			inside = FALSE;
X		}else	{
X			quadrant[i] = MIDDLE;
X		}
X
X	/* Ray origin inside bounding box */
X	if(inside)	{
X		coord = origin;
X		return (TRUE);
X	}
X
X
X	/* Calculate T distances to candidate planes */
X	for (i = 0; i < NUMDIM; i++)
X		if (quadrant[i] != MIDDLE && dir[i] !=0.)
X			maxT[i] = (candidatePlane[i]-origin[i]) / dir[i];
X		else
X			maxT[i] = -1.;
X
X	/* Get largest of the maxT's for final choice of intersection */
X	whichPlane = 0;
X	for (i = 1; i < NUMDIM; i++)
X		if (maxT[whichPlane] < maxT[i])
X			whichPlane = i;
X
X	/* Check final candidate actually inside box */
X	if (maxT[whichPlane] < 0.) return (FALSE);
X	for (i = 0; i < NUMDIM; i++)
X		if (whichPlane != i) {
X			coord[i] = origin[i] + maxT[whichPlane] *dir[i];
X			if ((quadrant[i] == RIGHT && coord[i] < minB[i]) ||
X			   (quadrant[i] == LEFT && coord[i] > maxB[i]))
X			   return (FALSE);	/* outside box */
X			}else {
X				coord[i] = candidatePlane[i];
X			}
X	return (TRUE);				/* ray hits box */
X}	
X
END_OF_FILE
if test 1793 -ne `wc -c <'RayBox.c'`; then
    echo shar: \"'RayBox.c'\" unpacked with wrong size!
fi
# end of 'RayBox.c'
fi
if test -f 'RayPolygon.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'RayPolygon.c'\"
else
echo shar: Extracting \"'RayPolygon.c'\" \(1553 characters\)
sed "s/^X//" >'RayPolygon.c' <<'END_OF_FILE'
X/*
XAn Efficient Ray/Polygon Intersection
Xby Didier Badouel
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X/* the value of t is computed.
X * i1 and i2 come from the polygon description.
X * V is the vertex table for the polygon and N the
X * associated normal vectors.
X */
XP[0] = ray.O[0] + ray.D[0]*t;
XP[1] = ray.O[1] + ray.D[1]*t;
XP[2] = ray.O[2] + ray.D[2]*t;
Xu0 = P[i1] - V[0][i1]; v0 = P[i2] - V[0][i2];
Xinter = FALSE; i = 2;
Xdo {
X    /* The polygon is viewed as (n-2) triangles. */
X    u1 = V[i-1][i1] - V[0][i1]; v1 = V[i-1][i2] - V[0][i2];
X    u2 = V[i  ][i1] - V[0][i1]; v2 = V[i  ][i2] - V[0][i2];
X
X    if (u1 == 0)    {
X        beta = u0/u2;
X        if ((beta >= 0.)&&(beta <= 1.)) {
X            alpha = (v0 - beta*v2)/v1;
X            inter = ((alpha >= 0.)&&(alpha+beta) <= 1.));
X        }
X    } else {
X        beta = (v0*u1 - u0*v1)/(v2*u1 - u2*v1);
X        if ((beta >= 0.)&&(beta <= 1.)) {
X            alpha = (u0 - beta*u2)/u1;
X            inter = ((alpha >= 0)&&((alpha+beta) <= 1.));
X        }
X    }
X} while ((!inter)&&(++i < poly.n));
X
Xif (inter) {
X    /* Storing the intersection point. */
X    ray.P[0] = P[0]; ray.P[1] = P[1]; ray.P[2] = P[2];
X    /* the normal vector can be interpolated now or later. */
X    if (poly.interpolate) {
X        gamma = 1 - (alpha+beta);
X        ray.normal[0] = gamma * N[0][0] + alpha * N[i-1][0] + 
X		beta * N[i][0];
X        ray.normal[1] = gamma * N[0][1] + alpha * N[i-1][1] +
X		 beta * N[i][1];
X        ray.normal[2] = gamma * N[0][2] + alpha * N[i-1][2] +
X		 beta * N[i][2];
X    }
X}
Xreturn (inter);
END_OF_FILE
if test 1553 -ne `wc -c <'RayPolygon.c'`; then
    echo shar: \"'RayPolygon.c'\" unpacked with wrong size!
fi
# end of 'RayPolygon.c'
fi
if test ! -d 'Sturm' ; then
    echo shar: Creating directory \"'Sturm'\"
    mkdir 'Sturm'
fi
if test -f 'Sturm/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Sturm/Makefile'\"
else
echo shar: Extracting \"'Sturm/Makefile'\" \(211 characters\)
sed "s/^X//" >'Sturm/Makefile' <<'END_OF_FILE'
X#
X# Makefile
X#
X#	command file for make to compile the solver.
X
Xsolve: main.o sturm.o util.o
X	cc -o solve main.o sturm.o util.o -lm
X
Xclean:
X	/bin/rm -f main.o sturm.o util.o solve
X
Xmain.o sturm.o util.o: solve.h
END_OF_FILE
if test 211 -ne `wc -c <'Sturm/Makefile'`; then
    echo shar: \"'Sturm/Makefile'\" unpacked with wrong size!
fi
# end of 'Sturm/Makefile'
fi
if test -f 'Sturm/solve.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Sturm/solve.h'\"
else
echo shar: Extracting \"'Sturm/solve.h'\" \(710 characters\)
sed "s/^X//" >'Sturm/solve.h' <<'END_OF_FILE'
X
X/*
X * solve.h
X *
X *	some useful constants and types.
X */
X#define	 	MAX_ORDER  		12	
X/* maximum order for a polynomial */
X	
X#define	  	RELERROR	  		1.0e-14
X/* smallest relative error we want */
X
X#define	  	MAXPOW	    	32		
X/* max power of 10 we wish to search to */
X
X#define	  	MAXIT	     	800		
X/* max number of iterations */
X
X/* a coefficient smaller than SMALL_ENOUGH is considered to 
X   be zero (0.0). */
X
X#define	  	SMALL_ENOUGH		1.0e-12
X
X
X/*
X * structure type for representing a polynomial
X */
Xtypedef  	struct	p {
X		     int	ord;
X		     double	coef[MAX_ORDER];
X} poly;
X
Xextern 	int		modrf();
Xextern 	int		numroots();
Xextern 	int		numchanges();
Xextern 	int		buildsturm();
X
Xextern 	double	evalpoly();
X	
X
END_OF_FILE
if test 710 -ne `wc -c <'Sturm/solve.h'`; then
    echo shar: \"'Sturm/solve.h'\" unpacked with wrong size!
fi
# end of 'Sturm/solve.h'
fi
if test -f 'Sturm/util.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Sturm/util.c'\"
else
echo shar: Extracting \"'Sturm/util.c'\" \(1768 characters\)
sed "s/^X//" >'Sturm/util.c' <<'END_OF_FILE'
X
X/*
X * util.c
X *
X *	some utlity functions for root polishing and evaluating
X * polynomials.
X */
X#include <math.h>
X#include <stdio.h>
X#include "solve.h"
X
X/*
X * evalpoly
X *
X *	evaluate polynomial defined in coef returning its value.
X */
Xdouble
Xevalpoly (ord, coef, x)
X	int		ord;
X	double	*coef, x;
X{
X	double	*fp, f;
X
X	fp = &coef[ord];
X	f = *fp;
X
X	for (fp--; fp >= coef; fp--)
X	f = x * f + *fp;
X
X	return(f);
X}
X
X
X/*
X * modrf
X *
X *	uses the modified regula-falsi method to evaluate the root
X * in interval [a,b] of the polynomial described in coef. The
X * root is returned is returned in *val. The routine returns zero
X * if it can't converge.
X */
Xint
Xmodrf(ord, coef, a, b, val)
X	int		ord;
X	double	*coef;
X	double	a, b, *val;
X{
X	int		its;
X	double	fa, fb, x, lx, fx, lfx;
X	double	*fp, *scoef, *ecoef;
X
X	scoef = coef;
X	ecoef = &coef[ord];
X
X	fb = fa = *ecoef;
X	for (fp = ecoef - 1; fp >= scoef; fp--) {
X		fa = a * fa + *fp;
X		fb = b * fb + *fp;
X	}
X
X	/*
X	 * if there is no sign difference the method won't work
X	 */
X	if (fa * fb > 0.0)
X		return(0);
X
X	if (fabs(fa) < RELERROR) {
X		*val = a;
X		return(1);
X	}
X
X	if (fabs(fb) < RELERROR) {
X		*val = b;
X		return(1);
X	}
X
X	lfx = fa;
X	lx = a;
X
X
X	for (its = 0; its < MAXIT; its++) {
X
X		x = (fb * a - fa * b) / (fb - fa);
X
X		fx = *ecoef;
X		for (fp = ecoef - 1; fp >= scoef; fp--)
X				fx = x * fx + *fp;
X
X		if (fabs(x) > RELERROR) {
X				if (fabs(fx / x) < RELERROR) {
X					*val = x;
X					return(1);
X				}
X		} else if (fabs(fx) < RELERROR) {
X				*val = x;
X				return(1);
X		}
X
X		if ((fa * fx) < 0) {
X				b = x;
X				fb = fx;
X				if ((lfx * fx) > 0)
X					fa /= 2;
X		} else {
X				a = x;
X				fa = fx;
X				if ((lfx * fx) > 0)
X					fb /= 2;
X		}
X
X		lx = x;
X		lfx = fx;
X	}
X
X	fprintf(stderr, "modrf overflow %f %f %f\n", a, b, fx);
X
X	return(0);
X}
X	
X
X
END_OF_FILE
if test 1768 -ne `wc -c <'Sturm/util.c'`; then
    echo shar: \"'Sturm/util.c'\" unpacked with wrong size!
fi
# end of 'Sturm/util.c'
fi
if test -f 'TransBox.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'TransBox.c'\"
else
echo shar: Extracting \"'TransBox.c'\" \(1672 characters\)
sed "s/^X//" >'TransBox.c' <<'END_OF_FILE'
X/*
XTransforming Axis-Aligned Bounding Boxes
Xby Jim Arvo
Xfrom "Graphics Gems", Academic Press, 1990
X*/
X
X#include "GraphicsGems.h"                                     
X/* Transforms a 3D axis-aligned box via a 3x3 matrix and a translation
X * vector and returns an axis-aligned box enclosing the result. */ 
X
Xvoid Transform_Box( M, T, A, B )
XMatrix3  M;  	/* Transform matrix.             */
XVector3  T;  	/* Translation matrix.           */
XBox3     A;  	/* The original bounding box.    */
XBox3    *B;  	/* The transformed bounding box. */
X    {
X    float  a, b;
X    float  Amin[3], Amax[3];
X    float  Bmin[3], Bmax[3];
X    int    i, j;
X
X    /*Copy box A into a min array and a max array for easy reference.*/
X
X    Amin[0] = A.min.x;  Amax[0] = A.max.x;
X    Amin[1] = A.min.y;  Amax[1] = A.max.y;
X    Amin[2] = A.min.z;  Amax[2] = A.max.z;
X
X    /* Take care of translation by beginning at T. */
X
X    Bmin[0] = Bmax[0] = T.x;
X    Bmin[1] = Bmax[1] = T.y;
X    Bmin[2] = Bmax[2] = T.z;
X
X    /* Now find the extreme points by considering the product of the */
X    /* min and max with each component of M.  */
X                     
X    for( i = 0; i < 3; i++ )
X    for( j = 0; j < 3; j++ )
X        {
X        a = M.element[i][j] * Amin[j];
X        b = M.element[i][j] * Amax[j];
X        if( a < b ) 
X
X            { 
X            Bmin[i] += a; 
X            Bmax[i] += b;
X            }
X        else 
X            { 
X            Bmin[i] += b; 
X            Bmax[i] += a;
X            }
X        }
X
X    /* Copy the result into the new box. */
X
X    B->min.x = Bmin[0];  B->max.x = Bmax[0];
X    B->min.y = Bmin[1];  B->max.y = Bmax[1];
X    B->min.z = Bmin[2];  B->max.z = Bmax[2];
X
X    } 
END_OF_FILE
if test 1672 -ne `wc -c <'TransBox.c'`; then
    echo shar: \"'TransBox.c'\" unpacked with wrong size!
fi
# end of 'TransBox.c'
fi
if test -f 'ViewTrans.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ViewTrans.c'\"
else
echo shar: Extracting \"'ViewTrans.c'\" \(1575 characters\)
sed "s/^X//" >'ViewTrans.c' <<'END_OF_FILE'
X/*
X3D Viewing and Rotation Using Orthonormal Bases
Xby Steve Cunningham
Xfrom "Grahics Gems", Academic Press, 1990
X*/
X
X/*
X * Transformations are presented as 4 by 3 matrices, omitting the
X * fourth column to save memory.
X *
X * Functions are used from the Graphics Gems vector C library
X */
X
X
X#include "GraphicsGems.h"		
X
Xtypedef float Transform[4][3];
X
Xvoid BuildViewTransform( VRP, EP, UP, T )
X	 Point3 VRP, EP, UP;
X	 Transform T;
X{
X	Vector3	U, V, N;
X	float	dot;
X
X	/*
X	 * Compute vector  N = EP - VRP  and normalize  N
X	 */
X	N.x = EP.x - VRP.x; N.y = EP.y - VRP.y; N.z = EP.z - VRP.z;
X	V3Normalize(&N);
X
X	/*
X	 * Compute vector  V = UP - VRP
X	 * Make vector  V  orthogonal to  N  and normalize  V
X	 */
X	V.x = UP.x - VRP.x; V.y = UP.y - VRP.y; V.z = UP.z - VRP.z;
X	dot = V3Dot(&V,&N);
X	V.x -= dot * N.x; V.y -= dot * N.y; V.z -= dot * N.z;
X	V3Normalize(&V);
X
X
X	/*
X	 * Compute vector  U = V x N  (cross product)
X	 */
X	V3Cross(&V,&N,&U);
X
X	/*
X	 * Write the vectors U, V, and N as the first three rows of the
X	 *       first, second, and third columns of  T, respectively
X	 */
X	T[0][0] = U.x;		/* column 1 , vector U */
X	T[1][0] = U.y;
X	T[2][0] = U.z;
X	T[0][1] = V.x;		/* column 2 , vector V */
X	T[1][1] = V.y;
X	T[2][1] = V.z;
X	T[0][2] = N.x;		/* column 3 , vector N */
X	T[1][2] = N.y;
X	T[2][2] = N.z;
X
X	/*
X	 * Compute the fourth row of  T  to include the translation of
X	 *       VRP  to the origin
X	 */
X	T[3][0] = - U.x * VRP.x - U.y * VRP.y - U.z * VRP.z;
X	T[3][1] = - V.x * VRP.x - V.y * VRP.y - V.z * VRP.z;
X	T[3][2] = - N.x * VRP.x - N.y * VRP.y - N.z * VRP.z;
X
X	return;
X}
X
X
END_OF_FILE
if test 1575 -ne `wc -c <'ViewTrans.c'`; then
    echo shar: \"'ViewTrans.c'\" unpacked with wrong size!
fi
# end of 'ViewTrans.c'
fi
echo shar: End of archive 1 \(of 5\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 4 5 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 5 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0


file: /Techref/method/io/graphics/Part01.sh, 58KB, , updated: 1999/6/25 10:58, local time: 2022/8/18 00:18,
TOP NEW HELP FIND: 
18.204.56.185:LOG IN

 ©2022 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://massmind.org/techref/method/io/graphics/Part01.sh"> method io graphics Part01</A>

Did you find what you needed?

 

Welcome to massmind.org!

 

Welcome to massmind.org!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .