Added DihedralAngleRad that computes the signed dihedral angle between the normals of two adjacent faces

This commit is contained in:
Paolo Cignoni 2013-06-24 07:55:54 +00:00
parent 49d759af2a
commit 9ad68bc573
1 changed files with 135 additions and 85 deletions

View File

@ -63,6 +63,56 @@ inline bool IsBorder(FaceType const & f, const int j )
return true; return true;
} }
/*! \brief Compute the signed dihedral angle between the normals of two adjacent faces
*
* The angle between the normal is signed according to the concavity/convexity of the
* dihedral angle: negative if the edge shared between the two faces is concave, positive otherwise.
* The surface it is assumend to be oriented.
* It simply use the projection of the opposite vertex onto the plane of the other one.
* It does not assume anything on face normals.
*
* v0 ___________ vf1
* |\ |
* | \i1 f1 |
* | \ |
* |f0 i0\ |
* | \ |
* |__________\|
* vf0 v1
*/
template <class FaceType>
inline typename FaceType::ScalarType DihedralAngleRad(FaceType & f, const int i )
{
typedef typename FaceType::ScalarType ScalarType;
typedef typename FaceType::CoordType CoordType;
typedef typename FaceType::VertexType VertexType;
FaceType *f0 = &f;
FaceType *f1 = f.FFp(i);
int i0=i;
int i1=f.FFi(i);
VertexType *vf0 = f0->V2(i0);
VertexType *vf1 = f1->V2(i1);
CoordType n0 = NormalizedNormal(*f0);
CoordType n1 = NormalizedNormal(*f1);
ScalarType off0 = n0*vf0->P();
ScalarType off1 = n1*vf1->P();
ScalarType dist01 = off0 - n0*vf1->P();
ScalarType dist10 = off1 - n1*vf0->P();
// just to be sure use the sign of the largest in absolute value;
ScalarType sign;
if(fabs(dist01) > fabs(dist10)) sign = dist01;
else sign=dist10;
ScalarType angleRad=Angle(f0->N(),f1->N());
if(sign > 0 ) return angleRad;
else return -angleRad;
}
/// Count border edges of the face /// Count border edges of the face
template <class FaceType> template <class FaceType>