#ifndef LOOPDETECTOR_LOOP_DETECTOR_H #define LOOPDETECTOR_LOOP_DETECTOR_H #include "tinynurbs/tinynurbs.h" #include "glm/glm.hpp" using namespace std; class LoopDetector { public: // 两个曲面 tinynurbs::RationalSurface s; tinynurbs::RationalSurface f; // 细分采样的总层数(最高与BVH的总层数相等)。从第二层开始,每一层都表示把原来的一个小sub patch分成了更小的四份 int maxSplitLayer; // 采样点的求值和求切向量先设为public,因为这些因该是算好的,LoopDetector不用重复计算 // 曲面s和f的采样点。 vector> s_evaluation; vector> f_evaluation; // 曲面s和f的切向量。 vector> s_tangent_u; vector> s_tangent_v; vector> f_tangent_u; vector> f_tangent_v; // 有向距离计算结果。有向距离通过采样的方式计算,其结果与s曲面sub patch中的采样网格规模相同,即与s_evaluation大小一致 // vector> distance; // 确定有向距离后,对应的f曲面上的最短距离点的位置 vector>> selectedPointsIdx; // vector fields, 即有向距离关于u、v的导数 vector> vectorFields; vector> rotationNumbers; // 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); private: // 需要做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; // 整个曲面一条边上的采样点个数 int edgeSampleCnt; void initEvaluation(); void initOrientedDistance(); void initVectorField(); void getRotationNumber(); }; #endif //LOOPDETECTOR_LOOP_DETECTOR_H