diff --git a/src/fgt/edit_point/connectedComponent.h b/src/fgt/edit_point/connectedComponent.h index 0ba0244f8..44ee37137 100644 --- a/src/fgt/edit_point/connectedComponent.h +++ b/src/fgt/edit_point/connectedComponent.h @@ -22,7 +22,7 @@ template class ComponentFinder { public: static std::vector<_MyVertexType*> &FindComponent(_MyMeshType& m, _MyVertexType& v, int numOfNeighbours, int numOfHop); - static std::vector<_MyVertexType*> &FindComponent(_MyMeshType& m, _MyVertexType& v, int numOfNeighbours, float dim, float maxHopDist, vector<_MyVertexType*> &borderVect, vector<_MyVertexType*> ¬ReachableVect, bool fitting = false, float planeDim = 0.0, float distanceFromPlane = 0.0); + static std::vector<_MyVertexType*> &FindComponent(_MyMeshType& m, float dim, vector<_MyVertexType*> &borderVect, vector<_MyVertexType*> ¬ReachableVect, bool fitting = false, float planeDim = 0.0, float distanceFromPlane = 0.0, Plane3 *fittingPlane = NULL); static void DeletePerVertexAttribute(_MyMeshType& m); @@ -81,9 +81,6 @@ std::vector<_MyVertexType*> &ComponentFinder<_MyMeshType, _MyVertexType>::FindCo } - - - template class Compare { private: @@ -106,7 +103,7 @@ public: * maximum distance we want between two vertex (with the Shortest Path we also compute the geodesic distance) **/ template -std::vector<_MyVertexType*> &ComponentFinder<_MyMeshType, _MyVertexType>::FindComponent(_MyMeshType& m, _MyVertexType& v, int numOfNeighbours, float dim, float maxHopDist, vector<_MyVertexType*> &borderVect, vector<_MyVertexType*> ¬ReachableVect, bool fitting, float planeDim, float distanceFromPlane) { +std::vector<_MyVertexType*> &ComponentFinder<_MyMeshType, _MyVertexType>::FindComponent(_MyMeshType& m, float dim, vector<_MyVertexType*> &borderVect, vector<_MyVertexType*> ¬ReachableVect, bool fitting, float planeDim, float distanceFromPlane, Plane3 *fittingPlane) { vector<_MyVertexType*> *resultVect = new vector<_MyVertexType*>(); vector pointToFit = vector(); @@ -119,8 +116,6 @@ std::vector<_MyVertexType*> &ComponentFinder<_MyMeshType, _MyVertexType>::FindCo if (hasDistParam) distFromCenter = vcg::tri::Allocator<_MyMeshType>::template GetPerVertexAttribute(m, std::string("DistParam")); else return *resultVect; - QTime t; - t.start(); for (typename _MyMeshType::VertexIterator vi = m.vert.begin(); vi != m.vert.end(); vi++) { if (fitting) { if (distFromCenter[vi] < planeDim) { @@ -129,25 +124,17 @@ std::vector<_MyVertexType*> &ComponentFinder<_MyMeshType, _MyVertexType>::FindCo } else if (distFromCenter[vi] < dim) resultVect->push_back(&*vi); } - //printf("FindComponent linear: %d ms\n", t.elapsed()); - typename vector<_MyVertexType*>::iterator it; if (fitting) { - Plane3 fittingPlane = Plane3(); - - //QTime t2; - //t2.start(); - vcg::PlaneFittingPoints(pointToFit, fittingPlane); - //printf("plane fitting: %d ms\n", t2.elapsed()); + vcg::PlaneFittingPoints(pointToFit, *fittingPlane); for (typename _MyMeshType::VertexIterator vi = m.vert.begin(); vi != m.vert.end(); vi++) { - if (distFromCenter[vi] < dim && math::Abs(vcg::SignedDistancePlanePoint(fittingPlane, vi->cP())) < distanceFromPlane) resultVect->push_back(&*vi); + if (distFromCenter[vi] < dim && math::Abs(vcg::SignedDistancePlanePoint(*fittingPlane, vi->cP())) < distanceFromPlane) resultVect->push_back(&*vi); } for (it = notReachableVect.begin(); it != notReachableVect.end(); it++) { - if (distFromCenter[*it] < dim && math::Abs(vcg::SignedDistancePlanePoint(fittingPlane, (*it)->cP())) < distanceFromPlane) borderVect.push_back(*it); + if (distFromCenter[*it] < dim && math::Abs(vcg::SignedDistancePlanePoint(*fittingPlane, (*it)->cP())) < distanceFromPlane) borderVect.push_back(*it); } - //printf("FindComponent FITTING: %d ms\n", t.elapsed()); } else { for (it = notReachableVect.begin(); it != notReachableVect.end(); it++) { @@ -172,12 +159,9 @@ void ComponentFinder<_MyMeshType, _MyVertexType>::Dijkstra(_MyMeshType& m, _MyVe } else distFromCenter = vcg::tri::Allocator<_MyMeshType>::template GetPerVertexAttribute(m, std::string("DistParam")); - //QTime t; - //t.start(); if (!hasKNNGraph) { KNNTree<_MyMeshType, _MyVertexType>::MakeKNNTree(m, numOfNeighbours); } - //printf("KNNGraph Creation: %d ms\n", t.elapsed()); typename _MyMeshType::template PerVertexAttributeHandle* > neighboursVect = vcg::tri::Allocator<_MyMeshType>::template GetPerVertexAttribute* >(m,"KNNGraph"); diff --git a/src/fgt/edit_point/edit_point.cpp b/src/fgt/edit_point/edit_point.cpp index 4fdcb4210..ee6264cd6 100644 --- a/src/fgt/edit_point/edit_point.cpp +++ b/src/fgt/edit_point/edit_point.cpp @@ -31,6 +31,8 @@ #include #include +#include + #include "connectedComponent.h" @@ -56,11 +58,8 @@ void EditPointPlugin::Decorate(MeshModel &m, GLArea * gla, QPainter *p) if(NewSel.size() > 0) { startingVertex = NewSel.front(); - //timer.start(); ComponentFinder::Dijkstra(m.cm, *startingVertex, k, this->maxHop, this->NotReachableVector); - //printf("ComponentFinder in Decorate::Dijkstra: %d ms\n", timer.elapsed()); - ComponentVector.push_back(startingVertex); } @@ -110,7 +109,7 @@ void EditPointPlugin::Decorate(MeshModel &m, GLArea * gla, QPainter *p) } glBegin(GL_POINTS); - glColor4f(1,0,0,.6f); + glColor4f(1,0,0,.5f); for (CMeshO::VertexIterator vi = m.cm.vert.begin(); vi != m.cm.vert.end(); vi++) { if (vi->IsS()) glVertex(vi->cP()); @@ -119,7 +118,7 @@ void EditPointPlugin::Decorate(MeshModel &m, GLArea * gla, QPainter *p) glEnd(); glBegin(GL_POINTS); - glColor4f(1,1,0,.6f); + glColor4f(1,1,0,.5f); for(vector::iterator vi = BorderVector.begin(); vi != BorderVector.end(); ++vi) { @@ -128,6 +127,24 @@ void EditPointPlugin::Decorate(MeshModel &m, GLArea * gla, QPainter *p) glEnd(); + if (editType == SELECT_FITTING_PLANE_MODE) { + fittingCircle.Clear(); + vcg::tri::OrientedDisk(fittingCircle, 192, fittingPlane.Projection(startingVertex->cP()), fittingPlane.Direction(), this->fittingRadius); + + glBegin(GL_TRIANGLE_FAN); + glColor4f(0.69,0.93,0.93,.7f); + + CMeshO::VertexIterator vi; + for (vi = fittingCircle.vert.begin(); vi != fittingCircle.vert.end(); vi++) { + glVertex(vi->cP()); + } + vi = fittingCircle.vert.begin(); + vi++; + glVertex(vi->cP()); + + glEnd(); + } + glPopAttrib(); glPopMatrix(); } @@ -156,11 +173,12 @@ bool EditPointPlugin::StartEdit(MeshModel &m, GLArea *gla) { } void EditPointPlugin::EndEdit(MeshModel &m, GLArea *gla) { + fittingCircle.Clear(); ComponentFinder::DeletePerVertexAttribute(m.cm); } -void EditPointPlugin::mousePressEvent(QMouseEvent *ev, MeshModel &m, GLArea *gla ) { +void EditPointPlugin::mousePressEvent(QMouseEvent *ev, MeshModel &m, GLArea *gla) { startingVertex = NULL; cur = ev->pos(); @@ -201,10 +219,10 @@ void EditPointPlugin::mouseMoveEvent(QMouseEvent *ev, MeshModel &m, GLArea *gla BorderVector.clear(); if (editType == SELECT_DEFAULT_MODE) - ComponentVector = ComponentFinder::FindComponent(m.cm, *startingVertex, k, this->dist, this->maxHop, BorderVector, NotReachableVector); + ComponentVector = ComponentFinder::FindComponent(m.cm, this->dist, BorderVector, NotReachableVector); else if (editType == SELECT_FITTING_PLANE_MODE) { this->fittingRadius = dist * fittingRadiusPerc; - ComponentVector = ComponentFinder::FindComponent(m.cm, *startingVertex, k, this->dist, this->maxHop, BorderVector, NotReachableVector, true, fittingRadius, planeDist); + ComponentVector = ComponentFinder::FindComponent(m.cm, this->dist, BorderVector, NotReachableVector, true, fittingRadius, planeDist, &fittingPlane); } gla->update(); @@ -288,20 +306,14 @@ void EditPointPlugin::keyPressEvent(QKeyEvent *ev, MeshModel &m, GLArea *gla) { if (hopDistModified) { - //timer.restart(); ComponentFinder::Dijkstra(m.cm, *startingVertex, 6, this->maxHop, this->NotReachableVector); - - //printf("ComponentFinder in ChangeHop::Dijkstra: %d ms\n", timer.elapsed()); } if (parameterModified) { - //printf("fittingRadius: %f\n", fittingRadius); - //printf("planeDist: %f\n", planeDist); - BorderVector.clear(); if (editType == SELECT_DEFAULT_MODE) - ComponentVector = ComponentFinder::FindComponent(m.cm, *startingVertex, k, this->dist, this->maxHop, BorderVector, NotReachableVector); + ComponentVector = ComponentFinder::FindComponent(m.cm, this->dist, BorderVector, NotReachableVector); else if (editType == SELECT_FITTING_PLANE_MODE) - ComponentVector = ComponentFinder::FindComponent(m.cm, *startingVertex, k, this->dist, this->maxHop, BorderVector, NotReachableVector, true, fittingRadius, planeDist); + ComponentVector = ComponentFinder::FindComponent(m.cm, this->dist, BorderVector, NotReachableVector, true, fittingRadius, planeDist, &fittingPlane); } gla->update(); @@ -326,17 +338,14 @@ void EditPointPlugin::wheelEvent(QWheelEvent* ev, MeshModel &m, GLArea *gla) { } if (hopDistModified) { - //timer.restart(); ComponentFinder::Dijkstra(m.cm, *startingVertex, k, this->maxHop, this->NotReachableVector); - //printf("ComponentFinder in ChangeHop::Dijkstra: %d ms\n", timer.elapsed()); - BorderVector.clear(); if (editType == SELECT_DEFAULT_MODE) - ComponentVector = ComponentFinder::FindComponent(m.cm, *startingVertex, k, this->dist, this->maxHop, BorderVector, NotReachableVector); + ComponentVector = ComponentFinder::FindComponent(m.cm, this->dist, BorderVector, NotReachableVector); else if (editType == SELECT_FITTING_PLANE_MODE) - ComponentVector = ComponentFinder::FindComponent(m.cm, *startingVertex, k, this->dist, this->maxHop, BorderVector, NotReachableVector, true, fittingRadius, planeDist); + ComponentVector = ComponentFinder::FindComponent(m.cm, this->dist, BorderVector, NotReachableVector, true, fittingRadius, planeDist, &fittingPlane); } gla->update(); diff --git a/src/fgt/edit_point/edit_point.h b/src/fgt/edit_point/edit_point.h index 7cfc9f2bd..944a83e67 100644 --- a/src/fgt/edit_point/edit_point.h +++ b/src/fgt/edit_point/edit_point.h @@ -71,6 +71,9 @@ private: float fittingRadius; float planeDist; + vcg::Plane3 fittingPlane; + CMeshO fittingCircle; + std::vector ComponentVector; std::vector BorderVector; std::vector NotReachableVector; diff --git a/src/fgt/edit_point/knnGraph.h b/src/fgt/edit_point/knnGraph.h index cd9e277f2..2138fab4d 100644 --- a/src/fgt/edit_point/knnGraph.h +++ b/src/fgt/edit_point/knnGraph.h @@ -50,10 +50,7 @@ void KNNTree<_MyMeshType, _MyVertexType>::MakeKNNTree(_MyMeshType& m, int numOfN } ConstDataWrapper DW(&(input[0]), input.size()); - //QTime t2; - //t2.start(); KdTree tree(DW); - //printf("KdTree Creation: %d ms\n", t2.elapsed()); tree.setMaxNofNeighbors(neighboursVectSize); @@ -62,7 +59,6 @@ void KNNTree<_MyMeshType, _MyVertexType>::MakeKNNTree(_MyMeshType& m, int numOfN //the highest value (inserted by the doQueryK function of the vcg library). Moreover //we have to exclude the queryPoint! - //t2.restart(); int neightId = -1; for (int j = 0; j < m.vn; j++) { tree.doQueryK(m.vert[j].cP()); @@ -74,7 +70,6 @@ void KNNTree<_MyMeshType, _MyVertexType>::MakeKNNTree(_MyMeshType& m, int numOfN kNeighboursVect[m.vert[j]]->push_back(&(m.vert[neightId])); } } - //printf("KdTree Creation (knn-query): %d ms\n", t2.elapsed()); return; }