js随手笔记-------理解JavaScript碰撞检测算法核心简单实现原理

news/2024/11/4 11:15:59

碰撞检测在前端游戏,设计拖拽的实用业务等领域的应用场景非常广泛,今天我们就在这里对于前端JavaScript如何实现碰撞检测算法进行一个原理上的探讨,让大家能够明白如何实现碰撞以及碰撞的理念是什么:
1.矩形与矩形间的碰撞
核心理念
判断任意两个(无旋转)矩形的任意一边是否无间距,从而判断是否碰撞。大体实现方式就是以一个矩形的某个定点作为运动物,计算自己的坐上顶点与另一元素的左上定点的位置和宽高数据进行判断检测
通用算法判断

if(react1.offsetLeft<react2.offsetLeft+react2.offsetWidth&&
   react1.offsetLeft+react1.offsetWidth>react2.offsetLeft&&
   react1.offsetTop<react2.offsetTop+react2.offsetHeight&&
   react1.offsetHeight+react1.offsetTop>react2.offsetTop
){
 console.log('碰撞成功')
}

如下:图中的 x 既是 offsetLeft , y 既是 offsetTop;矩形的宽和高既是 offsetWidth 、offsetHeight
图片描述

2.圆形与圆形的碰撞
核心理念
通过判断任意两个圆形的圆心距离是否小于两圆半径之和,若小于则为碰撞。
通用算法

|AB|=Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2))

概念模型
图片描述

3.圆形与矩形之间的碰撞
核心理念
通过找出矩形上离圆心最近的点,然后通过判断该点与圆心的距离是否小于圆的半径,若小于则为碰撞。改点的位置可以通过获取矩形左上角的坐标位置和元素的宽高来进行数据计算。
通用算法

var distance=Math.sqrt(Math.pow(closestPoint.x-x1,2)+Math.pow(closestPoint.y-y1,2));
if(distance<r1){
  console.log('碰撞成功')
}else{
 console.log('没碰到')
}

概念模型
图片描述

4.圆形与旋转矩形之间的碰撞
核心理念
即使矩形以其中心为旋转轴进行了旋转,但是判断它与圆形是否发生碰撞的本质还是找出矩形上离圆心的最近点。但是矩形的边缘坐标需要进行一个数据转换,通过这个旋转的角度值计算转换后的位置
通用算法(同上)

var distance=Math.sqrt(Math.pow(closestPoint.x-x1,2)+Math.pow(closestPoint.y-y1,2));
if(distance<r1){
  console.log('碰撞成功')
}else{
 console.log('没碰到')
}

概念模型
图片描述

5.矩形与障碍物之间的碰撞(地图碰撞算法)
核心理念
将整个地图进行数据化,划分为一个矩形的地图,地图的每个基本单位是一个矩形区域。地图中所有可能参与碰撞的物体都要是基本单位大小的整数倍,地图中参与检测的对象都存储着自身所在格子的坐标,两个物体在同一格才为碰撞。
通用算法

//标记为0的可以通过,1的不可以通过既是障碍物
var map=[
    [1,1,1,1,1,1,1,1,0],
    [1,0,1,0,1,0,0,0,1],
    [1,0,0,0,1,0,1,1,0],
    [1,1,0,0,0,0,0,1,0],
    [1,1,1,1,1,1,1,1,1],
]
//设置角色的初始位置
player={left:2,top:2}
//下面就要用到A*寻路算法进行判断检测碰撞了
......

概念模型
图片描述


http://www.niftyadmin.cn/n/1894737.html

相关文章

用php有一份序列2 1 3 2 3 5,算法竞赛小专题系列(1):二分法、三分法

原标题&#xff1a;算法竞赛小专题系列(1)&#xff1a;二分法、三分法本系列是这本算法教材的扩展资料&#xff1a;《算法竞赛入门到进阶》. 罗勇军、郭卫斌.  清华大学出版社二分法和三分法是算法竞赛中常见的算法思路&#xff0c;本文介绍了它们的理论背景、模板代码、典型…

ubutun安装 docker

2019独角兽企业重金招聘Python工程师标准>>> docker安装文档 $ sudo apt-get update$ sudo apt-get install \apt-transport-https \ca-certificates \curl \software-properties-common$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key …

【转】用ffmpeg转多音轨的mkv文件

命令&#xff1a; ffmpeg -i AmericanCaptain.mkv -map 0:v -vcodec copy -map 0:a:1 -acodec copyAmericanCaptain.mp4 -strict -2 命令说明&#xff1a; 0:v 代表提取所有视频流&#xff08;一般视频流只有1路&#xff09; 0:a:1 代表提取第2路音频流 这个MKV是有2个音轨的&a…

oracle中给予权限,Oracle给予用户权限

Oracle授予用户权限需要在Oracle里创建一个用户名和密码均为SYSDATA的用户&#xff0c;找了找资料&#xff0c;创建成功&#xff0c;现将Oracle中用户的创建和授予命令&#xff1a;1、Linux 下Oracle的启动以Oracle身份登录启动lsnrctl start登录sqplus /nolog连接数据库connec…

mysql pdo事务

/* 开始一个事务&#xff0c;关闭自动提交 */直到调用commit结束事务时才提交 $dbh->beginTransaction(); bool PDO::commit ( void ) 提交一个事务&#xff0c;数据库连接返回到自动提交模式直到下次调用 PDO::beginTransaction() 开始一个新的事务为止。 rollBack — 回滚…

oracle使用常见问题,ORACLE数据库使用的常见问题(二)

21. 查询当前用户对象?Select * FROM USER_OBJECTS&#xff1b;Select * FROM DBA_SEGMENTS&#xff1b;22. 如何获取错误信息?Select * FROM USER_ERRORS23. 如何获取dblink链接状况?Select * FROM DBA_DB_LINKS24. 查看数据库字符状况?Select * FROM NLS_DATABASE_PARAME…

ORACLE日常-ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组&#xff0c;在分组内部根据col2排序&#xff0c;而此函数计算的值就表示每组内部排序后的顺序编号&#xff08;组内是连续且唯一的&#xff09; 具体说明下&#xff1a; 在testTable表中有如下数据&#…