202 lines
4.6 KiB
C++
202 lines
4.6 KiB
C++
#pragma once
|
|
#include "vde/core/point.h"
|
|
#include "vde/core/line.h"
|
|
#include "vde/core/plane.h"
|
|
#include "vde/core/triangle.h"
|
|
#include "vde/core/aabb.h"
|
|
|
|
namespace vde::core {
|
|
|
|
// ── Point distances ──────────────────────────
|
|
|
|
/**
|
|
* @brief 两点之间的欧氏距离
|
|
*
|
|
* @param a 第一个点
|
|
* @param b 第二个点
|
|
* @return ||b - a||
|
|
*
|
|
* @code{.cpp}
|
|
* double d = distance(Point3D(0,0,0), Point3D(3,4,0)); // d == 5.0
|
|
* @endcode
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Point3D& a, const Point3D& b);
|
|
|
|
/**
|
|
* @brief 点到直线的距离
|
|
*
|
|
* 计算点到无限直线的垂直距离。
|
|
*
|
|
* @param p 测试点
|
|
* @param line 直线
|
|
* @return 垂直距离
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Point3D& p, const Line3D<double>& line);
|
|
|
|
/**
|
|
* @brief 点到线段的距离
|
|
*
|
|
* 若投影点落在线段内部,返回垂直距离;否则返回到最近端点的距离。
|
|
*
|
|
* @param p 测试点
|
|
* @param seg 线段
|
|
* @return 最短距离
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Point3D& p, const Segment3D<double>& seg);
|
|
|
|
/**
|
|
* @brief 点到平面的距离
|
|
*
|
|
* 返回绝对值(总是非负)。
|
|
*
|
|
* @param p 测试点
|
|
* @param plane 平面
|
|
* @return 绝对垂直距离
|
|
*
|
|
* @see Plane::signed_distance
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Point3D& p, const Plane<double>& plane);
|
|
|
|
/**
|
|
* @brief 点到三角形的距离
|
|
*
|
|
* 若投影点在三角形内部,返回垂直距离;否则返回到最近的边或顶点的距离。
|
|
*
|
|
* @param p 测试点
|
|
* @param tri 三角形
|
|
* @return 最短距离
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Point3D& p, const Triangle<double>& tri);
|
|
|
|
/**
|
|
* @brief 点到包围盒的距离
|
|
*
|
|
* 若点在包围盒内,返回 0;否则返回到最近面的距离。
|
|
*
|
|
* @param p 测试点
|
|
* @param box 包围盒
|
|
* @return 最短距离(内部点返回 0)
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Point3D& p, const AABB<double>& box);
|
|
|
|
// ── Feature-pair distances ───────────────────
|
|
|
|
/**
|
|
* @brief 两条线段之间的最短距离
|
|
*
|
|
* 处理平行、相交、最近端点到端点等多种情况。
|
|
*
|
|
* @param a 第一条线段
|
|
* @param b 第二条线段
|
|
* @return 最短距离(若相交则为 0)
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Segment3D<double>& a, const Segment3D<double>& b);
|
|
|
|
/**
|
|
* @brief 两条直线之间的最短距离
|
|
*
|
|
* 若相交则为 0;若平行则返回任意垂线段长度;若异面则返回公垂线长度。
|
|
*
|
|
* @param a 第一条直线
|
|
* @param b 第二条直线
|
|
* @return 最短距离
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Line3D<double>& a, const Line3D<double>& b);
|
|
|
|
/**
|
|
* @brief 两个包围盒之间的最短距离
|
|
*
|
|
* 若相交则返回 0。
|
|
*
|
|
* @param a 第一个包围盒
|
|
* @param b 第二个包围盒
|
|
* @return 最短距离
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const AABB<double>& a, const AABB<double>& b);
|
|
|
|
/**
|
|
* @brief 两个三角形之间的最短距离
|
|
*
|
|
* 处理分离、边相交、面重叠等情况。
|
|
*
|
|
* @param a 第一个三角形
|
|
* @param b 第二个三角形
|
|
* @return 最短距离(若相交则为 0)
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
double distance(const Triangle<double>& a, const Triangle<double>& b);
|
|
|
|
// ── Closest-point queries ────────────────────
|
|
|
|
/**
|
|
* @brief 三角形上距给定点最近的点
|
|
*
|
|
* 使用重心坐标将投影点截断到三角形内部。
|
|
* 若投影在三角形外,返回最近边或顶点上的点。
|
|
*
|
|
* @param p 查询点
|
|
* @param tri 三角形
|
|
* @return 三角形上距离 p 最近的点
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
Point3D closest_point(const Point3D& p, const Triangle<double>& tri);
|
|
|
|
/**
|
|
* @brief 线段上距给定点最近的点
|
|
*
|
|
* 通过参数 t = clamp(投影, 0, 1) 实现。
|
|
*
|
|
* @param p 查询点
|
|
* @param seg 线段
|
|
* @return 线段上距离 p 最近的点(可能为端点)
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
Point3D closest_point(const Point3D& p, const Segment3D<double>& seg);
|
|
|
|
/**
|
|
* @brief 包围盒上距给定点最近的点
|
|
*
|
|
* 对每个坐标分量做 clamp 到 [min, max]。
|
|
*
|
|
* @param p 查询点
|
|
* @param box 包围盒
|
|
* @return 包围盒边界上(或内部)距离 p 最近的点
|
|
*
|
|
* @ingroup core
|
|
*/
|
|
Point3D closest_point(const Point3D& p, const AABB<double>& box);
|
|
|
|
/**
|
|
* @brief 平面上距给定点最近的点(正交投影)
|
|
*
|
|
* @param p 查询点
|
|
* @param plane 平面
|
|
* @return 点 p 在平面上的正交投影
|
|
*
|
|
* @see Plane::project
|
|
* @ingroup core
|
|
*/
|
|
Point3D closest_point(const Point3D& p, const Plane<double>& plane);
|
|
|
|
} // namespace vde::core
|