00001 #ifndef MXQMETRIC3_INCLUDED 00002 #define MXQMETRIC3_INCLUDED 00003 00004 /************************************************************************ 00005 00006 3D Quadric Error Metric 00007 00008 Copyright (C) 1998 Michael Garland. See "COPYING.txt" for details. 00009 00010 $Id: lod__quadric__error__metric_8h-source.html,v 1.4 2008-02-21 21:41:00 stage Exp $ 00011 00012 ************************************************************************/ 00013 00014 #include "mxmath.h" 00015 00016 typedef struct MxQuadric3_TAG 00017 { 00018 double a2, ab, ac, ad; 00019 double b2, bc, bd; 00020 double c2, cd; 00021 double d2; 00022 00023 double r; 00024 00025 } MxQuadric3; 00026 00027 /* initialization */ 00028 void mxquadric3_init( MxQuadric3 *, double a, double b, double c, double d, double area ); 00029 void mxquadric3_init_by_matrix( MxQuadric3 *, const Mat4 *Q, double area ); 00030 00031 /* manipulation utilities */ 00032 extern void quad_copy( MxQuadric3 *, const MxQuadric3 *Q ); 00033 extern void quad_add( MxQuadric3 *, const MxQuadric3 *, const MxQuadric3 * ); 00034 extern void quad_sub( MxQuadric3 *, const MxQuadric3 *, const MxQuadric3 * ); 00035 extern void quad_mul( MxQuadric3 *, const MxQuadric3 *, const double ); 00036 extern void quad_scale( MxQuadric3 *, double s ); /* multiply in place */ 00037 extern void quad_clear( MxQuadric3 *q ); 00038 extern void quad_transform( MxQuadric3 *, const MxQuadric3 *, const Mat4 *P ); 00039 /*inline void quad_set_area( MxQuadric3 *q, double a ) { q->r=a; }*/ 00040 #define quad_set_area(q,a) { (q)->r=(a); } 00041 00042 /* access utilities */ 00043 extern double quad_offset( const MxQuadric3 * ); 00044 extern double quad_area( const MxQuadric3 * ); 00045 00046 /* evaluation and optimization */ 00047 extern MxBool optimizev ( const MxQuadric3 *, Vec3 *v ); 00048 extern MxBool optimize3f( const MxQuadric3 *, double *x, double *y, double *z ); 00049 extern MxBool optimize2v( const MxQuadric3 *, Vec3 *v, const Vec3 *v1, const Vec3 *v2 ); 00050 extern MxBool optimize3v( const MxQuadric3 *, Vec3 *v, const Vec3 *v1, const Vec3 *v2, const Vec3 *v3 ); 00051 extern double quad_evaluate( const MxQuadric3 *, double x, double y, double z ); 00052 extern double quad_evaluatev( const MxQuadric3 *q, const double *v ); 00053 00054 00055 00056 /* MXQMETRIC3_INCLUDED*/ 00057 #endif