ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
核心几何模块

点/向量/变换、多边形、凸包、Voronoi、ICP、距离计算 更多...

class  vde::core::AABB< T >
 轴对齐包围盒(AABB) 更多...
 
struct  vde::core::ICPResult
 ICP(迭代最近点)配准结果 更多...
 
class  vde::core::Line3D< T >
 三维无限直线 更多...
 
class  vde::core::Segment3D< T >
 三维线段 更多...
 
class  vde::core::Ray3D< T >
 三维射线 更多...
 
class  vde::core::Plane< T >
 三维平面 更多...
 
class  vde::core::Polygon2D
 二维平面多边形 更多...
 
class  vde::core::Triangle< T >
 三维三角形 更多...
 
struct  vde::core::VoronoiCell
 Voronoi 单元格 更多...
 

类型定义

using vde::core::Transform3D = Eigen::Transform< double, 3, Eigen::Affine >
 三维仿射变换类型 更多...
 

函数

std::vector< Point2Dvde::core::convex_hull_2d (const std::vector< Point2D > &points)
 二维凸包计算(Graham Scan 算法) 更多...
 
std::vector< std::array< Point3D, 3 > > vde::core::convex_hull_3d (const std::vector< Point3D > &points)
 三维凸包计算(QuickHull 算法) 更多...
 
double vde::core::distance (const Point3D &a, const Point3D &b)
 两点之间的欧氏距离 更多...
 
double vde::core::distance (const Point3D &p, const Line3D< double > &line)
 点到直线的距离 更多...
 
double vde::core::distance (const Point3D &p, const Segment3D< double > &seg)
 点到线段的距离 更多...
 
double vde::core::distance (const Point3D &p, const Plane< double > &plane)
 点到平面的距离 更多...
 
double vde::core::distance (const Point3D &p, const Triangle< double > &tri)
 点到三角形的距离 更多...
 
double vde::core::distance (const Point3D &p, const AABB< double > &box)
 点到包围盒的距离 更多...
 
double vde::core::distance (const Segment3D< double > &a, const Segment3D< double > &b)
 两条线段之间的最短距离 更多...
 
double vde::core::distance (const Line3D< double > &a, const Line3D< double > &b)
 两条直线之间的最短距离 更多...
 
double vde::core::distance (const AABB< double > &a, const AABB< double > &b)
 两个包围盒之间的最短距离 更多...
 
double vde::core::distance (const Triangle< double > &a, const Triangle< double > &b)
 两个三角形之间的最短距离 更多...
 
Point3D vde::core::closest_point (const Point3D &p, const Triangle< double > &tri)
 三角形上距给定点最近的点 更多...
 
Point3D vde::core::closest_point (const Point3D &p, const Segment3D< double > &seg)
 线段上距给定点最近的点 更多...
 
Point3D vde::core::closest_point (const Point3D &p, const AABB< double > &box)
 包围盒上距给定点最近的点 更多...
 
Point3D vde::core::closest_point (const Point3D &p, const Plane< double > &plane)
 平面上距给定点最近的点(正交投影) 更多...
 
ICPResult vde::core::icp_register (const std::vector< Point3D > &source, const std::vector< Point3D > &target, int max_iter=50, double tolerance=1e-6)
 迭代最近点(ICP)刚体点云配准 更多...
 
Transform3D vde::core::translate (const Vector3D &v)
 创建平移变换 更多...
 
Transform3D vde::core::translate (double x, double y, double z)
 创建平移变换(分量形式) 更多...
 
Transform3D vde::core::rotate (const Vector3D &axis, double angle_rad)
 创建旋转变换(轴-角表示) 更多...
 
Transform3D vde::core::rotate_x (double rad)
 绕 X 轴旋转 更多...
 
Transform3D vde::core::rotate_y (double rad)
 绕 Y 轴旋转 更多...
 
Transform3D vde::core::rotate_z (double rad)
 绕 Z 轴旋转 更多...
 
Transform3D vde::core::scale (double sx, double sy, double sz)
 创建非均匀缩放变换 更多...
 
Transform3D vde::core::scale (double s)
 创建均匀缩放变换 更多...
 
std::vector< VoronoiCellvde::core::voronoi_2d (const std::vector< Point2D > &points)
 二维 Voronoi 图生成(通过 Delaunay 对偶图) 更多...
 

详细描述

点/向量/变换、多边形、凸包、Voronoi、ICP、距离计算

核心模块提供 VDE 引擎的几何操作 API:

类型定义说明

◆ Transform3D

using vde::core::Transform3D = typedef Eigen::Transform<double, 3, Eigen::Affine>

三维仿射变换类型

基于 Eigen::Transform,支持平移、旋转、缩放和它们的组合。 使用 4×4 齐次矩阵表示。

在文件 transform.h15 行定义.

函数说明

◆ closest_point() [1/4]

Point3D vde::core::closest_point ( const Point3D p,
const AABB< double > &  box 
)

包围盒上距给定点最近的点

对每个坐标分量做 clamp 到 [min, max]。

参数
p查询点
box包围盒
返回
包围盒边界上(或内部)距离 p 最近的点

◆ closest_point() [2/4]

Point3D vde::core::closest_point ( const Point3D p,
const Plane< double > &  plane 
)

平面上距给定点最近的点(正交投影)

参数
p查询点
plane平面
返回
点 p 在平面上的正交投影
参见
Plane::project

◆ closest_point() [3/4]

Point3D vde::core::closest_point ( const Point3D p,
const Segment3D< double > &  seg 
)

线段上距给定点最近的点

通过参数 t = clamp(投影, 0, 1) 实现。

参数
p查询点
seg线段
返回
线段上距离 p 最近的点(可能为端点)

◆ closest_point() [4/4]

Point3D vde::core::closest_point ( const Point3D p,
const Triangle< double > &  tri 
)

三角形上距给定点最近的点

使用重心坐标将投影点截断到三角形内部。 若投影在三角形外,返回最近边或顶点上的点。

参数
p查询点
tri三角形
返回
三角形上距离 p 最近的点

◆ convex_hull_2d()

std::vector<Point2D> vde::core::convex_hull_2d ( const std::vector< Point2D > &  points)

二维凸包计算(Graham Scan 算法)

使用 Graham 扫描算法计算点集的凸包,时间复杂度 O(n log n)。 以极角排序点为预处理,然后用栈维护凸包边界。

参数
points输入点集(至少 3 个不共线点)
返回
凸包顶点序列(逆时针排列),不含共线的中间点
注解
自动过滤共线点,返回严格的凸包顶点
若所有点共线,返回两个端点
std::vector<Point2D> pts = {{0,0}, {1,0}, {1,1}, {0,1}, {0.5,0.5}};
auto hull = convex_hull_2d(pts);
// hull = [(0,0), (1,0), (1,1), (0,1)]
std::vector< Point2D > convex_hull_2d(const std::vector< Point2D > &points)
二维凸包计算(Graham Scan 算法)
参见
convex_hull_3d, Polygon2D::convex_hull_2d

◆ convex_hull_3d()

std::vector<std::array<Point3D, 3> > vde::core::convex_hull_3d ( const std::vector< Point3D > &  points)

三维凸包计算(QuickHull 算法)

使用 QuickHull 算法计算三维点集的凸包。 先构造初始四面体,然后递归地将外部点添加到凸包上。 平均复杂度 O(n log n),最坏情况 O(n²)。

参数
points输入点集(至少 4 个不共面点)
返回
凸包三角形列表,每个三角形三顶点按逆时针排列(从外部观察)
注解
返回的三角形法线方向朝外
共面/退化点被自动丢弃
std::vector<Point3D> pts = 3D 点云;
auto hull_tris = convex_hull_3d(pts);
for (auto& tri : hull_tris) {
// tri = {p0, p1, p2} — CCW when viewed from outside
}
std::vector< std::array< Point3D, 3 > > convex_hull_3d(const std::vector< Point3D > &points)
三维凸包计算(QuickHull 算法)
参见
convex_hull_2d

◆ distance() [1/10]

double vde::core::distance ( const AABB< double > &  a,
const AABB< double > &  b 
)

两个包围盒之间的最短距离

若相交则返回 0。

参数
a第一个包围盒
b第二个包围盒
返回
最短距离

◆ distance() [2/10]

double vde::core::distance ( const Line3D< double > &  a,
const Line3D< double > &  b 
)

两条直线之间的最短距离

若相交则为 0;若平行则返回任意垂线段长度;若异面则返回公垂线长度。

参数
a第一条直线
b第二条直线
返回
最短距离

◆ distance() [3/10]

double vde::core::distance ( const Point3D a,
const Point3D b 
)

两点之间的欧氏距离

参数
a第一个点
b第二个点
返回
||b - a||
double d = distance(Point3D(0,0,0), Point3D(3,4,0)); // d == 5.0
double distance(const Point3D &a, const Point3D &b)
两点之间的欧氏距离
foundation::Point3D Point3D
双精度三维点(重新导出)
Definition: point.h:31

◆ distance() [4/10]

double vde::core::distance ( const Point3D p,
const AABB< double > &  box 
)

点到包围盒的距离

若点在包围盒内,返回 0;否则返回到最近面的距离。

参数
p测试点
box包围盒
返回
最短距离(内部点返回 0)

◆ distance() [5/10]

double vde::core::distance ( const Point3D p,
const Line3D< double > &  line 
)

点到直线的距离

计算点到无限直线的垂直距离。

参数
p测试点
line直线
返回
垂直距离

◆ distance() [6/10]

double vde::core::distance ( const Point3D p,
const Plane< double > &  plane 
)

点到平面的距离

返回绝对值(总是非负)。

参数
p测试点
plane平面
返回
绝对垂直距离
参见
Plane::signed_distance

◆ distance() [7/10]

double vde::core::distance ( const Point3D p,
const Segment3D< double > &  seg 
)

点到线段的距离

若投影点落在线段内部,返回垂直距离;否则返回到最近端点的距离。

参数
p测试点
seg线段
返回
最短距离

◆ distance() [8/10]

double vde::core::distance ( const Point3D p,
const Triangle< double > &  tri 
)

点到三角形的距离

若投影点在三角形内部,返回垂直距离;否则返回到最近的边或顶点的距离。

参数
p测试点
tri三角形
返回
最短距离

◆ distance() [9/10]

double vde::core::distance ( const Segment3D< double > &  a,
const Segment3D< double > &  b 
)

两条线段之间的最短距离

处理平行、相交、最近端点到端点等多种情况。

参数
a第一条线段
b第二条线段
返回
最短距离(若相交则为 0)

◆ distance() [10/10]

double vde::core::distance ( const Triangle< double > &  a,
const Triangle< double > &  b 
)

两个三角形之间的最短距离

处理分离、边相交、面重叠等情况。

参数
a第一个三角形
b第二个三角形
返回
最短距离(若相交则为 0)

◆ icp_register()

ICPResult vde::core::icp_register ( const std::vector< Point3D > &  source,
const std::vector< Point3D > &  target,
int  max_iter = 50,
double  tolerance = 1e-6 
)

迭代最近点(ICP)刚体点云配准

使用标准 ICP 算法将 source 点云配准到 target 点云。 每步迭代:

  1. 对每个 source 点找 target 中的最近邻
  2. 用 SVD 求解最优刚体变换
  3. 应用变换,检查收敛
参数
source源点云(将被移动)
target目标点云(固定参考)
max_iter最大迭代次数(默认 50)
tolerance收敛容差:相邻两次 RMS 变化的阈值(默认 1e-6)
返回
配准结果,包含最终变换和误差
注解
source 和 target 点数可以不同
初始对齐越好,收敛越快;若初始偏差太大,可能收敛到局部最优
std::vector<Point3D> src = // ...;
std::vector<Point3D> tgt = // ...;
auto result = icp_register(src, tgt, 100, 1e-8);
if (result.converged) {
std::cout << "RMS error: " << result.rms_error << "\n";
// 应用变换
for (auto& p : src) p = result.transform * p;
}
ICPResult icp_register(const std::vector< Point3D > &source, const std::vector< Point3D > &target, int max_iter=50, double tolerance=1e-6)
迭代最近点(ICP)刚体点云配准

◆ rotate()

Transform3D vde::core::rotate ( const Vector3D axis,
double  angle_rad 
)
inline

创建旋转变换(轴-角表示)

参数
axis旋转轴(自动归一化)
angle_rad旋转角度(弧度)
返回
旋转变换矩阵
// 绕 Z 轴旋转 90°
auto R = rotate(Vector3D::UnitZ(), M_PI / 2);
Transform3D rotate(const Vector3D &axis, double angle_rad)
创建旋转变换(轴-角表示)
Definition: transform.h:62

在文件 transform.h62 行定义.

被这些函数引用 vde::core::rotate_x(), vde::core::rotate_y() , 以及 vde::core::rotate_z().

◆ rotate_x()

Transform3D vde::core::rotate_x ( double  rad)
inline

绕 X 轴旋转

参数
rad旋转角度(弧度)
返回
旋转变换矩阵

在文件 transform.h74 行定义.

引用了 vde::core::rotate().

◆ rotate_y()

Transform3D vde::core::rotate_y ( double  rad)
inline

绕 Y 轴旋转

参数
rad旋转角度(弧度)
返回
旋转变换矩阵

在文件 transform.h84 行定义.

引用了 vde::core::rotate().

◆ rotate_z()

Transform3D vde::core::rotate_z ( double  rad)
inline

绕 Z 轴旋转

参数
rad旋转角度(弧度)
返回
旋转变换矩阵

在文件 transform.h94 行定义.

引用了 vde::core::rotate().

◆ scale() [1/2]

Transform3D vde::core::scale ( double  s)
inline

创建均匀缩放变换

参数
s各方向统一的缩放因子
返回
缩放变换矩阵

在文件 transform.h120 行定义.

引用了 vde::core::scale().

◆ scale() [2/2]

Transform3D vde::core::scale ( double  sx,
double  sy,
double  sz 
)
inline

创建非均匀缩放变换

参数
sxX 方向缩放因子
syY 方向缩放因子
szZ 方向缩放因子
返回
缩放变换矩阵
注解
非均匀缩放可能导致法线方向不准确;使用场景中应考虑法线变换 = (M^{-1})^T

在文件 transform.h108 行定义.

被这些函数引用 vde::core::scale().

◆ translate() [1/2]

Transform3D vde::core::translate ( const Vector3D v)
inline

创建平移变换

参数
v平移向量
返回
平移变换矩阵
auto T = translate(Vector3D(1, 2, 3));
Point3D p2 = T * Point3D(0,0,0); // p2 == (1,2,3)
Transform3D translate(const Vector3D &v)
创建平移变换
Definition: transform.h:30
foundation::Vector3D Vector3D
双精度三维向量(重新导出)
Definition: point.h:49

在文件 transform.h30 行定义.

被这些函数引用 vde::core::translate().

◆ translate() [2/2]

Transform3D vde::core::translate ( double  x,
double  y,
double  z 
)
inline

创建平移变换(分量形式)

参数
xX 方向位移
yY 方向位移
zZ 方向位移
返回
平移变换矩阵

在文件 transform.h44 行定义.

引用了 vde::core::translate().

◆ voronoi_2d()

std::vector<VoronoiCell> vde::core::voronoi_2d ( const std::vector< Point2D > &  points)

二维 Voronoi 图生成(通过 Delaunay 对偶图)

从输入点集的 Delaunay 三角剖分构造其对偶 Voronoi 图。 每个输入点对应一个 VoronoiCell。

参数
points输入点集(站点)
返回
每个站点对应的 VoronoiCell 列表(顺序与输入一致)
注解
对于凸包边界上的站点,对应的 Voronoi 单元格无界,顶点不完全闭合
内部使用 Delaunay 三角剖分作为中间步骤
std::vector<Point2D> sites = {{0,0}, {1,0}, {0,1}, {1,1}};
auto cells = voronoi_2d(sites);
for (auto& cell : cells) {
std::cout << "Site: " << cell.site.transpose() << "\n";
std::cout << " Vertices: " << cell.vertices.size() << "\n";
}
std::vector< VoronoiCell > voronoi_2d(const std::vector< Point2D > &points)
二维 Voronoi 图生成(通过 Delaunay 对偶图)