some generalization made

This commit is contained in:
Paolo Cignoni 2008-02-17 20:52:53 +00:00
parent 0758b0b32d
commit b71c11a0f7
2 changed files with 56 additions and 32 deletions

View File

@ -23,6 +23,9 @@
/****************************************************************************
History
$Log: not supported by cvs2svn $
Revision 1.3 2008/02/16 14:12:30 benedetti
first version
****************************************************************************/
@ -108,13 +111,13 @@ void CoordinateFrame::Render(QGLWidget* glw)
}
if(drawlabels){
font.setBold(true);
font.setPixelSize(10);
font.setPixelSize(12);
glColor(xcolor);
glw->renderText(size+(scalefactor*3),0,0,QString("X"),font);
glw->renderText(size+scalefactor*linewidth*1.5,0,0,QString("X"),font);
glColor(ycolor);
glw->renderText(0,size+(scalefactor*3),0,QString("Y"),font);
glw->renderText(0,size+scalefactor*linewidth*1.5,0,QString("Y"),font);
glColor(zcolor);
glw->renderText(0,0,size+(scalefactor*3),QString("Z"),font);
glw->renderText(0,0,size+scalefactor*linewidth*1.5,QString("Z"),font);
}
if(drawvalues){
font.setBold(false);
@ -250,14 +253,14 @@ Quaternionf MovableCoordinateFrame::GetRotation()
return rotation;
}
void MovableCoordinateFrame::Flip(const Point3f axis)
void MovableCoordinateFrame::Rot(float angle_deg,const Point3f axis)
{
Similarityf s;
s.SetRotate(M_PI,Inverse(rotation).Rotate(axis));
s.SetRotate(angle_deg*M_PI/180.0f,Inverse(rotation).Rotate(axis));
Move(s);
}
void MovableCoordinateFrame::AlignWith(const Point3f pri,const Point3f secondary)
void MovableCoordinateFrame::AlignWith(const Point3f pri,const Point3f secondary,const char c1, const char c2)
{
const float EPSILON=1e-6;
Point3f primary=pri;
@ -266,37 +269,55 @@ void MovableCoordinateFrame::AlignWith(const Point3f pri,const Point3f secondary
return;
primary.Normalize(); // ho l'asse primario, lo normalizzo
Plane3f plane(0,primary); // piano di proiezione per la seconda rotazione
Point3f old_z = Inverse(rotation).Rotate(Point3f(0,0,1)); // l'asse z
Point3f old_y_pro = plane.Projection(Inverse(rotation).Rotate(Point3f(0,1,0))); //la proiezione dell'asse y
Point3f old_x_pro = plane.Projection(Inverse(rotation).Rotate(Point3f(1,0,0))); //la proiezione dell'asse x
Plane3f plane(0,primary); // piano di proiezione per la seconda rotazione
Point3f x(1,0,0),y(0,1,0),z(0,0,1);
Point3f first(0,0,0),second(0,0,0),third(0,0,0);
// allinea l'asse z corrente all'asse primary
RotateToAlign(old_z,primary); // prima rotazione
if(c1=='X'){ first = x;
if((c2=='Y')||(c2==' ')){ second = y; third = z; }
else if(c2=='Z'){ second = z; third = y; }
else assert (0);
} else if(c1=='Y'){ first = y;
if((c2=='Z')||(c2==' ')){ second = z; third = x; }
else if(c2=='X'){ second = x; third = z; }
else assert (0);
} else if(c1=='Z'){ first = z;
if((c2=='X')||(c2==' ')){ second = x; third = y; }
else if(c2=='Y'){ second = y; third = x; }
else assert (0);
} else assert (0);
Point3f old_first = Inverse(rotation).Rotate(first); // l'asse 1
Point3f old_second_pro = plane.Projection(Inverse(rotation).Rotate(second)); //la proiezione dell'asse 2
Point3f old_third_pro = plane.Projection(Inverse(rotation).Rotate(third)); //la proiezione dell'asse 3
// allinea l'asse 1 corrente all'asse primary
RotateToAlign(old_first,primary); // prima rotazione
Point3f secondary_pro = plane.Projection(secondary); // la proiezione di secondary
Point3f new_y_pro = plane.Projection(Inverse(rotation).Rotate(Point3f(0,1,0))); // la proiezione dell'asse y dopo la prima rotazione
Point3f new_second_pro = plane.Projection(Inverse(rotation).Rotate(second)); // la proiezione dell'asse 2 dopo la prima rotazione
// se c'e` un asse secondary e la sua proiezione non e` 0
if( secondary.Norm() > EPSILON*size && secondary_pro.Norm() > EPSILON ){
// allinea la proiezione dell'asse y dopo la prima rotazione alla proiezione dell'asse secondary
// allinea la proiezione dell'asse 2 dopo la prima rotazione alla proiezione dell'asse secondary
secondary_pro.Normalize();
RotateToAlign(new_y_pro,secondary_pro);
RotateToAlign(new_second_pro,secondary_pro);
return;
}
// creco di riallineare la y
if ( old_y_pro.Norm() > EPSILON ) {
// allinea la proiezione dell'asse y dopo la prima rotazione alla proiezione dell'asse y
old_y_pro.Normalize();
RotateToAlign(new_y_pro,old_y_pro);
// creco di riallineare l'asse 2
if ( old_second_pro.Norm() > EPSILON ) {
// allinea la proiezione dell'asse 2 dopo la prima rotazione alla proiezione dell'asse 2
old_second_pro.Normalize();
RotateToAlign(new_second_pro,old_second_pro);
return;
}
// cerco di riallineare la x
Point3f new_x_pro = plane.Projection(Inverse(rotation).Rotate(Point3f(1,0,0))); //la proiezione dell'asse x dopo la prima rotazione
assert(old_x_pro.Norm() > EPSILON ); // la proiezione dell'asse x non dovrebbe essere 0
// allinea la proiezione dell'asse x dopo la prima rotazione alla proiezione dell'asse x
old_x_pro.Normalize();
RotateToAlign(new_x_pro,old_x_pro);
// cerco di riallineare l'asse 3
Point3f new_third_pro = plane.Projection(Inverse(rotation).Rotate(third)); //la proiezione dell'asse 3 dopo la prima rotazione
assert(old_third_pro.Norm() > EPSILON ); // la proiezione dell'asse 3 non dovrebbe essere 0
// allinea la proiezione dell'asse 3 dopo la prima rotazione alla proiezione dell'asse 3
old_third_pro.Normalize();
RotateToAlign(new_third_pro,old_third_pro);
}
void MovableCoordinateFrame::Move(const Similarityf track)
@ -496,9 +517,9 @@ void ActiveCoordinateFrame::SetRotation(const Quaternionf newrot)
manipulator->Reset();
}
void ActiveCoordinateFrame::AlignWith(const Point3f primary,const Point3f secondary=Point3f(0,0,0))
void ActiveCoordinateFrame::AlignWith(const Point3f primary,const Point3f secondary,const char c1,const char c2)
{
MovableCoordinateFrame::AlignWith(primary,secondary);
MovableCoordinateFrame::AlignWith(primary,secondary,c1,c2);
Update();
manipulator->Reset();
}

View File

@ -23,6 +23,9 @@
/****************************************************************************
History
$Log: not supported by cvs2svn $
Revision 1.3 2008/02/16 14:12:30 benedetti
first version
****************************************************************************/
#ifndef COORDINATEFRAME_H
@ -76,8 +79,8 @@ public:
virtual Point3f GetPosition();
virtual Quaternionf GetRotation();
virtual void GetTransform(Matrix44f &);
virtual void Flip(const Point3f);
virtual void AlignWith(const Point3f, const Point3f);
virtual void Rot(float,const Point3f);
virtual void AlignWith(const Point3f, const Point3f, const char, const char);
protected:
// data:
@ -99,7 +102,7 @@ public:
virtual void Reset(bool, bool);
virtual void SetPosition(const Point3f);
virtual void SetRotation(const Quaternionf);
virtual void AlignWith(const Point3f, const Point3f);
virtual void AlignWith(const Point3f, const Point3f,const char,const char);
void MouseDown(QPoint,int, int, int);
void MouseMove(QPoint,int, int);
void MouseUp(int, int, int);