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

二维平面内的碰撞检测【一】

碰撞检测,故名思议,两个元素在运动的过程中是否有接触。
接下来,我们从简单到复杂的碰撞一一解析其中的算法。编码使用JavaScript。
ps:下列图形均指实心图形

点与点的碰撞

这个太简单了,不多说,就是当坐标一致的时候就是碰撞.

//A(x1,y1)B(x2,y2) 
if(x1===x2 && y1===y2){
    //碰撞
}else{
    //无碰撞
}

点与圆的碰撞

点A(x1,y1) 圆心(x2,y2) 半径 r
clipboard.png

我们可以看出红色的点与圆心的距离若小于半径,那么点与圆便发生碰撞。
根据勾股定理可以得出距离 d = √((x1-x2)^2 + (y1-y2)^2)

//点A(x1,y1) 圆心(x2,y2) 半径 r
if(Math.sqrt(Math.pow(x1 - x2,2) + Math.pow(y1-y2,2)) <= r){
    //碰撞
}else{
    //无碰撞
}

圆与圆的碰撞

圆A(x1,y1) 半径r1 ; 圆B(x2,y2) 半径 r2

clipboard.png

同样根据勾股定理可以得出距离 d = √((x1-x2)^2 + (y1-y2)^2)

if(Math.sqrt(Math.pow(x1 - x2,2) + Math.pow(y1-y2,2)) <= (r1 + r2)){
    //碰撞
}else{
    //无碰撞
}

点与矩形的碰撞

首先矩形的表达方式有:

  1. 已知四个角的一个顶点(x2,y2)与宽w高h

  2. 已知几何中心点(x2,y2)与宽w高h

  3. 左上角与右下角两个顶点(x2,y2)、(x3,y3)

//1. 已知四个角的一个顶点(x2,y2)与宽w高h,以左上角为例
if(x1>=x2 && x1<=(x2+w) || (y1>=y2 && y1<=(y2+h))){
    //碰撞
}else{
    //无碰撞
}
//2. 已知几何中心点(x2,y2)与宽w高h
if(x1 >= (x2-w/2) && x1 <= (x2+w/2) || (y1 >= (y2-h/2) && y1 <= (y2 + h/2))){
    //碰撞
}else{
    //无碰撞
}
//3. 左上角与右下角两个顶点(x2,y2)、(x3,y3)
if(x1 >= x2 && x1 <= x3 || (y1 >= y2 && y1 <= y3)){
    //碰撞
}else{
    //无碰撞
}

矩形与矩形的碰撞

clipboard.png

无论矩形是由什么数据表示。我们都可以求出几何中心A点与B点的坐标,与矩形宽w1 w2;高h1 h2。
假设求出A(x1,y1) B(x2,y2)

if(Math.abs(x2-x1) <= (w1+w2)/2 && Math.abs(y2-y1) <= (h1+h2)){
    //碰撞
}else{
    //无碰撞
}

下篇继续讲解当圆与矩形碰撞,等更复杂的碰撞检测

相关文章:

  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • BZOJ 2244: [SDOI2011]拦截导弹 [CDQ分治 树状数组]
  • Jquery里live事件移除原因
  • Java NIO中的通道Channel(一)通道基础
  • java栈与队列面试题
  • java中正则表达式的使用
  • 拦截器与过滤器的区别
  • RPM方式安装MySQL5.6
  • PHP 小技巧
  • Linux系统中三类重要文件的作用与区别
  • 《剑指offer》-前n项和不准用通解和各种判断
  • 内存映射文件原理探索(转载)
  • X-Frame-Options 响应头
  • Excel 总结
  • sklearn中随机森林的参数
  • Google 是如何开发 Web 框架的
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • AngularJS指令开发(1)——参数详解
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • E-HPC支持多队列管理和自动伸缩
  • Java知识点总结(JavaIO-打印流)
  • JS学习笔记——闭包
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux Process Manage
  • Linux下的乱码问题
  • Otto开发初探——微服务依赖管理新利器
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vultr 教程目录
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 技术:超级实用的电脑小技巧
  • 经典排序算法及其 Java 实现
  • 微信小程序设置上一页数据
  • 微信小程序--------语音识别(前端自己也能玩)
  • 新版博客前端前瞻
  • 一个项目push到多个远程Git仓库
  • 移动端唤起键盘时取消position:fixed定位
  • 译米田引理
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • AI算硅基生命吗,为什么?
  • 昨天1024程序员节,我故意写了个死循环~
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​批处理文件中的errorlevel用法
  • #define、const、typedef的差别
  • #stm32整理(一)flash读写
  • $refs 、$nextTic、动态组件、name的使用
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (3)选择元素——(17)练习(Exercises)
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (ZT)一个美国文科博士的YardLife
  • (多级缓存)缓存同步
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (三)c52学习之旅-点亮LED灯
  • (新)网络工程师考点串讲与真题详解