#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