javascript - 线接触或矩形或圆形

标签 javascript html node.js math collision-detection

我想查明一条线(具有 x1、y1、x2 和 y2)是否与某个对象碰撞(该线的任何部分是否接触该对象或在该对象内)。该对象可以是矩形(具有 x、y、宽度和高度)或圆形(具有 x、y 和半径)。

我想要两个 JavaScript 代码示例,每个都是一个函数,一个用于线-矩形碰撞(lineX1,lineY1,lineX2,lineY2,rectangleX,rectangleY,rectangeWidth,rectangleHeight),另一个用于线-圆碰撞(lineX1,lineY1,lineX2,lineY2,circleX,circleY,circleRadius)

最有效的方法将不胜感激。

最佳答案

线段有参数方程

X = X0 + t (X1 - X0)
Y = Y0 + t (Y1 - Y0)

圆有隐式方程

(X - Xc)² + (Y - Yc)² = R²

将第一个表达式替换为最后一个表达式,即可得到 t 中的二次方程,其具有

  • 没有根,则没有交集;
  • 一个或两个根,在圆内给出t的间隔;您需要检查此区间与 [0, 1] 的交集,看看该段内部是否有一部分。

对于与轴对齐的矩形的线段,您可以编写不等式组

Xa <= X0 + t (X1 - X0) <= Xb
Ya <= Y0 + t (Y1 - Y0) <= Yb

如果t的系数为负数,则可以交换X0 <=> X1Xa < => Xb(与Y相同)使其为正。

然后不等式变为

(Xa - X0) / (X1 - X0) <= t <= (Xb - X0) / (X1 - X0)
(Ya - Y0) / (Y1 - Y0) <= t <= (Yb - Y0) / (Y1 - Y0)

向其添加分段限制

0 <= t <= 1.

检查这些包围是否兼容很容易。

对于圆形和矩形,您可以从直线边界框测试开始。

关于javascript - 线接触或矩形或圆形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37937200/

相关文章:

javascript - 如何在可滚动的 div 中创建图像

javascript - 需要解释 Underscore.js 中的 _.bindAll() 函数

javascript - 输入类型编号 onchange 延迟触发

javascript - 平滑滚动 div 到 div

javascript - 退出时的 node.js pm2

javascript - Angular js 嵌套自定义指令

javascript - 第二次删除后添加 Gritter 消息

jquery - 在鼠标悬停时停止选取框并在鼠标移出时播放

mysql - Restify:使用 promise 链复制文件和查询数据库时发生套接字挂起错误

javascript - 如何保存应用程序的登录次数?(nodejs,JS,mongodb)