bool MxQuadric::optimize(MxVector& v) const { MxMatrix Ainv(A.dim()); double det = A.invert(Ainv); if( FEQ(det, 0.0, 1e-12) ) return false; v = (Ainv * b); mxv_neg(v, v.dim()); return true; }
void adjoint44(Mat4 *out, const Mat4 *in) { Mat4 A; Vec4 tempv; copy44( &A, in ); mxv_neg( tempv.elt, A.row[0].elt, 4 ); cross4( &(out->row[0]), &(A.row[1]), &(A.row[2]), &(A.row[3])); cross4( &(out->row[1]), &(tempv), &(A.row[2]), &(A.row[3])); cross4( &(out->row[2]), &(A.row[0]), &(A.row[1]), &(A.row[3])); cross4( &(out->row[3]), &(tempv), &(A.row[1]), &(A.row[2])); }
MxBool optimizev( const MxQuadric3 *q, Vec3 *v) { Mat3 Ainv, tensor; double det; Vec3 vtemp; quad_tensor( q, &tensor ); det = invert33( &Ainv, &tensor ); if( MxFEQ(det, 0.0, 1e-12f) ) return 0; quad_vector( &vtemp, q ); vecmul33( v, &Ainv, &vtemp ); mxv_neg( v->elt, v->elt, 3 ); /* MX_ASSERT( quad_evaluatev( q, v->elt ) >= 0 ); */ return 1; }