Files
茂之钳 2ecad1543f
Build & Test / build-and-test (push) Waiting to run
Build & Test / python-bindings (push) Blocked by required conditions
CI / Build & Test (push) Failing after 1m31s
CI / Release Build (push) Failing after 31s
feat(v8): ultimate performance + CAM full optimization + visualization/IGA/quality
v8.1 — 极致性能 (SIMD + LockFree + Transaction + NUMA):
- simd_vector.h: Vec4d/Vec4f SSE/AVX/NEON auto-detect, batch AABB, SoA transpose
- concurrent_data: LockFreeQueue (MPMC CAS), LockFreeStack (Treiber), ConcurrentHashMap (64-segment sharded)
- transaction: Command pattern, UndoManager (infinite undo/redo), crash-recovery journal
- performance_tuning: NUMA-aware, cache_line aligned, prefetch, hot/cold separation
- 20 tests (concurrent + transaction), ~2600 lines

v8.2 — CAM 全面优化 + 装配模式:
- cam_optimization: chip_thinning, HSM, constant_engagement, trochoidal_turn_milling
- tool_life_management, probing_cycle, thread_milling
- cam_advanced enhanced: Mazak/Okuma/Haas/DMG post-processors (8 total)
- assembly_patterns: Circular/Rectangular/Mirror/PatternDriven/fill arrays
- assembly_feature enhanced: assembly-level PMI propagation, batch interference check
- 28 tests, compiled 0 errors (~2800 lines)

v8.3 — 可视化+压缩+IGA+质量闭环:
- visualization_quality: ambient_occlusion, edge_highlighting, wireframe, normals
- topology_compression: Brep compression, Edgebreaker, vertex quantization
- iga_prep: knot_insertion, degree_elevation, Bezier extraction for IGA analysis
- quality_feedback: design_rule_check, manufacturability, cost_estimation, quality_score (0-100)
- 28 tests, ~2349 lines

27 files, ~7750 lines, 76 tests
2026-07-26 23:13:22 +08:00

152 lines
5.2 KiB
C++

#pragma once
/**
* @file topology_compression.h
* @brief B-Rep 拓扑压缩 & Edgebreaker 三角网格压缩 & 顶点量化
*
* 三类压缩策略:
* 1. B-Rep 拓扑压缩 — 将 BrepModel 的拓扑结构序列化为紧凑二进制格式
* 2. Edgebreaker — 三角网格连通性无损压缩(CLERS 编码)
* 3. 顶点坐标量化 — 将浮点坐标压入定点整数区间
*
* @ingroup core
*/
#include "vde/core/point.h"
#include "vde/brep/brep.h"
#include "vde/mesh/halfedge_mesh.h"
#include <vector>
#include <string>
#include <cstdint>
namespace vde::core {
// ═══════════════════════════════════════════════════════════
// B-Rep 拓扑压缩
// ═══════════════════════════════════════════════════════════
/**
* @brief B-Rep 拓扑压缩结果
*/
struct BrepCompressed {
std::vector<uint8_t> data; ///< 压缩二进制数据
size_t body_count; ///< Body 数量
size_t face_count; ///< Face 总数
size_t edge_count; ///< Edge 总数
size_t vertex_count; ///< Vertex 总数
size_t original_bytes; ///< 原始估算字节数
double compression_ratio; ///< 压缩比 (compressed/original)
};
/**
* @brief 压缩 BrepModel 为紧凑二进制格式
*
* 将拓扑连接关系压入变长整数,几何数据独立存储。
*
* @param body BrepModel 引用
* @return BrepCompressed 压缩结果
* @ingroup core
*/
BrepCompressed compress_brep(const vde::brep::BrepModel& body);
/**
* @brief 解压为 BrepModel
*
* @param data 压缩数据
* @return 重构的 BrepModel
* @ingroup core
*/
vde::brep::BrepModel decompress_brep(const BrepCompressed& data);
// ═══════════════════════════════════════════════════════════
// Edgebreaker 三角网格压缩
// ═══════════════════════════════════════════════════════════
/// CLERS 操作码
enum class EdgebreakerOp : uint8_t {
C = 0, ///< C — 封闭边界环
L = 1, ///< L — 左相邻面
E = 2, ///< E — 对面顶点
R = 3, ///< R — 右相邻面
S = 4 ///< S — 分裂操作
};
/**
* @brief Edgebreaker 压缩结果
*/
struct EdgebreakerResult {
std::vector<EdgebreakerOp> clers; ///< CLERS 操作序列
std::vector<int> vertices; ///< 解压所需顶点偏移(S/E 操作附参)
size_t face_count; ///< 面数
size_t vertex_count; ///< 顶点数
};
/**
* @brief 使用 Edgebreaker 压缩三角网格连通性
*
* 输入网格的连通性(面索引),输出 CLERS 操作序列。
* 仅压缩拓扑,不含几何坐标。
*
* @param mesh 三角网格
* @return EdgebreakerResult
* @ingroup core
*/
EdgebreakerResult edgebreaker_compress(const vde::mesh::HalfedgeMesh& mesh);
/**
* @brief Edgebreaker 解压
*
* 从 CLERS 序列重建三角网格连通性。
*
* @param result Edgebreaker 压缩结果
* @return 重建的三角网格(仅拓扑,顶点坐标为占位)
* @ingroup core
*/
vde::mesh::HalfedgeMesh edgebreaker_decompress(const EdgebreakerResult& result);
// ═══════════════════════════════════════════════════════════
// 顶点坐标量化压缩
// ═══════════════════════════════════════════════════════════
/// 量化模式
enum class QuantMode {
Uniform8, ///< 8 位均匀量化(每分量 1 字节)
Uniform16, ///< 16 位均匀量化(每分量 2 字节)
Uniform32, ///< 32 位均匀量化(每分量 4 字节)
};
/**
* @brief 顶点量化结果
*/
struct VertexQuantResult {
std::vector<uint8_t> data; ///< 量化后的字节数据
Point3D bbox_min; ///< 包围盒最小点
Point3D bbox_max; ///< 包围盒最大点
QuantMode mode; ///< 量化模式
size_t vertex_count; ///< 顶点数
double max_error; ///< 最大量化误差
double avg_error; ///< 平均量化误差
};
/**
* @brief 顶点坐标量化压缩
*
* 将顶点坐标相对于包围盒的浮点值映射到 [0, 2^bits-1] 整数区间。
*
* @param vertices 顶点坐标列表
* @param mode 量化模式(决定每分量位数)
* @return VertexQuantResult
* @ingroup core
*/
VertexQuantResult quantize_vertices(const std::vector<Point3D>& vertices,
QuantMode mode = QuantMode::Uniform16);
/**
* @brief 顶点坐标反量化
*
* @param result 量化结果
* @return 还原的顶点坐标
* @ingroup core
*/
std::vector<Point3D> dequantize_vertices(const VertexQuantResult& result);
} // namespace vde::core