From f314e050a4254021d9c2a3adcbb9d3aad275a9e3 Mon Sep 17 00:00:00 2001 From: cignoni Date: Fri, 6 Jul 2012 05:12:19 +0000 Subject: [PATCH] Added Sample for testing of the framework for searching the closest point on a mesh --- .../trimesh_closest/trimesh_closest.cpp | 161 ++++++++++++++++++ .../trimesh_closest/trimesh_closest.pro | 12 ++ 2 files changed, 173 insertions(+) create mode 100644 apps/sample/trimesh_closest/trimesh_closest.cpp create mode 100644 apps/sample/trimesh_closest/trimesh_closest.pro diff --git a/apps/sample/trimesh_closest/trimesh_closest.cpp b/apps/sample/trimesh_closest/trimesh_closest.cpp new file mode 100644 index 00000000..f0f05f9f --- /dev/null +++ b/apps/sample/trimesh_closest/trimesh_closest.cpp @@ -0,0 +1,161 @@ + +// stuff to define the mesh +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +// io +#include +#include + +#include + +#include +#include +#include + + +class BaseVertex; +class BaseEdge; +class BaseFace; + +struct BaseUsedTypes: public vcg::UsedTypes::AsVertexType,vcg::Use::AsEdgeType,vcg::Use::AsFaceType>{}; + +class BaseVertex : public vcg::Vertex< BaseUsedTypes, + vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::BitFlags > {}; + +class BaseEdge : public vcg::Edge< BaseUsedTypes> {}; + +class BaseFace : public vcg::Face< BaseUsedTypes, + vcg::face::Normal3f, vcg::face::VertexRef, vcg::face::BitFlags, vcg::face::Mark, vcg::face::EdgePlaneEmpty > {}; + +class BaseMesh : public vcg::tri::TriMesh, std::vector > {}; + + + + +class RTVertex; +class RTEdge; +class RTFace; + +struct RTUsedTypes: public vcg::UsedTypes::AsVertexType,vcg::Use::AsEdgeType,vcg::Use::AsFaceType>{}; + +class RTVertex : public vcg::Vertex< RTUsedTypes, + vcg::vertex::Coord3f, vcg::vertex::Normal3f, vcg::vertex::BitFlags > {}; + +class RTEdge : public vcg::Edge< RTUsedTypes> {}; + +class RTFace : public vcg::Face< RTUsedTypes, + vcg::face::Normal3f, vcg::face::VertexRef, vcg::face::EdgePlane, vcg::face::Mark, vcg::face::BitFlags > {}; + +class RTMesh : public vcg::tri::TriMesh, std::vector > {}; + + +using namespace vcg; + +void Usage() +{ + printf( "\nUsage: trimesh_closest mesh.ply samplenum sampledistance(as fraction of bboxdiag)"); + exit(-1); +} + +template +bool UnitTest_Closest(const char *filename1, int sampleNum, float dispPerc) +{ + MeshType mr; + typedef typename MeshType::ScalarType ScalarType; + typedef typename MeshType::CoordType CoordType; + typedef typename MeshType::FaceType FaceType; + typedef GridStaticPtr TriMeshGrid; + + int startOpen=clock(); + int err=vcg::tri::io::Importer::Open(mr,filename1); + tri::UpdateBounding::Box(mr); +// tri::UpdateNormals::PerFaceNormalized(mr); + tri::UpdateNormals::PerFace(mr); + float dispAbs = mr.bbox.Diag()*dispPerc; + if(err) + { + std::cerr << "Unable to open mesh " << filename1 << " : " << vcg::tri::io::Importer::ErrorMsg(err) << std::endl; + exit(-1); + } + int endOpen = clock(); + printf("Mesh loaded in %6.3f - ",float(endOpen-startOpen)/CLOCKS_PER_SEC); + + int startSampling = clock(); + + std::vector MontecarloSamples; + // First step build the sampling + typedef tri::TrivialSampler BaseSampler; + BaseSampler mcSampler(MontecarloSamples); + tri::SurfaceSampling::SamplingRandomGenerator().initialize(123); + tri::SurfaceSampling::Montecarlo(mr, mcSampler, sampleNum); + math::MarsenneTwisterRNG rnd; + rnd.initialize(123); + for(size_t i=0;i::Set(mr); + + int endGridInit = clock(); + printf("Grid Init in %6.3f\n",float(endGridInit-startGridInit)/CLOCKS_PER_SEC); + + const ScalarType maxDist=std::max(dispAbs*10.0f,mr.bbox.Diag()/1000.f); + CoordType closest; + ScalarType dist; + std::vector resultVec(MontecarloSamples.size()); + int startGridQuery = clock(); + double avgDist=0; + if(useEdge) + for(size_t i=0;i (argv[1],sampleNum,dispPerc); + UnitTest_Closest (argv[1],sampleNum,dispPerc); + UnitTest_Closest (argv[1],sampleNum,dispPerc); + UnitTest_Closest (argv[1],sampleNum,dispPerc); + UnitTest_Closest(argv[1],sampleNum,dispPerc); + UnitTest_Closest(argv[1],sampleNum,dispPerc); + return 0; +} diff --git a/apps/sample/trimesh_closest/trimesh_closest.pro b/apps/sample/trimesh_closest/trimesh_closest.pro new file mode 100644 index 00000000..1f0941e7 --- /dev/null +++ b/apps/sample/trimesh_closest/trimesh_closest.pro @@ -0,0 +1,12 @@ + +TARGET = trimesh_closest +DEPENDPATH += ../../.. +INCLUDEPATH += . ../../.. +CONFIG += console stl +TEMPLATE = app +HEADERS += +SOURCES += trimesh_closest.cpp ../../../wrap/ply/plylib.cpp + +#DEFINES += N_DEBUG +# Mac specific Config required to avoid to make application bundles +CONFIG -= app_bundle