1.  OVERVIEW

	This code accompanies the paper:

	Brian Mirtich, "Fast and Accurate Computation of
	Polyhedral Mass Properties," journal of graphics
	tools, volume 1, number 2, 1996.

	It computes the ten volume integrals needed for
	determining the center of mass, moments of
	inertia, and products of inertia for a uniform
	density polyhedron.  From this information, a
	body frame can be computed.

	To compile the program, use an ANSI compiler, and
	type something like
  
		% cc volInt.c -O2 -lm -o volInt


	Revision history

	26 Jan 1996	Program creation.

	 3 Aug 1996	Corrected bug arising when polyhedron density
			is not 1.0.  Changes confined to function main().
			Thanks to Zoran Popovic for catching this one.



2.  POLYHEDRON GEOMETRY FILES

	The program reads a data file specified on the
	command line.  This data file describes the
	geometry of a polyhedron, and has the following
	format:

	N	

	x_0	y_0	z_0
	x_1	y_1	z_1
	.
	.
	.
	x_{N-1}	y_{N-1}	z_{N-1}

	M

	k1	v_{1,1} v_{1,2} ... v_{1,k1}
	k2	v_{2,1} v_{2,2} ... v_{2,k2}
	.
	.
	.
	kM	v_{M,1} v_{M,2} ... v_{M,kM}


	where:
		N		number of vertices on polyhedron
		x_i y_i z_i	x, y, and z coordinates of ith vertex
		M		number of faces on polyhedron
		ki		number of vertices on ith face
		v_{i,j}		jth vertex on ith face

	In English:

		First the number of vertices are specified.  Next
		the vertices are defined by listing the 3
		coordinates of each one.  Next the number of faces
		are specified.  Finally, the faces themselves are
		specified.  A face is specified by first giving
		the number of vertices around the polygonal face,
		followed by the (integer) indices of these
		vertices.  When specifying indices, note that
		they must be given in counter-clockwise order
		(when looking at the face from outside the
		polyhedron), and the vertices are indexed from 0
		to N-1 for a polyhedron with N faces.

	White space can be inserted (or not) as desired.
	Three example polyhedron geometry files are included:

	cube	A cube, 20 units on a side, centered at 
		the origin and aligned with the coordinate axes.

	tetra	A tetrahedron formed by taking the convex 
		hull of the origin, and	the points (5,0,0), 
		(0,4,0), and (0,0,3).

	icosa	An icosahedron with vertices lying on the unit 
		sphere, centered at the origin.



3.  RUNNING THE PROGRAM

	Simply type,
	
		% volInt <polyhedron geometry filename>

	The program will read in the geometry of the
	polyhedron, and the print out the ten volume
	integrals.

	The program also computes some of the mass
	properties which may be inferred from the volume
	integrals.  A density of 1.0 is assumed, although
	this may be changed in function main().  The
	center of mass is computed as well as the inertia
	tensor relative to a frame with origin at the
	center of mass.  Note, however, that this matrix
	may not be diagonal.  If not, a diagonalization
	routine must be performed, to determine the
	orientation of the true body frame relative to
	the original model frame.  The Jacobi method
	works quite well (see Numerical Recipes in C by
	Press, et. al.).



4.  DISCLAIMERS

	1.  The volume integration code has been written
	to match the development and algorithms presented
	in the paper, and not with maximum optimization
	in mind.  While inherently very efficient, a few
	more cycles can be squeezed out of the algorithm.
	This is left as an exercise. :)

	2.  Don't like global variables?  The three
	procedures which evaluate the volume integrals
	can be combined into a single procedure with two
	nested loops.  In addition to providing some
	speedup, all of the global variables can then be
	made local.

	3.  The polyhedron data structure used by the
	program is admittedly lame; much better schemes
	are possible.  The idea here is just to give the
	basic integral evaluation code, which will have
	to be adjusted for other polyhedron data
	structures.

	4.  There is no error checking for the input
	files.  Be careful.  Note the hard limits
	#defined for the number of vertices, number of
	faces, and number of vertices per faces.
