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
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
|
|
|