added function static int FollowDirection
This commit is contained in:
parent
8165152573
commit
98a28f8b46
|
@ -58,6 +58,19 @@ namespace vcg {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int FollowDirection(const FaceType &f0,
|
||||||
|
const FaceType &f1,
|
||||||
|
int dir0)
|
||||||
|
{
|
||||||
|
///first it rotate dir to match with f1
|
||||||
|
CoordType dirS=CrossVector(f0,dir0);
|
||||||
|
CoordType dirR=vcg::tri::CrossField<MeshType>::Rotate(f0,f1,dirS);
|
||||||
|
///then get the closest upf to K*PI/2 rotations
|
||||||
|
CoordType dir1=f1.cPD1();
|
||||||
|
int ret=I_K_PI(dir1,dirR,f1.cN());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int FollowLineDirection(const FaceType &f0,
|
static int FollowLineDirection(const FaceType &f0,
|
||||||
const FaceType &f1,
|
const FaceType &f1,
|
||||||
int dir)
|
int dir)
|
||||||
|
@ -351,12 +364,30 @@ namespace vcg {
|
||||||
/// a and b should be in the same plane orthogonal to N
|
/// a and b should be in the same plane orthogonal to N
|
||||||
static CoordType K_PI(const CoordType &a, const CoordType &b, const CoordType &n)
|
static CoordType K_PI(const CoordType &a, const CoordType &b, const CoordType &n)
|
||||||
{
|
{
|
||||||
CoordType c = (a^n).normalized();
|
CoordType c = (a^n).normalized();///POSSIBLE SOURCE OF BUG CHECK CROSS PRODUCT
|
||||||
ScalarType scorea = a*b;
|
ScalarType scorea = a*b;
|
||||||
ScalarType scorec = c*b;
|
ScalarType scorec = c*b;
|
||||||
if (fabs(scorea)>=fabs(scorec)) return a*Sign(scorea); else return c*Sign(scorec);
|
if (fabs(scorea)>=fabs(scorec)) return a*Sign(scorea); else return c*Sign(scorec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns the 90 deg rotation of a (around n) most similar to target b
|
||||||
|
/// a and b should be in the same plane orthogonal to N
|
||||||
|
static int I_K_PI(const CoordType &a, const CoordType &b, const CoordType &n)
|
||||||
|
{
|
||||||
|
CoordType c = (n^a).normalized();
|
||||||
|
ScalarType scorea = a*b;
|
||||||
|
ScalarType scorec = c*b;
|
||||||
|
if (fabs(scorea)>=fabs(scorec))///0 or 2
|
||||||
|
{
|
||||||
|
if (scorea>0)return 0;
|
||||||
|
return 2;
|
||||||
|
}else ///1 or 3
|
||||||
|
{
|
||||||
|
if (scorec>0)return 1;
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///interpolate cross field with barycentric coordinates
|
///interpolate cross field with barycentric coordinates
|
||||||
static CoordType InterpolateCrossField(const CoordType &t0,
|
static CoordType InterpolateCrossField(const CoordType &t0,
|
||||||
const CoordType &t1,
|
const CoordType &t1,
|
||||||
|
|
Loading…
Reference in New Issue