3.3 KiB
3.3 KiB
类设计
目录
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);