A Gauss mapping tool for Nurbs surfaces
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.
 
 

80 lines
3.2 KiB

//
// Created by 14727 on 2022/12/24.
//
#ifndef GAUSSMAP_GAUSS_MAP_H
#define GAUSSMAP_GAUSS_MAP_H
#include "vector"
#include "tinynurbs/tinynurbs.h"
#include "glm/glm.hpp"
#include "aabb.h"
#include "map"
// 一个节点就表示一个球上矩形面片
struct GaussMapNode {
// 四个顶点的法向量值确定一个平面的法向量值
AABB nBound;
int level, firstChild;
};
class GaussMap {
public:
int maxLevel;
int leafSampleCnt;
std::vector<std::vector<glm::vec3>> normals;
tinynurbs::RationalSurface<float> srf;
std::vector<GaussMapNode> tree;
void recursiveBuild(int level, int idx, int idx_u, int idx_v);
GaussMap(int maxLevel, tinynurbs::RationalSurface<float> srf_);
void build();
void normalInit();
void printQuadTree();
};
std::vector<std::pair<int, int>> getOverlapLeafNodes(const GaussMap &gm1, const GaussMap &gm2);
void recursiveGetOverlapLeafNodes(const GaussMap &gm1, const GaussMap &gm2, int idx1, int idx2,
std::vector<std::pair<int, int>> &pairs);
/**
* 判断两个曲面的Gauss Map在指定的、各自的参数范围内有没有交
* @param idxRange_u1 第一个gauss map的参数u范围对应的u方向上的采样网格的格子下标范围
* @param idxRange_v1 第一个gauss map的参数v范围对应的u方向上的采样网格的格子下标范围
* @param idxRange_u2 第而个gauss map的参数u范围对应的u方向上的采样网格的格子下标范围
* @param idxRange_v2 第二个gauss map的参数v范围对应的u方向上的采样网格的格子下标范围
* @return true:gauss map的包围盒有交集,说明gauss map<可能>有重合;false: gauss map一定没有重合
*/
bool isGaussMapsOverlapped(const GaussMap &gm1, const GaussMap &gm2, std::pair<int, int> idxRange_u1,
std::pair<int, int> idxRange_v1, std::pair<int, int> idxRange_u2,
std::pair<int, int> idxRange_v2);
/**
* 判断两个曲面的Gauss Map在指定的、各自的参数范围内有没有交
* @param range_u1 第一个gauss map的参数u范围
* @param range_v1 第一个gauss map的参数v范围
* @param range_u2 第二个gauss map的参数u范围
* @param range_v2 第二个gauss map的参数v范围
* @param paramRange_u1 第一个gauss map的参数u定义域
* @param paramRange_v1 第一个gauss map的参数v定义域
* @param paramRange_u2 第二个gauss map的参数u定义域
* @param paramRange_v2 第二个gauss map的参数v定义域
* @return true:gauss map的包围盒有交集,说明gauss map<可能>有重合;false: gauss map一定没有重合
*/
bool isGaussMapsOverlapped(const GaussMap &gm1, const GaussMap &gm2, std::pair<float, float> range_u1,
std::pair<float, float> range_v1, std::pair<float, float> range_u2,
std::pair<float, float> range_v2, std::pair<float, float> paramRange_u1,
std::pair<float, float> paramRange_v1,
std::pair<float, float> paramRange_u2,
std::pair<float, float> paramRange_v2);
int getStartIdxOfLayerN(int layer);
int getChildNodeIdx(int ix, int iy);
#endif //GAUSSMAP_GAUSS_MAP_H