线接触或矩形或圆形

时间:2016-06-21 06:40:52

标签: 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)

非常感谢最有效的方式。

1 个答案:

答案 0 :(得分:1)

线段具有参数方程

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&lt; =&gt; X1Xa&lt; =&gt; Xb(同样为Y)使其成为正面。

然后不公平变为

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

您要添加细分的限制

0 <= t <= 1.

检查这些支架是否兼容是一件容易的事。

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