double signeddiedralAngle(TVertex* vertexes[]) { double di = minDiedralAngle(vertexes[0]->fPos,vertexes[1]->fPos,vertexes[2]->fPos,vertexes[3]->fPos); double v = tetraVolume(vertexes[0]->fPos,vertexes[1]->fPos,vertexes[2]->fPos,vertexes[3]->fPos); if (v<0) return -di; else return di; }
// http://www.mjoldfield.com/atelier/2011/03/tetra-moi.html Matrix3r woo::Volumetric::tetraInertia_cov(const Vector3r v[4], Real& vol, bool fixSign){ Matrix3r C0=Matrix3r::Zero(); // separate parts of covariance Vector3r C1=Vector3r::Zero(); for(int i:{0,1,2,3}){ C0+=v[i]*v[i].transpose(); C1+=v[i]; }; vol=tetraVolume(v[0],v[1],v[2],v[3]); if(vol<0 && fixSign) vol*=-1; Matrix3r C=(vol/20.)*(C0+C1*C1.transpose()); Matrix3r I=Matrix3r::Identity()*C.trace()-C; // if(fixSign && I(0,0)<0) return -I; assert(!fixSign || I(0,0)>0); return I; }