碰撞检测 :Line

本文探讨了在JavaScript和Canvas环境中如何进行直线与点、直线与圆、直线与直线以及直线与矩形的碰撞检测。通过数学原理和示例代码详细解释了每个检测方法,包括使用点积计算直线上的最近点以及判断直线是否穿过矩形的边界。
摘要由CSDN通过智能技术生成

引子

Collision Detection :Rectangle 中主要介绍了矩形相关的碰撞检测,接着来看看直线的情况。

以下示例未做兼容性检查,建议在最新的 Chrome 浏览器中查看。

Line/Point

这是示例页面

线与点的碰撞检测,观察下面一张图:

60-line-point

从图中可以发现,当点在线上时,到两个端点的距离之和与线的长度相同。两点之间的距离,同样使用之前用到过的勾股定理。考虑到计算的精度误差,可以设置一个误差允许范围值,这样会感觉更加自然一些。

/*
 * (x1,y1) 线的一个端点
 * (x2,y2) 线的另一个端点
 * (px,py) 检测点的坐标
 */
function checkLinePoint({
   x1,y1,x2,y2,px,py}) {
   
  const d1 = getLen([px,py],[x2,y2]);
  const d2 = getLen([px,py],[x2,y2]);
  const lineLen = getLen([x1,y1],[x2,y2]);
  const buffer = 0.1; // 误差允许范围
  if (d1+d2 >= lineLen-buffer && d1+d2 <= lineLen+buffer) {
   
    return true; // 发生碰撞
  } else {
   
    return false; // 没有碰撞
  }
}

/*
 * 勾股定理计算两点间直线距离
 * point1 线的一个端点
 * point2 线的另一个端点
 */
function getLen(point1,point2) {
   
  const [x1,y2] = point1;
  const [x2,y2] = point1;
  const minusX = x2-x1;
  const minusY = y2-y1;
  const len = Math.sqrt(minusX*minusX + minusY*minusY
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值