# 类设计 ## 目录 1. [类关系总览](#1-类关系总览) 2. [关键设计决策](#2-关键设计决策) 3. [工厂模式](#3-工厂模式) 4. [策略模式](#4-策略模式) 5. [访问者模式](#5-访问者模式) --- ## 1. 类关系总览 ``` 几何实体层次: HalfedgeMesh ← 网格实体 BezierCurve ← Bezier 曲线 BSplineCurve ← B-Spline 曲线 NurbsCurve ← NURBS 曲线 BezierSurface ← Bezier 曲面 BSplineSurface ← B-Spline 曲面 Triangle / Polygon ← 基本图形 空间索引层次: SpatialIndex (抽象) ├── BVH ├── Octree ├── KDTree └── RTree 布尔运算层次: BooleanEngine (抽象) ├── 2D 多边形布尔 └── 3D 网格布尔 工具类: Transform3D ← 几何变换 Tolerance ← 公差管理 GeometryFactory ← 工厂方法 ``` --- ## 2. 关键设计决策 ### 2.1 值与引用语义 | 类型 | 策略 | 理由 | |------|------|------| | Point, Vector, AABB | 值语义 | 拷贝开销小(≤ 24 字节) | | HalfedgeMesh, BVH | 值语义 + 移动 | 大型数据移动比拷贝高效 | | SpatialIndex | 智能指针 | 多态集合需引用语义 | ### 2.2 模板化策略 - **曲线曲面族**:模板化 + 类型别名 ```cpp template class BezierCurve { ... }; using BezierCurve3D = BezierCurve; ``` - **精确谓词**:非模板化,内部使用自适应精度 - **虚函数**:仅在多态集合场景使用(空间索引接口) - **性能关键路径**:使用 CRTP 静态多态替代虚函数 ### 2.3 依赖方向 ``` foundation ← core ← curves ← mesh ← spatial ← boolean ← spatial ← collision ``` --- ## 3. 工厂模式 ```cpp class GeometryFactory { public: // 基本体生成 static HalfedgeMesh create_box(double w, double h, double d); static HalfedgeMesh create_sphere(double radius, int segments); static HalfedgeMesh create_cylinder(double r, double h, int segments); static HalfedgeMesh create_torus(double R, double r, int segs); // 曲线生成 static NurbsCurve create_circle(double radius); static NurbsCurve create_line(const Point3D& a, const Point3D& b); // 曲面生成 static NurbsSurface create_ruled_surface( const NurbsCurve& c1, const NurbsCurve& c2); }; ``` --- ## 4. 策略模式 ```cpp // BVH 构建策略 enum class BVHSplitStrategy { Middle, // 中点分割(最快) Equal, // 等数量分割 SAH // 表面积启发式(质量最优) }; class BVHBuilder { public: BVHBuilder& set_strategy(BVHSplitStrategy s); BVHBuilder& set_leaf_size(int max_primitives); BVHBuilder& set_max_depth(int depth); std::unique_ptr build(const std::vector& primitives); }; // 网格平滑策略 enum class SmoothMethod { Laplacian, Taubin }; ``` --- ## 5. 访问者模式 ```cpp // 网格遍历 class MeshVisitor { public: virtual void visit_vertex(size_t idx, const Point3D& p) = 0; virtual void visit_face(size_t idx, const std::vector& vertices) = 0; virtual void visit_edge(size_t idx, size_t v0, size_t v1) = 0; }; // 使用方式 mesh.traverse(visitor); ```