线条触摸或矩形或圆形
我想知道一条线(与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.
这是一件容易的事,以检查是否这些bracketings是兼容的限制。
对于圆形和矩形,您都可以从一个直线边界框测试开始。
原始问题提出一条线,而不是一条线段,在这种情况下,区间[0,1]是否有任何意义? –
@ this-vidor:我询问了OP对此的澄清。例如,我的答案是“最强大的”,并且可以忽略[0,1]约束条件 –
老实说,我不明白这一点(把它当作赞美)。你的意思是线条而不是线条,JavaScript代码会很棒(我已经编辑了这个问题) –
也许你可以尝试获取所有形状的公式(如果我记得,line =(ax + b),circle =(degree/180 * Pi),deb从0到360. – Julqas
难道你不知道意思是一条线段? –