我想查明一条线(具有 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
<=> X1
和Xa
< => 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/