#ifndef LOOPDETECTOR_LOOP_DETECTOR_H #define LOOPDETECTOR_LOOP_DETECTOR_H #include "tinynurbs/tinynurbs.h" #include "glm/glm.hpp" 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_); // 两个曲面 tinynurbs::RationalSurface s; 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 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); // 需要做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: // 整个曲面一条边上的采样点个数 int edgeSampleCnt; void initOrientedDistance(); void initVectorField(); void getRotationNumber(); }; #endif //LOOPDETECTOR_LOOP_DETECTOR_H