// standard headers #include // stl headers #include // vcg headers #include #include #include #include #include #include #include #include #include #include typedef float AScalarType; class AEdge; class AFace; class AVertex : public vcg::Vertex< AScalarType, AEdge, AFace > { }; class AFace : public vcg::FaceRTFMFN< AVertex, AEdge, AFace > { }; class AMesh : public vcg::tri::TriMesh< std::vector, std::vector > { }; typedef vcg::AABBBinaryTreeIndex AIndex; static AMesh gMesh; static AIndex gIndex; static void CreateMesh(void) { vcg::tri::Dodecahedron(gMesh); vcg::tri::UpdateFlags::Clear(gMesh); vcg::tri::UpdateNormals::PerVertexNormalized(gMesh); vcg::tri::UpdateEdges::Set(gMesh); } static void SetIndex(void) { gIndex.Set(gMesh.face.begin(), gMesh.face.end()); } static void TestClosest(void) { vcg::face::PointDistanceFunctor getPtDist; const AIndex::ScalarType x = 0; const AIndex::CoordType queryPoint((AIndex::ScalarType)0, (AIndex::ScalarType)0, (AIndex::ScalarType)0); const AIndex::ScalarType maxDist = std::numeric_limits::max(); AIndex::ObjPtr closestFace; AIndex::ScalarType closestDist; AIndex::CoordType closestPoint; closestFace = gIndex.GetClosest(getPtDist, vcg::EmptyClass(), queryPoint, maxDist, closestDist, closestPoint); printf("GetClosest Test:\n"); if (closestFace != 0) { printf("\tface : 0x%p\n", closestFace); printf("\tdistance : %f\n", closestDist); printf("\tpoint : [%f, %f, %f]\n", closestPoint[0], closestPoint[1], closestPoint[2]); } else { printf("\tno object found (index is probably empty).\n"); } } static void TestKClosest(void) { vcg::face::PointDistanceFunctor getPtDist; const unsigned int k = 10; const AIndex::CoordType queryPoint((AIndex::ScalarType)0, (AIndex::ScalarType)0, (AIndex::ScalarType)0); const AIndex::ScalarType maxDist = std::numeric_limits::max(); std::vector closestObjects; std::vector closestDistances; std::vector closestPoints; unsigned int rk = gIndex.GetKClosest(getPtDist, vcg::EmptyClass(), k, queryPoint, maxDist, closestObjects, closestDistances, closestPoints); printf("GetKClosest Test:\n"); printf("\tfound %d objects\n", rk); } static void TestRay(void) { const bool TEST_BACK_FACES = true; vcg::RayTriangleIntersectionFunctor rayIntersector; const AIndex::ScalarType maxDist = std::numeric_limits::max(); const AIndex::CoordType rayOrigin((AIndex::ScalarType)0, (AIndex::ScalarType)0, (AIndex::ScalarType)0); const AIndex::CoordType rayDirection((AIndex::ScalarType)1, (AIndex::ScalarType)0, (AIndex::ScalarType)0); const vcg::Ray3 ray(rayOrigin, rayDirection); AIndex::ObjPtr isectFace; AIndex::ScalarType rayT; AIndex::CoordType isectPt; isectFace = gIndex.DoRay(rayIntersector, vcg::EmptyClass(), ray, maxDist, rayT); printf("DoRay Test:\n"); if (isectFace != 0) { printf("\tface : 0x%p\n", isectFace); printf("\tray t : %f\n", rayT); } else { printf("\tno object found (index is probably empty).\n"); } } int main (int /*argc*/, char ** /*argv*/) { CreateMesh(); SetIndex(); printf("Spatial Index Tests\n"); printf("---\n"); TestClosest(); printf("---\n"); TestKClosest(); printf("---\n"); TestRay(); printf("---\n"); return (0); }