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

相关文章:

用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 pointToSegmen…...

解决前后端日期传输因时区差异导致日期少一天的问题

前端处理 1. 发送日期字符串而非时间戳 在前端使用日期选择器&#xff08;如 el-date-picker&#xff09;获取日期后&#xff0c;将日期转换为特定格式的字符串&#xff08;如 YYYY-MM-DD&#xff09;发送给后端&#xff0c;避免直接发送带有时区信息的时间戳或日期对象。这样…...

mmsegmentation自己的数据集+不同网络的config配对

比如说我们要用这个网络&#xff1a; 我们发现他内部继承了很多类&#xff0c;要想配对我们的数据集&#xff0c;就要进行父类的修改。 ../_base_/models/deeplabv3_unet_s5-d16.py, ../_base_/datasets/drive.py,../_base_/default_runtime.py, ../_base_/schedules/schedule…...

Golang官方编程指南

文章目录 1. Golang 官方编程指南2. Golang 标准库API文档 1. Golang 官方编程指南 Golang 官方网站&#xff1a;https://go.dev/ 点击下一步&#xff0c;查看官方手册怎么用 https://tour.go-zh.org/welcome/1 手册中的内容比较简单 go语言是以包的形式化管理函数的 搜索包名…...

ram的使用——初始化很重要

背景 ram是非常常用的ip&#xff0c;前人的经验告诉我们&#xff0c;如果不对ram进行初始化直接读写&#xff0c;不定态在实际上板时会出现不可预知的问题。 我们需要对ram进行初始化写0操作&#xff0c;代码如下。需要注意&#xff0c;复位释放时立马写入可能存在复位抖动的…...

doris:最佳实践

异步物化视图使用原则​ 时效性考虑&#xff1a; 异步物化视图通常用于对数据时效性要求不高的场景&#xff0c;一般是 T1 的数据。如果时效性要求高&#xff0c;应考虑使用同步物化视图。 加速效果与一致性考虑&#xff1a; 在查询加速场景&#xff0c;创建物化视图时&#x…...

[创业之路-299]:图解金融体系结构

一、金融体系结构 1.1 概述 金融体系结构是一个国家以行政的、法律的形式和运用经济规律确定的金融系统结构&#xff0c;以及构成这个系统的各种类型的银行和非银行金融机构的职能作用和相互关系。以下是对金融体系结构的详细分析&#xff1a; 1、金融体系的构成要素 现代金…...

RL--2

强化学习当中最难的两个点是&#xff1a; 1.reward delay&#xff1b; 2.agent的行为会影响到之后看到的东西&#xff0c;所以agent要学会探索世界&#xff1b; 关于强化学习的不同类型&#xff0c;可以分为以下三种&#xff1a; 一种是policy based&#xff1a;可以理解为它是…...

[JVM篇]分代垃圾回收

分代垃圾回收 分代收集法是目前大部分 JVM 所采用的方法&#xff0c;其核心思想是根据对象存活的不同生命周期将内存划分为不同的域&#xff0c;一般情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代(Young Generation)。老生代的特点是每次垃圾回收时只有少量对象…...

Dify本地安装

目录 方式一docker安装&#xff1a; 方式二源码安装&#xff1a; Dify本地安装可以用docker方式&#xff0c;和源码编译方式。 先到云厂商平台申请一台Centos系统云主机&#xff0c;网络选择海外&#xff0c;需要公网IP&#xff0c;再按一下流程操作&#xff1a; 方式一doc…...

python | 两招解决第三方库安装难点

前言 python 被广泛应用的原因之一&#xff0c;便是拥有大量的第三方库&#xff0c;涵盖 web 开发、数据分析和机器学习等多个方面。 对于多数初学者来说&#xff0c;如何成功安装 python 第三方库成为了一大难点&#xff0c;总是因各种原因导致安装失败。 本文以自身经验&a…...

stm32mp15x 之 M4 使用 canfd

目录 序配置添加注坑参考 序 在使用 stm32mp15x 系列时&#xff0c;M4 有不少的坑&#xff0c;这里简单聊聊使用 canfd 时遇到的一些问题。 配置 这里使用 PLL4R 为 100M&#xff0c;用于 CANFD 的时钟 canfd 速率配置成 1M &#xff0c;5M&#xff0c;其中数据传输速率为 5M…...

第七天:数据提取-正则表达式

每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中&#xff0c;对于爬虫有兴趣的伙伴可以订阅专栏一起学习&#xff0c;完全免费。 键盘为桨&#xff0c;代码作帆。这趟为期30天左右的Python爬虫特训即将启航&#xff0c;每日解锁新海域&#xff1a;从Requests库的…...

Python入门全攻略(六)

文件操作 文件路径 绝对路径:D:\pythonLearing\fileOperating.exe 相对路径:./fileOperating.exe # ./表示当前目录 # ../表示上一级目录 字符编码 字符集编码说明ASCll 最早的字符编码标准之一,基于拉丁字母的字符集,一共有128个字符GBK(国际码)用于简体中文的字符编码,…...

MongoDB副本集

副本集架构 对于mongodb来说&#xff0c;数据库高可用是通过副本集架构实现的&#xff0c;一个副本集由一个主节点和若干个从节点所组成。 客户端通过数据库主节点写入数据后&#xff0c;由从节点进行复制同步&#xff0c;这样所有从节点都会拥有这些业务数据的副本&#xff0…...

登录弹窗效果

1&#xff0c;要求 点击登录按钮&#xff0c;弹出登录窗口 提示1&#xff1a;登录窗口 display:none 隐藏状态&#xff1b; 提示2&#xff1a;登录按钮点击后&#xff0c;触发事件&#xff0c;修改 display:block 显示状态 提示3&#xff1a;登录窗口中点击关闭按钮&#xff0…...

C++上机_日期问题

1.求下一天的年月日 问题 已知某天的年月日&#xff0c;求下一天的年月日。 思路 参数&#xff1a;年&#xff0c;月&#xff0c;日&#xff08;int) 返回值&#xff1a;void 处理&#xff1a;根据参数所给年月日&#xff0c;求下一天的年月日 思路: 1、定义一个数组&a…...

应对DeepSeek总是服务器繁忙的解决方法

最近由于访问量过大&#xff0c;DeepSeek服务器官网经常弹出&#xff1a;“服务器繁忙&#xff0c;请稍后再试”的提示&#xff0c;直接卡成PPT怎么办&#xff1f;服务器繁忙直接看到视觉疲劳&#xff1a; 解决DeepSeek卡顿问题 DeepSeek使用卡顿问题&#xff0c;是因为访问量…...

web第三次作业

弹窗案例 1.首页代码 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>综合案例</title><st…...

力扣 438.找到字符串中所有字母异位词

题目&#xff1a; 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cb…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...