/* %M%  (Steve Hill)  %I%  %G%$ */

/* quadric.h
 *
 */

/* quadric_t
 *
 * Quadric equation is represented by a matrix.
 */

typedef matrix_t quadric_t;


/* coef_t
 *
 * Each coeficient can be refered to by the following names.
 */

typedef enum
{
	QA, QB, QC, QD, QE, QF, QG, QH, QI, QJ
}
coef_t;

/* quadric_sort_t
 *
 * Classifications of quadrics.
 */

typedef enum
{
	ELLIPSOID,
	OTHER
}
quadric_sort_t;


#define QuadricPrint(f, q)	{MatrixPrint((f), (matrix_t *) (q));}
#define QuadricCopy(q)		((quadric_t *) MatrixCopy((matrix_t *) (q)))
#define QuadricNull		((quadric_t *) NULL)
#define QuadricMatrix(q)	((matrix_t *) q)

quadric_t	*QuadricSet PROTO((quadric_t *, coef_t, real_t)),
		*QuadricZero PROTO(()),
		*Quadric PROTO((real_t, real_t, real_t, real_t, real_t,
			 real_t, real_t, real_t, real_t, real_t)),
		*QuadricNorm PROTO((quadric_t *)),
		*QuadricNegate PROTO((quadric_t *));

real_t		QuadricGet PROTO((quadric_t *, coef_t)),
		QuadricInstantiate PROTO((quadric_t *, real_t, real_t, real_t));

void		QuadricCoef PROTO((coef_t, int *, int *)),
		QuadricCoefs PROTO((quadric_t *,
		          real_t *, real_t *, real_t *, real_t *, real_t *,
		          real_t *, real_t *, real_t *, real_t *, real_t *));

vector_t	*QuadricNormal PROTO((vector_t *, point_t *, quadric_t *));
