stt/src/stt_class.h
2025-07-02 09:37:49 +08:00

84 lines
4.4 KiB
C++

#ifndef _STT_CLASS_H
#define _STT_CLASS_H
#include "head_functions.h"
#include "struct_functions.h"
class SttGenerator
{
public:
SttGenerator()
{
for (int i = 0; i < 20; i++)
{
forest_[i] = nullptr;
}
}
~SttGenerator(){}
int set_command_record(int,char**);
int set_tree_depth(char*);
int set_pole_equator_radius(char*);
int set_icosahedron_orient(char*);
int Routine(char [][1024]); // for a 2D array. you must specify enough dimensional information to make it unique
void InitialIcosahedron(double,Vertex); //初始化一个二十面体实例 需要给定一个默认半径值 二十面体顶点的经纬坐标 在init_para函数中调用
void CreateBranch(int,int,int,int,int,int,int,QuadTreeNode**,const ControlTopo&); //创建分枝
void CreateTree(int,int,int,int,QuadTree*,const ControlTopo&);//创建树
void DeleteTree(QuadTreeNode**);//清空整颗树
void ReturnLeaf(QuadTreeNode**);//返回叶子
void ReturnDepth(QuadTreeNode**,int);
void SortNeighbor(QuadTreeNodePointerArray); // sort neighboring relationship for input triangles
void CutOutline(QuadTreeNode**);//切割模型范围 为了保证后续处理中树形结构的完整性 我们只添加node的属性值来控制是否输出该节点
void CutHole(QuadTreeNode**); //cut holes in the created STT
void CloseSurface(QuadTree**);
int ReturnBranchDepth(QuadTreeNode**); //返回当前枝桠的最大深度
int InTrianglePoint(QuadTreeNode*);//在球面上判断点和三角形关系的一种方法 直接使用矢量运算确定包含关系 更直接更简单
int InTriangleLine(QuadTreeNode*);//判断插入线是否穿过节点三角形 使用的是球面下的方法 直接矢量计算 注意因为球面上的特殊关系 两个点之间的夹角不能大于等于180度 因为球面上总是沿着最短路径走 而且通常我们指的也是最短路径
int InTrianglePolygon(QuadTreeNode*);//判断多边形与三角形的关系
int InTriangleCircle(QuadTreeNode*);//判断圆与三角形的关系
int InTriangleTopo(QuadTreeNode*, const ControlTopo& in_topo, double diff_threshold); //判断地形与三角形的关系
int InTriangleTopoSet(QuadTreeNode*, const ControlTopo& in_topo, ControlTopo& out_topo); // 整理节点三角形内的地形点数组
int OutPolyOutline(QuadTreeNode*);//判断多边形与三角形的关系 用于切割模型边界
int InPolyOutline(QuadTreeNode*);//判断多边形与三角形的关系 用于切割模型边界 挖洞
int OutputMshFile(char*,double,double);
int OutputVertexLocation(char*,double,double);
int OutputTriangleCenterLocation(char*,double,double);
int OutputNeighbor(char*);
int GetControlPoint(char*); //读取额外的点
int GetControlCircle(char*); //读取额外的圆
int GetControlLine(char*,ControlLineArray&); // Get control line arrays
int GetControlTopography(char*); // Get control topography arrays
private:
// record input command line options for output records
string command_record_;
// minimal and maximal depths of quad-tree
int tree_depth_, max_depth_;
// pole and equator radius of the coordinate reference system
double pole_radius_, equator_radius_;
// orientation of the top vertex of the icosahedron
Vertex icosahedron_orient_;
// vertex array of the STT. This array defines the actual shape of the STT
VertexArray array_stt_vert_;
// map from the vertex's index to vertex. This map is used to find vertex by its index
Int2VertexMap map_id_vertex_;
Int2VertexMap::iterator ivd_;
// map from the vertex's position to vertex. This map is used to find vertex by its position
String2VertexMap map_str_vertex_;
String2VertexMap::iterator ivm_;
// base icosahedron used to construct the STT
Icosahedron base_icosahedron_;
// 20 quad-trees in which each of them represents the partition of one facet of the base icosahedron
QuadTree *forest_[20];
// pointer array of the extracted quad-tree nodes returned according to conditions
QuadTreeNodePointerArray array_out_tri_pointer_;
// external constraint information (point, line, polygons, circles, outline polygons and hole polygons)
// we add control topo for v1.4
ControlTopo control_topo_;
ControlPointArray array_control_point_;
ControlCircleArray array_control_circle_;
ControlLineArray array_control_line_;
ControlLineArray array_control_polygon_;
ControlLineArray array_outline_polygon_;
ControlLineArray array_hole_polygon_;
// threshold for topography constraint
double topo_thres_;
};
#endif