Browse Source

readme usage

master
Dtouch 2 years ago
parent
commit
fbc2ea7dd0
  1. 17
      CMakeLists.txt
  2. 56
      README.md
  3. 2
      include/SingularityJudger.h
  4. 4
      include/srf_mesh.h
  5. 50
      main.cpp
  6. 3
      src/SingularityJudger.cpp
  7. 39
      src/srf_mesh.cpp

17
CMakeLists.txt

@ -10,16 +10,15 @@ include_directories(E:/CLib/tinynurbs/include E:/CLib/glm)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
AUX_SOURCE_DIRECTORY(include DIR_INCLUDE)
add_executable(SingularityJudger main.cpp
include/loop_detector.h src/loop_detector.cpp
include/gauss_map.h src/gauss_map.cpp
include/aabb.h src/aabb.cpp
include/C2C4.h src/C2C4.cpp
include/Range.h src/Range.cpp
include/bvh.h src/bvh.cpp
include/utils.h src/utils.cpp
src/SingularityJudger.cpp include/SingularityJudger.h src/srf_mesh.cpp include/srf_mesh.h)
#
add_executable(SingularityJudger main.cpp ${DIR_SRCS} ${DIR_INCLUDE})
#
#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
#add_library(SingularityJudger ${DIR_SRCS})
# intersectTestbuild
# https://stackoverflow.com/questions/13429656/how-to-copy-contents-of-a-directory-into-build-directory-after-make-with-cmake

56
README.md

@ -1,3 +1,59 @@
# SingularityJudger
Integration of gauss map, osculating toroidal patches, loop detection and C2 judgement to figure out the singular or loop intersection.
## Usage
CmakeLists.txt中将以下两行改为自己tinynurbs和glm的依赖路径
```cmake
include_directories(E:/CLib/tinynurbs/include E:/CLib/glm)
```
### 直接运行
直接cmake构建,make编译链接,运行可执行文件即可
### 生成依赖库
1. CMakeLists.txt中注释以下代码
```cmake
add_executable(SingularityJudger main.cpp ${DIR_SRCS} ${DIR_INCLUDE})
# 下面两个仅仅是main文件的依赖,用于对读取的曲面文本文件做字符串处理
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
```
2. CMakeLists.txt中取消注释以下代码
```cmake
#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
#add_library(SingularityJudger ${DIR_SRCS})
```
3. CMake构建,make生成
### 具体使用
```c++
#include "bvh.h"
#include "singularityJudger.h"
// 创建两个曲面
tinynursb::RationalSurface<float> s;
tinynursb::RationalSurface<float> f;
// 曲面初始化
...
// 采样层数
int level = 6;
// 得到两个曲面level层的采样信息
// 如果已经采样过,这里用SrfMesh的无参构造,然后把采样的网格数据传入,避免重复采样
auto mesh1 = SrfMesh(s, level);
auto mesh2 = SrfMesh(f, level);
// 构建BVH
BVH bvh1(mesh1.evaluation);
BVH bvh2(mesh2.evaluation);
bvh1.build();
bvh2.build();
// bvh判交,获得重叠盒子对
auto intersectBoxPairs = getOverlapLeafNodes(bvh1, bvh2); // return [{{u1, v1}, {u2, v2}}]
// 创建SingularityJudger对象
SingularityJudger singularityJudger(s, f, mesh1, mesh2);
// 对于两个曲面各自的参数下标范围所确定的两个子面片,判断哪些小格子内存在critical point
// 一般就用完整的参数下标范围,即{0, pow(2, level - 1) - 1}
pair<int, int> cellIdxFullRange = {0, pow(2, level - 1) - 1};
auto cellsWithCriticalPts = singularityJudger.judge(intersectBoxPairs, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange);
```

2
include/SingularityJudger.h

@ -37,7 +37,7 @@ public:
void judge2(pair<int, int> focusRange_u1, pair<int, int> focusRange_v1,
pair<int, int> focusRange_u2, pair<int, int> focusRange_v2);
void judge(const vector<pair<pair<int, int>, pair<int, int>>> &intersectBoxPairs,
vector<pair<int, int>> judge(const vector<pair<pair<int, int>, pair<int, int>>> &intersectBoxPairs,
pair<int, int> focusRange_u1, pair<int, int> focusRange_v1,
pair<int, int> focusRange_u2, pair<int, int> focusRange_v2);

4
include/srf_mesh.h

@ -3,10 +3,14 @@
#include "vector"
#include "glm/glm.hpp"
#include "tinynurbs/tinynurbs.h"
using namespace std;
// 用采样网格表示的一个曲面
class SrfMesh {
public:
SrfMesh(const tinynurbs::RationalSurface<float> &s, int sampleLevel_);
SrfMesh() = default;
int sampleLevel; // 采样层级;每多一层,uv方向的网格数都分别x2,整个mesh的网格数x4;sampleLevel为1时,采样整个面,仅有一个网格
int sampleCntOnSingleDir;
vector<vector<glm::vec3>> evaluation;

50
main.cpp

@ -162,49 +162,6 @@ void sampleTimeTestNonRational(const RationalSurface<float> &s_, int sampleLevel
}
SrfMesh getMesh(const RationalSurface<float> &s, int sampleLevel) {
SrfMesh res;
res.sampleLevel = sampleLevel;
auto sampleCnt = res.sampleCntOnSingleDir = int(pow(2, sampleLevel - 1) + 1);
res.evaluation = vector<vector<glm::vec3>>(res.sampleCntOnSingleDir, vector<glm::vec3>(res.sampleCntOnSingleDir));
res.tangent_u = vector<vector<glm::vec3>>(res.sampleCntOnSingleDir, vector<glm::vec3>(res.sampleCntOnSingleDir));
res.tangent_v = vector<vector<glm::vec3>>(res.sampleCntOnSingleDir, vector<glm::vec3>(res.sampleCntOnSingleDir));
res.normal = vector<vector<glm::vec3>>(res.sampleCntOnSingleDir, vector<glm::vec3>(res.sampleCntOnSingleDir));
auto s_first_u = *(s.knots_u.begin());
auto s_first_v = *(s.knots_v.begin());
auto s_step_u = (*(s.knots_u.end() - 1) - s_first_u) / float(res.sampleCntOnSingleDir - 1);
auto s_step_v = (*(s.knots_v.end() - 1) - s_first_v) / float(res.sampleCntOnSingleDir - 1);
// evaluation correction test
auto u = 0.35f;
auto v = 0.35f;
auto pt = tinynurbs::surfacePoint(s, u, v);
printf("pt on u = %g, v = %g is (%f, %f, %f)\n", u, v, pt.x, pt.y, pt.z);
auto der = tinynurbs::surfaceDerivatives(s, 1, u, v);
auto du = der(1, 0);
auto dv = der(0, 1);
printf("derivatives of u when u = %g, v = %g is (%f, %f, %f)\n", u, v, du.x, du.y, du.z);
printf("derivatives of v when u = %g, v = %g is (%f, %f, %f)\n", u, v, dv.x, dv.y, dv.z);
// end of correction test
for (int i = 0; i < sampleCnt; i++) {
auto u = s_first_u + s_step_u * float(i);
for (int j = 0; j < sampleCnt; j++) {
auto v = s_first_v + s_step_v * float(j);
res.evaluation[i][j] = tinynurbs::surfacePoint(s, u, v);
auto der = tinynurbs::surfaceDerivatives(s, 1, u, v);
// if(der(0, 0) == res.evaluation[i][j]) cout<<"amazing"<<endl;
// else cout<<"what??? ("<<res.evaluation[i][j].x<<" "<<res.evaluation[i][j].y<<" "<<res.evaluation[i][j].z<<") | ("<<der(0, 0).x<<" "<<der(0, 0).y<<" "<<der(0, 0).z<<")"<<endl;
res.tangent_u[i][j] = der(1, 0);
res.tangent_v[i][j] = der(0, 1);
res.normal[i][j] = glm::normalize(glm::cross(res.tangent_u[i][j], res.tangent_v[i][j]));
}
}
return res;
}
int dirs[4][2] = {{-1, 0},
{0, 1},
{1, 0},
@ -231,7 +188,6 @@ int main() {
RationalSurface<float> s;
RationalSurface<float> f;
int level = 6;
printf("level: %d, sample cnt: %d * %d\n", level, int(pow(2, level - 1)), int(pow(2, level - 1)));
@ -307,8 +263,8 @@ int main() {
// sampleTimeTestNonRational(s, level);
sampleTimeTest(s, level);
auto mesh1 = getMesh(s, level);
auto mesh2 = getMesh(f, level);
auto mesh1 = SrfMesh(s, level);
auto mesh2 = SrfMesh(f, level);
BVH bvh1(mesh1.evaluation);
BVH bvh2(mesh2.evaluation);
@ -345,7 +301,7 @@ int main() {
SingularityJudger singularityJudger(s, f, mesh1, mesh2);
pair<int, int> cellIdxFullRange = {0, pow(2, level - 1) - 1};
singularityJudger.judge(intersectBoxPairs, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange);
auto cellsWithCriticalPts = singularityJudger.judge(intersectBoxPairs, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange);
time_cost = utils::get_time() - time_cost;
printf("time cost of singularityJudger: %lf\n", time_cost);

3
src/SingularityJudger.cpp

@ -81,7 +81,7 @@ bool hasPair(const map<pair<int, int>, set<pair<int, int>>> &pairs, pair<int, in
}
void SingularityJudger::
vector<pair<int, int>> SingularityJudger::
judge(const vector<pair<pair<int, int>, pair<int, int>>> &intersectBoxPairs,
pair<int, int> focusRange_u1, pair<int, int> focusRange_v1,
pair<int, int> focusRange_u2, pair<int, int> focusRange_v2) {
@ -163,6 +163,7 @@ judge(const vector<pair<pair<int, int>, pair<int, int>>> &intersectBoxPairs,
// }
// TODO c2 determination for tangency case
// C2C4 c2C4(mesh1, mesh2, srf1, srf2);
return loopDetector.targetCells;
}
void SingularityJudger:: dfs(set<pair<int, int>> &book, vector<vector<pair<int, int>>> &cellGroups,

39
src/srf_mesh.cpp

@ -1 +1,40 @@
#include "srf_mesh.h"
SrfMesh::SrfMesh(const tinynurbs::RationalSurface<float> &s, int sampleLevel_): sampleLevel(sampleLevel_) {
auto sampleCnt = sampleCntOnSingleDir = int(pow(2, sampleLevel - 1) + 1);
evaluation = vector<vector<glm::vec3>>(sampleCntOnSingleDir, vector<glm::vec3>(sampleCntOnSingleDir));
tangent_u = vector<vector<glm::vec3>>(sampleCntOnSingleDir, vector<glm::vec3>(sampleCntOnSingleDir));
tangent_v = vector<vector<glm::vec3>>(sampleCntOnSingleDir, vector<glm::vec3>(sampleCntOnSingleDir));
normal = vector<vector<glm::vec3>>(sampleCntOnSingleDir, vector<glm::vec3>(sampleCntOnSingleDir));
auto s_first_u = *(s.knots_u.begin());
auto s_first_v = *(s.knots_v.begin());
auto s_step_u = (*(s.knots_u.end() - 1) - s_first_u) / float(sampleCntOnSingleDir - 1);
auto s_step_v = (*(s.knots_v.end() - 1) - s_first_v) / float(sampleCntOnSingleDir - 1);
// evaluation correction test
auto u = 0.35f;
auto v = 0.35f;
auto pt = tinynurbs::surfacePoint(s, u, v);
printf("pt on u = %g, v = %g is (%f, %f, %f)\n", u, v, pt.x, pt.y, pt.z);
auto der = tinynurbs::surfaceDerivatives(s, 1, u, v);
auto du = der(1, 0);
auto dv = der(0, 1);
printf("derivatives of u when u = %g, v = %g is (%f, %f, %f)\n", u, v, du.x, du.y, du.z);
printf("derivatives of v when u = %g, v = %g is (%f, %f, %f)\n", u, v, dv.x, dv.y, dv.z);
// end of correction test
for (int i = 0; i < sampleCnt; i++) {
auto u = s_first_u + s_step_u * float(i);
for (int j = 0; j < sampleCnt; j++) {
auto v = s_first_v + s_step_v * float(j);
evaluation[i][j] = tinynurbs::surfacePoint(s, u, v);
auto der = tinynurbs::surfaceDerivatives(s, 1, u, v);
// if(der(0, 0) == evaluation[i][j]) cout<<"amazing"<<endl;
// else cout<<"what??? ("<<evaluation[i][j].x<<" "<<evaluation[i][j].y<<" "<<evaluation[i][j].z<<") | ("<<der(0, 0).x<<" "<<der(0, 0).y<<" "<<der(0, 0).z<<")"<<endl;
tangent_u[i][j] = der(1, 0);
tangent_v[i][j] = der(0, 1);
normal[i][j] = glm::normalize(glm::cross(tangent_u[i][j], tangent_v[i][j]));
}
}
}

Loading…
Cancel
Save