主页 > 创业  > 

用C++实现点到三角形最小距离的计算

用C++实现点到三角形最小距离的计算
1、全部代码 #include <iostream> #include <cmath> #include <array> #include <algorithm> // 二维点结构体 struct Point2D { double x, y; Point2D(double x = 0, double y = 0) : x(x), y(y) {} }; // 计算点到线段的最小距离 double pointToSegmentDistance(const Point2D& p, const Point2D& a, const Point2D& b) { const Point2D ab = {b.x - a.x, b.y - a.y}; // 线段向量 const Point2D ap = {p.x - a.x, p.y - a.y}; // 起点到点的向量 // 计算投影参数 const double dot = ap.x * ab.x + ap.y * ab.y; const double lenSq = ab.x * ab.x + ab.y * ab.y; // 处理零长度线段 if (lenSq == 0.0) return std::hypot(ap.x, ap.y); const double t = std::clamp(dot / lenSq, 0.0, 1.0); // 计算投影点 const Point2D projection = { a.x + t * ab.x, a.y + t * ab.y }; return std::hypot(p.x - projection.x, p.y - projection.y); } // 计算点到三角形的最小距离 double pointToTriangleDistance(const Point2D& p, const Point2D& a, const Point2D& b, const Point2D& c) { // 计算到三条边的最小距离 const double d1 = pointToSegmentDistance(p, a, b); const double d2 = pointToSegmentDistance(p, b, c); const double d3 = pointToSegmentDistance(p, c, a); return std::min({d1, d2, d3}); } int main() { // 测试用例 Point2D p(1, 1); // 测试点 Point2D a(0, 0); // 三角形顶点 Point2D b(4, 0); Point2D c(2, 3); double distance = pointToTriangleDistance(p, a, b, c); std::cout << "Minimum distance: " << distance << std::endl; return 0; } 2、核心算法解析(三维度分析) 2.1 几何原理维度 将三角形分解为三条边处理采用投影法计算点到线段的最近距离使用向量点积判断投影点是否在线段范围内运用勾股定理计算欧氏距离 2.2 边界处理维度 // 处理退化线段(起点终点重合) if (lenSq == 0.0) return std::hypot(ap.x, ap.y); // 使用clamp确保投影参数在[0,1]区间 const double t = std::clamp(dot / lenSq, 0.0, 1.0); 2.3 性能优化维度 避免使用平方根运算直到最后计算距离使用hypot函数避免数值溢出并行计算三条边的距离最小堆思想选取最小值 2.4 扩展功能接口 // 增强版接口(返回最近点和距离) struct DistanceResult { Point2D closest_point; double distance; }; DistanceResult enhancedDistance(const Point2D& p, const Point2D& a, const Point2D& b, const Point2D& c) { // 实现逻辑: // 1. 计算三条边的最近点 // 2. 比较三个距离 // 3. 返回最小距离及其对应点 // (实现代码约20行,此处省略) } 2.5 使用示例 // 场景1:点在三角形内部 Point2D p1(2, 1); assert(pointToTriangleDistance(p1,a,b,c) == 1.0); // 场景2:点在顶点附近 Point2D p2(0.1, 0.1); assert(floor(distance*100) == 14); // 实际距离≈0.1414 // 场景3:点在边的延长线上 Point2D p3(5, 0); assert(distance == 1.0); // 距离边BC为1 // 场景4:退化三角形处理 Point2D d(0,0); assert(pointToTriangleDistance(p,d,d,d) == hypot(1,1));

标签:

用C++实现点到三角形最小距离的计算由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“用C++实现点到三角形最小距离的计算