当前位置: 首页 > news >正文

用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));

相关文章:

  • 基于springboot的超时代停车场管理平台(源码+文档)
  • LabVIEW与USB设备开发
  • 关于post和get的请求参数问题
  • [JVM篇]虚拟机性能监控、故障处理工具
  • TDengine 数据备份/还原工具 taosdump
  • C#开源大型商城系统之B2B2C+O2O一体化_OctShop
  • kubectl top输出与Linux free命令不一致原因?
  • React常用库
  • 【PyTorch】torch.optim介绍
  • MySQL
  • CCF-CSP第19次认证第一题——线性分类器【NA】
  • Deep seek学习日记1
  • 人工智能 - 主动视觉可能就是你所需要的:在双臂机器人操作中探索主动视觉
  • 学习笔记之debian的thonny开发(尚未验证)--从stm32裸机到linux嵌入式系统
  • windows11+ubuntu20.04双系统下卸载ubuntu并重新安装
  • 人工智能 - 机器学习、深度学习、强化学习是人工智能领域的理论基础和方法论
  • Docker 修改配置后无法启动问题
  • Python笔记
  • 红队视角出发的k8s敏感信息收集——Kubernetes API 扩展与未授权访问
  • 腿足机器人之七- 逆运动学
  • 神舟十九号航天员乘组平安抵京
  • 迪卡侬回应出售中国业务30%股份传闻:始终扎根中国长期发展
  • “五一”假期预计全社会跨区域人员流动量超14亿人次
  • 非法收受财物逾1648万,湖南原副厅级干部康月林一审被判十年半
  • 消费维权周报|上周违规经营类投诉较多,涉诱导加盟等
  • 《沙尘暴》:用贴近生活的影像和表演拍摄悬疑剧