示例#1
0
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;

}
示例#2
0
// 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;
}