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