# GCTL Linear Mesh 3D 文档 ## 简介 `linear_mesh_3d.h` 定义了GCTL网格库中的三维线性网格类 `linear_mesh_3d`,用于创建和管理三维空间中的非结构化线性网格。该类支持不规则分布的网格点,适用于复杂三维几何结构中的线性特征离散化。 ## 类继承 `linear_mesh_3d` 继承自 `base_mesh` 基类,实现了所有虚函数,并添加了三维线性网格特有的功能。 ## 主要API ### 初始化 ```cpp // 初始化三维线性网格 void init(std::string name, // 网格名称 std::string info, // 网格信息 const array &nodes, // 节点坐标数组 const array &elements); // 单元连接关系数组 ``` ### 网格信息 ```cpp // 获取节点坐标 void get_node_coord(int node_idx, // 节点索引 double &x, double &y, double &z) const; // 获取单元节点索引 void get_elem_nodes(int elem_idx, // 单元索引 int &n1, int &n2) const; // 获取单元中心坐标 void get_elem_center(int elem_idx, // 单元索引 double &x, double &y, double &z) const; // 获取单元长度 double get_elem_length(int elem_idx) const; // 获取单元方向向量 void get_elem_direction(int elem_idx, // 单元索引 double &dx, double &dy, double &dz) const; ``` ### 网格查询 ```cpp // 查找最近的单元 bool find_nearest_element(double x, double y, double z, // 目标点坐标 int &elem_idx, // 返回单元索引 double &distance) const; // 返回最短距离 // 获取节点相邻的单元 array get_node_elements(int node_idx) const; // 获取单元相邻的单元 array get_elem_neighbors(int elem_idx) const; ``` ### 文件操作 ```cpp // 保存为Gmsh格式 virtual void save_gmsh(std::string filename, index_packed_e packed = Packed) override; // 保存为二进制格式 virtual void save_binary(std::string filename) override; // 读取二进制格式 virtual void load_binary(std::string filename) override; ``` ## 使用示例 ```cpp // 创建节点坐标数组 array nodes; nodes.push_back(point3dc(0.0, 0.0, 0.0)); nodes.push_back(point3dc(1.0, 0.0, 0.0)); nodes.push_back(point3dc(1.0, 1.0, 1.0)); nodes.push_back(point3dc(0.0, 1.0, 1.0)); // 创建单元连接关系 array elements; elements.push_back(int2(0, 1)); // 第一条边 elements.push_back(int2(1, 2)); // 第二条边 elements.push_back(int2(2, 3)); // 第三条边 // 创建线性网格 gctl::linear_mesh_3d mesh3d; mesh3d.init("curve3d", "3D curve mesh", nodes, elements); // 获取单元信息 double length = mesh3d.get_elem_length(0); // 获取第一条边的长度 // 获取单元方向 double dx, dy, dz; mesh3d.get_elem_direction(0, dx, dy, dz); // 获取第一条边的方向向量 // 查找最近的单元 int elem_idx; double distance; if (mesh3d.find_nearest_element(0.5, 0.5, 0.5, elem_idx, distance)) { // 找到距离点(0.5,0.5,0.5)最近的单元 } // 添加数据并保存 mesh3d.add_data(gctl::NodeData, gctl::Vector, "displacement", array(nodes.size(), point3dc(0,0,0))); mesh3d.save_gmsh("curve3d.msh", gctl::Packed); ``` ## 注意事项 1. 线性网格主要用于表示一维结构(如曲线、管线)在三维空间中的分布 2. 每个单元由两个节点定义,表示一条空间线段 3. 节点和单元的编号从0开始 4. 支持不规则分布的节点,适合复杂三维曲线的离散化 5. 提供了网格拓扑关系查询功能 6. 支持计算单元的方向向量,便于处理定向问题 7. 查找最近单元功能适用于路径规划和碰撞检测 8. 支持Gmsh和二进制格式的文件操作 9. 适用于输电线路、管道系统、裂缝网络等模拟