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

碰撞检测算法之闵可夫斯基差集法(Minkowski Difference)

在游戏开发和机器人路径规划乃至于现在比较火的自动驾驶中,我们常常需要确定两个物体是否发生碰撞,有一种通过闵可夫斯基差集法求是否相交的算法,下面将介绍一下

闵可夫斯基差集法的优势

闵可夫斯基差集法优势:

  • 可以处理复杂的形状和多边形/多面体。
  • 提供精确的接触点和分离向量信息。

AABB的优势:

  • 不像AABB一样简单快速,只需要几次比较就可以完成相交测试
  • 可生成AABBTree,快速排除不可能相交的物体

可以看出AABB更快,闵可夫斯基差法更准,所以可以拿AABBTree缩小检测目标范围,最后精准检测的时候可以用闵可夫斯基差集法

闵可夫斯基差集法图形求交

有两个相交的图形A和B

在A中取一个点A1,和B中的所有点求差

将图形连接起来

再在A中取一个点A2,和B中的所有点求差

取A3,和B中的所有点求差

(其实在这里,原点出现在了生成的图形中,就可以终止循环了,我后面优化部分会提到)

取A4,和B中的所有点求差

连接所有结果

可以看到原点在闵可夫斯基差集的图形中,则成两个图形存相交情况

如果没有交点,也就不存在焦点了

测试代码

import numpy as npdef minkowski_difference(A, B):"""计算两个多边形A和B的闵可夫斯基差"""diff = []for a in A:for b in B:diff.append(a - b)return np.array(diff)def is_origin_inside(polygon):"""检查原点是否在多边形内部"""return true/falsedef polygons_collide(A, B):"""判断两个多边形是否碰撞"""# 计算闵可夫斯基差difference = minkowski_difference(A, B)# 检查原点是否在差集内return is_origin_inside(difference)# 示例:定义两个多边形的顶点
polygon_A = np.array([[0, 0], [2, 0], [2, 2], [0, 2]])  # 正方形
polygon_B = np.array([[1, 1], [3, 1], [3, 3], [1, 3]])  # 另一个正方形,与A相交# 检测碰撞
collision = polygons_collide(polygon_A, polygon_B)
print("Polygons collide:", collision)

优化:

①闵可夫斯基差的几何意义是所有可能从一个多边形内的任一点到另一个多边形内任一点的向量集合。而上面的方法生成的是一个点集,而不是这些点构成的实际几何形状(通常是凸包),因此,许多计算出来的点对于确定原点是否在闵可夫斯基差内部是没有必要的

我上边到A3遍历的时候,就已经知道相交了,就直接可以是否相交了,没必要再计算A4了

要避免不必要的计算,我们可以优化minkowski_difference函数,使其不生成完整的闵可夫斯基差集。我们可以在检测过程中动态地生成差异点,并且一旦发现原点位于闵可夫斯基差内,就可以立即返回结果,而不需要继续计算,简单优化下

import numpy as npdef minkowski_difference_check_origin(A, B):"""检查原点是否在两个多边形A和B的闵可夫斯基差内"""for a in A:for b in B:diff = a - bif is_origin_inside_single_point(diff):return Truereturn Falsedef is_origin_inside_single_point(point):"""简单检查单个点是否非常接近原点"""return true/falsedef polygons_collide(A, B):"""判断两个多边形是否碰撞"""# 动态检查原点是否在闵可夫斯基差内return minkowski_difference_check_origin(A, B)# 示例:定义两个多边形的顶点
polygon_A = np.array([[0, 0], [2, 0], [2, 2], [0, 2]])  # 正方形
polygon_B = np.array([[1, 1], [3, 1], [3, 3], [1, 3]])  # 另一个正方形,与A相交# 检测碰撞
collision = polygons_collide(polygon_A, polygon_B)
print("Polygons collide:", collision)

当然了,这个碰撞算法不是最佳的,有更加好的GJK算法,是一种优化后的技术,它巧妙地利用了闵可夫斯基差的概念,但在实际应用中避免了直接计算其所有点所带来的高昂代价

后面我将会更新GJK算法的文章

补充

注意是Minkowski Difference(闵可夫斯基差集)不是Minkowski Distance(闵可夫斯基距离),虽然都来源于数学家赫尔曼·闵可夫斯基的工作,但它们是两个不同的概念,应用领域也有所不同,这里注意区分

相关文章:

碰撞检测算法之闵可夫斯基差集法(Minkowski Difference)

在游戏开发和机器人路径规划乃至于现在比较火的自动驾驶中,我们常常需要确定两个物体是否发生碰撞,有一种通过闵可夫斯基差集法求是否相交的算法,下面将介绍一下 闵可夫斯基差集法的优势 闵可夫斯基差集法优势: 可以处理复杂的…...

【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析

引言 在数据排序的世界里,选择排序是一类简单而直观的算法,它通过不断选取未排序部分中的最小(或最大)元素来逐步构建有序序列。今天,我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序,…...

2008-2020年各省技术服务水平相关指标数据

2008-2020年各省技术服务水平相关指标数据 1.时间:2008-2020年 2.指标:行政区划代码、地区、年份、信息传输、软件和信息技术服务业城镇单位就业人员(万人)、软件业务收入(万元)、高技术产品出口额占商品出口额比重(%) 3.范围&…...

机器学习DAY4续:梯度提升与 XGBoost (完)

本文将通过 XGBoost 框架来实现回归、分类和排序任务,帮助理解和掌握使用 XGBoost 解决实际问题的能力。我们将从基本的数据处理开始,逐步深入到模型训练、评估以及预测。最后,将模型进行保存和加载训练好的模型。 知识点 回归任务分类任务…...

ML-Agents:训练配置文件(一)

注:本文章为官方文档翻译,如有侵权行为请联系作者删除 Training Configuration File - Unity ML-Agents Toolkit–原文链接 常见训练器配置 关于训练,您需要做出的首要决定之一是使用哪种训练器:PPO、SAC 还是 POCA。有些训练配置…...

【物联网技术与应用】 实验13:雨滴传感器实验

实验13 雨滴传感器实验 【实验介绍】 雨滴传感器或雨滴检测传感器用于检测是否下雨以及降雨。广泛应用于汽车的雨刷系统、智能照明系统和天窗系统。 【实验组件】 ● Arduino Uno主板* 1 ● USB数据线*1 ● 雨滴传感器* 1 ● 雨滴传感器调理板* 1 ● 面包板*1 ● 9V方型…...

帝国cms电脑pc站url跳转到手机站url的方法

本文讲解一下帝国cms电脑网站跳转到手机动态网站和手机静态网站的方法,笔者以古诗词网 www.gushichi.com为例,为大家介绍操作步骤。方法一:帝国pc站跳转到手机静态站 1、假设我们有帝国cms 电脑网站www.XXX.com,手机网站m.XXX.com &#xf…...

Django models中的增删改查与MySQL SQL的对应关系

在 Django 中,models 提供了一种高层次的抽象来与数据库进行交互,使得开发者可以使用 Python 代码而非直接编写 SQL 来执行增删改查(CRUD)操作。下面将详细介绍 Django 的 ORM(对象关系映射)操作如何对应到…...

双指针——快乐数

一.题目描述 202. 快乐数 - 力扣(LeetCode) 二.题目解析 我们要判断一个数是不是快乐数要通过它的三个性质来进行判断。这个数会一直变化,由它的各个位的平方和重新构成这个数。如果这个数在变化的过程中变成了1,那么就是快乐数…...

Docker 默认安装位置迁移

一、找到 Docker 默认安装位置 [roothost-192-168-0-1 ~]# docker info Client:Version: 26.1.0Context: defaultDebug Mode: falseServer:Containers: 31Running: 31Paused: 0Stopped: 0Images: 128Server Version: 26.1.0Storage Driver: overlay2Backing Filesystem:…...

jmeter跨进程实现变量共享-全局变量

jmeter跨进程实现变量共享-全局变量 例如:登录一次,后面业务进行多线程并发场景 新增一个setUp线程组,在setUp线程组下,添加登录接口 使用json提取器,提取token Authorization $.token 0添加BeanShell 后置处理程序…...

Vue.js组件(6):echarts组件

1 前言 本章主要对常用的echars图表展示进行基本的组件封装。使用该组件前需要在项目中引入echarts。官网:Apache ECharts npm install echarts --save 2 图表组件 2.1 折线图组件 组件属性:chartId,指定图表挂载div的id,注意不…...

yolov3算法及其改进

yolov3算法及其改进 1、yolov3简介2、yolov3的改进2.1、backbone的改进2.1.1、darknet19相对于vgg16有更少的参数,同时具有更快的速度和更高的精度2.1.2、resnet101和darknet53,同样具有残差结构,精度也类似,但是darknet具有更高的速度2.2、FPN2.3、anchor-base与grid-cell…...

Python + 深度学习从 0 到 1(02 / 99)

希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 手写数字分类: Keras MNIST 数据集 手写数字分类…...

HTML+CSS+JS制作在线书城网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个在线书城网站,包含首页、分类页、排行榜页、新书上架页、特惠专区页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部导航栏 包含网站Logo、搜索框、用户登录/注册入口、购物车图…...

【FastAPI】中间件

【FastAPI】中间件 一、概述二、作用2.1 日志记录与监控2.2 身份验证与授权2.3 CORS(跨域资源共享)2.4 Gzip压缩2.5 会话管理2.6 自定义功能2.7 执行顺序 三、 总结四、相关链接 一、概述 FastAPI的中间件提供了一种强大的机制,允许开发者在…...

5个实用的设计相关的AI网站

在这个日新月异的数字时代,我们不断面临着新的挑战和机遇。随着人工智能(AI)技术的飞速发展,越来越多的AI工具开始融入到设计相关的工作流程中,极大地提升了工作效率和创作能力。今天,我非常兴奋地向大家介…...

STL 六大组件

C STL(标准模板库)主要由六大组件构成,它们相互协作,为C程序员提供了功能强大且高效的通用数据结构和算法工具,以下是对这六大组件的详细介绍: 1. 容器(Containers) 概述&#xff…...

Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验

一、引言 随着人工智能技术的不断进步,传统的教学方式已经逐渐向智能化、互动化转变。在众多英语测试题型中,选择题作为一种高效的方式被广泛应用于各类培训与考试中。为了帮助学生高效学习与自测,本篇文章将采用Python编写一款基于 Python …...

Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架

以下是一个使用Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架。这个框架涵盖了数据收集(爬虫)、数据清洗和预处理、模型构建(决策树和神经网络)以及模型评估的主要步骤。 1. 数据收集(爬虫&#xff09…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...