From 1af874bbdda3bf43dbb49d49a01b0c24d51bbcb1 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Sat, 4 Feb 2006 09:41:44 +0000 Subject: [PATCH] Better handling of curvature computation for border vertex Plugin info updated --- src/meshlabplugins/meshcolorize/curvature.h | 86 +++++++++++++------ .../meshcolorize/meshcolorize.cpp | 11 +-- 2 files changed, 64 insertions(+), 33 deletions(-) diff --git a/src/meshlabplugins/meshcolorize/curvature.h b/src/meshlabplugins/meshcolorize/curvature.h index abdf6b46d..bcb838077 100644 --- a/src/meshlabplugins/meshcolorize/curvature.h +++ b/src/meshlabplugins/meshcolorize/curvature.h @@ -23,6 +23,10 @@ /**************************************************************************** History $Log$ +Revision 1.8 2006/02/04 09:41:44 vannini +Better handling of curvature computation for border vertex +Plugin info updated + Revision 1.7 2006/02/03 17:42:48 vannini bugfix & code indentation @@ -59,6 +63,10 @@ removed color_curvature.h in favour of curvature.h #include #include #include +#include +#include + +#include #define DEFAULT_HISTO_FRAC 0.05f #define DEFAULT_HISTO_RANGE 10000 @@ -91,6 +99,8 @@ namespace vcg typedef typename MESH_TYPE::FaceIterator FaceIterator; typedef typename MESH_TYPE::VertexIterator VertexIterator; typedef typename MESH_TYPE::VertContainer VertContainer; + typedef typename MESH_TYPE::FaceType FaceType; + typedef typename MESH_TYPE::CoordType CoordType; private: MESH_TYPE *ms; @@ -101,11 +111,15 @@ namespace vcg { float area0, area1, area2, angle0, angle1, angle2, e01, e12, e20; FaceIterator fi; - VertexIterator vi; - + VertexIterator vi; + //Calcola AreaMix in H (vale anche per K) for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD()) - (*TDCurvPtr)[*vi].H=0; + { + (*TDAreaPtr)[*vi].A = 0; + (*TDCurvPtr)[*vi].H = 0; + (*TDCurvPtr)[*vi].K = (float)(2.0 * M_PI); + } for(fi=(*ms).face.begin();fi!=(*ms).face.end();++fi) if( !(*fi).IsD()) { @@ -124,25 +138,19 @@ namespace vcg area1 = ( e01*(1.0/tan(angle2)) + e12*(1.0/tan(angle0)) ) / 8.0; area2 = ( e12*(1.0/tan(angle0)) + e20*(1.0/tan(angle1)) ) / 8.0; - (*TDCurvPtr)[(*fi).V(0)].H += area0; - (*TDCurvPtr)[(*fi).V(1)].H += area1; - (*TDCurvPtr)[(*fi).V(2)].H += area2; + (*TDAreaPtr)[(*fi).V(0)].A += area0; + (*TDAreaPtr)[(*fi).V(1)].A += area1; + (*TDAreaPtr)[(*fi).V(2)].A += area2; + } else // triangolo ottuso { - (*TDCurvPtr)[(*fi).V(0)].H += vcg::DoubleArea((*fi)) / 6.0; - (*TDCurvPtr)[(*fi).V(1)].H += vcg::DoubleArea((*fi)) / 6.0; - (*TDCurvPtr)[(*fi).V(2)].H += vcg::DoubleArea((*fi)) / 6.0; + (*TDAreaPtr)[(*fi).V(0)].A += vcg::DoubleArea((*fi)) / 6.0; + (*TDAreaPtr)[(*fi).V(1)].A += vcg::DoubleArea((*fi)) / 6.0; + (*TDAreaPtr)[(*fi).V(2)].A += vcg::DoubleArea((*fi)) / 6.0; } } - - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD()) - { - (*TDAreaPtr)[*vi].A = (*TDCurvPtr)[*vi].H; //Areamix è comune a H e a K - (*TDCurvPtr)[*vi].H = 0; - (*TDCurvPtr)[*vi].K = (float)(2.0 * M_PI); - } - + for(fi=(*ms).face.begin();fi!=(*ms).face.end();++fi) if( !(*fi).IsD() ) { angle0 = math::Abs(Angle( (*fi).P(1)-(*fi).P(0),(*fi).P(2)-(*fi).P(0) )); @@ -164,9 +172,27 @@ namespace vcg (*TDCurvPtr)[(*fi).V(0)].K -= angle0; (*TDCurvPtr)[(*fi).V(1)].K -= angle1; (*TDCurvPtr)[(*fi).V(2)].K -= angle2; + + + for(int i=0;i<3;i++) + { + if(vcg::face::IsBorder((*fi), i)) + { + CoordType e1,e2; + vcg::face::Pos hp(&*fi, i, (*fi).V(i)); + vcg::face::Pos hp1=hp; + + hp1.FlipV(); + e1=hp1.v->P() - hp.v->P(); + hp1.FlipV(); + hp1.NextB(); + e2=hp1.v->P() - hp.v->P(); + (*TDCurvPtr)[(*fi).V(i)].K -= math::Abs(Angle(e1,e2)); + } + } } - - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) { if((*TDAreaPtr)[*vi].A<=std::numeric_limits::epsilon()) { @@ -180,7 +206,7 @@ namespace vcg } } } - + public: Curvature(MESH_TYPE &mt):ms(&mt) { @@ -189,6 +215,11 @@ namespace vcg TDAreaPtr = new SimpleTempData((*ms).vert); (*TDAreaPtr).Start(AreaData()); + vcg::tri::UpdateTopology::FaceFace((*ms)); + vcg::tri::UpdateFlags::FaceBorderFromFF((*ms)); + vcg::tri::UpdateFlags::VertexBorderFromFace((*ms)); + //vcg::tri::UpdateColor::VertexBorderFlag((*ms)); + ComputeHK(); } @@ -198,12 +229,11 @@ namespace vcg (*TDAreaPtr).Stop(); } - void MapGaussianCurvatureIntoQuality() { VertexIterator vi; - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) (*vi).Q() = (*TDCurvPtr)[*vi].K; } @@ -211,7 +241,7 @@ namespace vcg void MapMeanCurvatureIntoQuality() { VertexIterator vi; - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) (*vi).Q() = (*TDCurvPtr)[*vi].H; } @@ -221,7 +251,7 @@ namespace vcg VertexIterator vi; //Compute sqrt(4*H^2-2K) - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) (*vi).Q()=math::Sqrt((4.0f * powf((*TDCurvPtr)[*vi].H, 2.0f)) - ((*TDCurvPtr)[*vi].K * 2.0f)); } @@ -231,7 +261,7 @@ namespace vcg float t; //Compute abs(H+sqrt(H*H-K)) + abs(H-sqrt(H*H-K)) - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) { t=math::Sqrt(powf((*TDCurvPtr)[*vi].H, 2.0f) - (*TDCurvPtr)[*vi].K); (*vi).Q()= math::Abs((*TDCurvPtr)[*vi].H + t) + math::Abs((*TDCurvPtr)[*vi].H - t); @@ -245,7 +275,7 @@ namespace vcg r.min=std::numeric_limits::max(); r.max=-std::numeric_limits::max(); - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) { if ((*vi).Q() < r.min) r.min = (*vi).Q(); if ((*vi).Q() > r.max) r.max = (*vi).Q(); @@ -262,7 +292,7 @@ namespace vcg histo.SetRange(Q.min, Q.max, histo_range); - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) histo.Add((*vi).Q()); Q.min = histo.Percentile(histo_frac); @@ -276,7 +306,7 @@ namespace vcg { VertexIterator vi; - for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() && !(*vi).IsB()) + for(vi=(*ms).vert.begin(); vi!=(*ms).vert.end(); ++vi) if(!(*vi).IsD() /*&& !(*vi).IsB()*/) (*vi).C().ColorRamp(P.min, P.max, (*vi).Q()); } diff --git a/src/meshlabplugins/meshcolorize/meshcolorize.cpp b/src/meshlabplugins/meshcolorize/meshcolorize.cpp index a70687b76..39ebf69a2 100644 --- a/src/meshlabplugins/meshcolorize/meshcolorize.cpp +++ b/src/meshlabplugins/meshcolorize/meshcolorize.cpp @@ -23,6 +23,10 @@ /**************************************************************************** History $Log$ +Revision 1.24 2006/02/04 09:41:44 vannini +Better handling of curvature computation for border vertex +Plugin info updated + Revision 1.23 2006/02/01 16:23:09 vannini Added "smooth color" filter @@ -206,8 +210,8 @@ const ActionInfo &ExtraMeshColorizePlugin::Info(QAction *action) const PluginInfo &ExtraMeshColorizePlugin::Info() { static PluginInfo ai; - ai.Date=tr("__DATE__"); - ai.Version = tr("0.5"); + ai.Date=tr("January 2006"); + ai.Version = tr("1.0"); ai.Author = ("Francesco Vannini, Giorgio Gangemi, Andrea Venturi"); return ai; } @@ -251,9 +255,6 @@ void ExtraMeshColorizePlugin::Compute(QAction * mode, MeshModel &m, RenderMode & if(mode->text() == ST(CP_GAUSSIAN)) { - vcg::tri::UpdateTopology::FaceFace(m.cm); - vcg::tri::UpdateFlags::FaceBorderFromFF(m.cm); - vcg::tri::UpdateFlags::VertexBorderFromFace (m.cm); Curvature c(m.cm); c.MapGaussianCurvatureIntoQuality(); c.ColorizeByEqualizedQuality(c.histoPercentile(c.minMaxQ(), 1.0f / (float) eqSettings.percentile, eqSettings.range));