Integration of gauss map, osculating toroidal patches, loop detection and C2 judgement to figure out the singular or loop intersection.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

111 lines
4.5 KiB

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