# 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" // 创建两个曲面 tinynurbs::RationalSurface s; tinynurbs::RationalSurface 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 cellIdxFullRange = {0, pow(2, level - 1) - 1}; auto cellsWithCriticalPts = singularityJudger.judge(intersectBoxPairs, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange, cellIdxFullRange); ```