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

139 lines
3.3 KiB
Markdown
Raw Normal View History

# 类设计
## 目录
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);
```