线条触摸或矩形或圆形

问题描述:

我想知道一条线(与x1,y1,x2和y2)是否碰撞一个对象(如果线的任何部分触及或在该对象内)。对象可以是矩形(带有x,y,宽度和高度)或圆形(带有x,y和半径)。线条触摸或矩形或圆形

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

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

+0

也许你可以尝试获取所有形状的公式(如果我记得,line =(ax + b),circle =(degree/180 * Pi),deb从0到360. – Julqas

+0

难道你不知道意思是一条线段? –

的线段有参数方程

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. 

这是一件容易的事,以检查是否这些bracketings是兼容的限制。

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

+0

原始问题提出一条线,而不是一条线段,在这种情况下,区间[0,1]是否有任何意义? –

+0

@ this-vidor:我询问了OP对此的澄清。例如,我的答案是“最强大的”,并且可以忽略[0,1]约束条件 –

+0

老实说,我不明白这一点(把它当作赞美)。你的意思是线条而不是线条,JavaScript代码会很棒(我已经编辑了这个问题) –