Files
ViewDesignEngine/docs/03-详细设计/03-类设计.md
T

3.3 KiB

类设计

目录

  1. 类关系总览
  2. 关键设计决策
  3. 工厂模式
  4. 策略模式
  5. 访问者模式

1. 类关系总览

几何实体层次:
  HalfedgeMesh          ← 网格实体
  BezierCurve           ← Bezier 曲线
  BSplineCurve          ← B-Spline 曲线
  NurbsCurve            ← NURBS 曲线
  BezierSurface         ← Bezier 曲面
  BSplineSurface        ← B-Spline 曲面
  Triangle / Polygon    ← 基本图形

空间索引层次:
  SpatialIndex<T> (抽象)
  ├── BVH<T>
  ├── Octree<T>
  ├── KDTree<T>
  └── RTree<T>

布尔运算层次:
  BooleanEngine<GeometryType> (抽象)
  ├── 2D 多边形布尔
  └── 3D 网格布尔

工具类:
  Transform3D           ← 几何变换
  Tolerance             ← 公差管理
  GeometryFactory       ← 工厂方法

2. 关键设计决策

2.1 值与引用语义

类型 策略 理由
Point, Vector, AABB 值语义 拷贝开销小(≤ 24 字节)
HalfedgeMesh, BVH 值语义 + 移动 大型数据移动比拷贝高效
SpatialIndex 智能指针 多态集合需引用语义

2.2 模板化策略

  • 曲线曲面族:模板化 + 类型别名
    template <typename T, size_t Dim> class BezierCurve { ... };
    using BezierCurve3D = BezierCurve<double, 3>;
    
  • 精确谓词:非模板化,内部使用自适应精度
  • 虚函数:仅在多态集合场景使用(空间索引接口)
  • 性能关键路径:使用 CRTP 静态多态替代虚函数

2.3 依赖方向

foundation ← core ← curves
                  ← mesh
                  ← spatial ← boolean
                  ← spatial ← collision

3. 工厂模式

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. 策略模式

// 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<BVH> build(const std::vector<Triangle3D>& primitives);
};

// 网格平滑策略
enum class SmoothMethod { Laplacian, Taubin };

5. 访问者模式

// 网格遍历
class MeshVisitor {
public:
    virtual void visit_vertex(size_t idx, const Point3D& p) = 0;
    virtual void visit_face(size_t idx,
        const std::vector<size_t>& vertices) = 0;
    virtual void visit_edge(size_t idx, size_t v0, size_t v1) = 0;
};

// 使用方式
mesh.traverse(visitor);