139 lines
3.3 KiB
Markdown
139 lines
3.3 KiB
Markdown
# 类设计
|
|
|
|
## 目录
|
|
|
|
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<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 模板化策略
|
|
|
|
- **曲线曲面族**:模板化 + 类型别名
|
|
```cpp
|
|
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. 工厂模式
|
|
|
|
```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<BVH> build(const std::vector<Triangle3D>& 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<size_t>& vertices) = 0;
|
|
virtual void visit_edge(size_t idx, size_t v0, size_t v1) = 0;
|
|
};
|
|
|
|
// 使用方式
|
|
mesh.traverse(visitor);
|
|
```
|