任何人都有一个简单的算法吗?不需要轮换或任何东西。只是查找由两个点构成的线段是否与正方形相交
答案 0 :(得分:4)
这段代码可以解决问题。它检查线与边相交的位置,然后检查它是否在方形的宽度内。返回的是交互数量。
float CalcY(float xval, float x0, float y0, float x1, float y1)
{
if(x1 == x0) return NaN;
return y0 + (xval - x0)*(y1 - y0)/(x1 - x0);
}
float CalcX(float yval, float x0, float y0, float x1, float y1)
{
if(x1 == x0) return NaN;
return x0 + (yval - y0)*(y1 - y0)/(x1 - x0);
}
int LineIntersectsSquare(int x0, int y0, int x1, int y1, int left, int top, int right, int bottom)
{
int intersections = 0;
if(CalcX(bottom, x0, y0, x1, y1) < right && CalcX(bottom, x0, y0, x1, y1) > left ) intersections++;
if(CalcX(top , x0, y0, x1, y1) < right && CalcX(top , x0, y0, x1, y1) > left ) intersections++;
if(CalcY(left , x0, y0, x1, y1) < top && CalcY(left , x0, y0, x1, y1) > bottom) intersections++;
if(CalcY(right , x0, y0, x1, y1) < top && CalcY(right , x0, y0, x1, y1) > bottom) intersections++;
return intersections;
}
注意:此代码是理论上的,可能不正确,因为它尚未经过测试
答案 1 :(得分:1)
您可以通过投射矢量并计算它穿过的边数来实现此目的。
如果它穿过的边是偶数,它就在对象之外,如果它穿过的边是奇数,它就在里面。
这适用于所有封闭的多边形。
答案 2 :(得分:0)
这是一种方式:
- 通过x-coord对广场的顶点进行排序
- 通过x-coord对线的端点进行排序
- 计算从线的minX端到每个中间两个(通过x-coord)方形顶点的角度
- 计算线的角度
- 如果线的角度在可能的角度范围内,你所要做的就是长度检查,行的maxX结束&gt;正方形的minX顶点
如果正方形直接面向直线,这可能会破裂,在这种情况下,我只需通过检查正方形的第一个边缘来进行特殊处理。