#ifndef LOOPDETECTOR_LOOP_DETECTOR_H #define LOOPDETECTOR_LOOP_DETECTOR_H #include "glm/glm.hpp" #include "map" #include "real.h" #include "set" #include "tinynurbs/tinynurbs.h" using namespace std; class LoopDetector { public: LoopDetector(const vector> &s_evaluation_, const vector> &f_evaluation_, const vector> &s_tangent_u_, const vector> &f_tangent_u_, const vector> &s_tangent_v_, const vector> &f_tangent_v_, const vector> &s_normal_, const vector> &f_normal_, const tinynurbs::RationalSurface &s_, const tinynurbs::RationalSurface &f_); // 两个曲面 const tinynurbs::RationalSurface &s; const tinynurbs::RationalSurface &f; // 细分采样的总层数(最高与BVH的总层数相等)。从第二层开始,每一层都表示把原来的一个小sub // patch分成了更小的四份 int maxSplitLayer; // 采样点的求值和求切向量先设为public,因为这些因该是算好的,LoopDetector不用重复计算 // 曲面s和f的采样点。 const vector> &s_evaluation; const vector> &f_evaluation; // 曲面s和f的切向量。 const vector> &s_tangent_u; const vector> &s_tangent_v; const vector> &f_tangent_u; const vector> &f_tangent_v; // 曲面s和f的法向量 const vector> &s_normal; const vector> &f_normal; // 有向距离计算结果。有向距离通过采样的方式计算,其结果与s曲面sub // patch中的采样网格规模相同,即与s_evaluation大小一致 // vector> distance; // 确定有向距离后,对应的f曲面上的最短距离点的位置(由于是格点,都是估计值) vector>> selectedPointsIdx; vector>> selectedPointsParam; // vector fields, 即有向距离关于u、v的导数 vector> vectorFields; vector> rotationNumbers; map, int> targetCells; // <{u patch index, v patch index}, rotation number> // int subPatchEdgeSampleCnt; // 在一个sub // patch的采样网格中,边上的采样点个数 void // init(tinynurbs::RationalSurface _s, // tinynurbs::RationalSurface _f, int _maxSplitLayer); vector> detect(pair _s_subPatchIdxRange_u, pair _s_subPatchIdxRange_v, pair _f_subPatchIdxRange_u, pair _f_subPatchIdxRange_v); vector> detect(const map, set>> &intersectBoxPairs, pair _s_subPatchIdxRange_u, pair _s_subPatchIdxRange_v, pair _f_subPatchIdxRange_u, pair _f_subPatchIdxRange_v); // 需要做Loop检测的sub patch在最后一层上的下标的范围(每个范围都真包含于[0, // 2^(maxSplitLayer-1)-1]) pair s_subPatchIdxRange_u; pair s_subPatchIdxRange_v; pair f_subPatchIdxRange_u; pair f_subPatchIdxRange_v; // subPatch每条边上的采样点个数 // 这四个值根据subPatchRange的范围得到 int s_subPatchEdgeSampleCnt_u; int s_subPatchEdgeSampleCnt_v; int f_subPatchEdgeSampleCnt_u; int f_subPatchEdgeSampleCnt_v; private: // 整个曲面一条边上的采样点个数 void initOrientedDistance(); void initOrientedDisAndVecFields( const vector, pair>> &intersectBoxPairs); void initOrientedDisAndVecFields_deprecated( const map, set>> &intersectBoxPairs); void initOrientedDisAndVecFields( const map, set>> &intersectBoxPairs); // Yawei Ma的文章中的做法 void initVectorField0(); // G A Kriezis的文章中的做法 void initVectorField(); void getRotationNumber(); void getRotationNumber( const vector, pair>> &intersectBoxPairs); void getRotationNumber( const map, set>> &intersectBoxPairs); }; #endif // LOOPDETECTOR_LOOP_DETECTOR_H