当前位置: 首页 > 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));

http://www.lryc.cn/news/537941.html

相关文章:

  • 解决前后端日期传输因时区差异导致日期少一天的问题
  • mmsegmentation自己的数据集+不同网络的config配对
  • Golang官方编程指南
  • ram的使用——初始化很重要
  • doris:最佳实践
  • [创业之路-299]:图解金融体系结构
  • RL--2
  • [JVM篇]分代垃圾回收
  • Dify本地安装
  • python | 两招解决第三方库安装难点
  • stm32mp15x 之 M4 使用 canfd
  • 第七天:数据提取-正则表达式
  • Python入门全攻略(六)
  • MongoDB副本集
  • 登录弹窗效果
  • C++上机_日期问题
  • 应对DeepSeek总是服务器繁忙的解决方法
  • web第三次作业
  • 力扣 438.找到字符串中所有字母异位词
  • 【Python】Python入门——基础语法及顺序语句
  • 2.2 反向传播:神经网络如何“学习“?
  • frp-tool,客户端frp命令行工具
  • 【学术投稿-第五届应用数学、建模与智能计算国际学术会议】CSS伪类选择器深度解析:分类、应用与技巧
  • 常用查找算法整理(顺序查找、二分查找、哈希查找、二叉排序树查找、平衡二叉树查找、红黑树查找、B树和B+树查找、分块查找)
  • Express 中 res 响应方法详解
  • DeepAR:一种用于时间序列预测的深度学习模型
  • 权限模型深度解析:RBAC vs ABAC vs PBAC vs TBAC,如何选择最适合的方案?
  • Windows逆向工程入门之堆栈结构与信息获取
  • 【c++初阶】类和对象②默认成员函数以及运算符重载初识
  • 【做一个微信小程序】校园地图页面实现