78 int add_face(
const std::vector<int>& vertex_indices);
91 const std::vector<std::array<int, 3>>& tris);
99 [[nodiscard]]
size_t num_vertices()
const {
return vertices_.size(); }
105 [[nodiscard]]
size_t num_faces()
const {
return faces_.size(); }
111 [[nodiscard]]
size_t num_edges()
const {
return halfedges_.size() / 2; }
118 [[nodiscard]]
const Point3D&
vertex(
size_t idx)
const {
return vertices_[idx]; }
125 [[nodiscard]]
const Face&
face(
size_t idx)
const {
return faces_[idx]; }
163 [[nodiscard]]
bool is_boundary_edge(
int hei)
const {
return halfedges_[hei].face_index < 0; }
236 std::vector<Point3D> vertices_;
237 std::vector<Halfedge> halfedges_;
238 std::vector<Face> faces_;
239 std::vector<Vector3D> face_normals_;
240 std::vector<Vector3D> vertex_normals_;
241 bool normals_dirty_ =
true;
249 int find_or_create_edge(
int v0,
int v1);
const Face & face(size_t idx) const
访问面
void build_from_triangles(const std::vector< Point3D > &verts, const std::vector< std::array< int, 3 >> &tris)
从三角形列表批量构建半边形网格
Vector3D vertex_normal(int vi) const
顶点法向(邻面法向的面积加权平均)
size_t num_vertices() const
顶点数量
int add_vertex(const Point3D &p)
添加顶点
AABB3D bounds() const
网格包围盒
size_t num_faces() const
面数量
void update_normals()
重新计算所有面法向和顶点法向
const Point3D & vertex(size_t idx) const
访问顶点
FaceRange faces_range() const
获取所有面范围(range-based for 支持)
const Halfedge & halfedge(size_t idx) const
访问半边
void set_vertex(size_t idx, const Point3D &p)
更新顶点位置
int add_face(const std::vector< int > &vertex_indices)
添加面
size_t num_edges() const
边数量
bool is_boundary_vertex(int vi) const
是否为边界顶点
bool is_boundary_edge(int hei) const
是否为边界半边
VertexOneRing vertex_one_ring(int vi) const
获取顶点的 1-ring 邻域迭代器
std::vector< int > face_vertices(int fi) const
获取面的所有顶点索引(按环绕顺序)
Vector3D face_normal(int fi) const
面法向(几何法向,非归一化?由实现决定)
std::vector< int > vertex_faces(int vi) const
获取顶点的邻面索引环
AABB< double > AABB3D
双精度三维包围盒
foundation::Vector3D Vector3D
双精度三维向量(重新导出)
foundation::Point3D Point3D
双精度三维点(重新导出)
int halfedge_index
该面的任意一条半边
int face_index
所属面的索引(边界半边为 -1)
int vertex_index
半边起点(终点 = next 半边的起点)
int opposite_index
对侧半边索引(反方向半边)