2009-08-30 72 views

回答

4

此代码应该做的伎俩。它检查线条与边线相交的位置,然后检查它是否在正方形的宽度内。返回的intesections的数量。

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

我认为CalcX需要返回x0 +(yval - y0)*(x1 - x0)/(y1 - y0); – 2014-02-04 23:34:59

1

您可以通过投射矢量并计算其交叉的边数来完成此操作。

如果它交叉的边是平坦的,它就在对象之外,如果它穿过的边是奇数,它就在里面。

这适用于所有封闭的多边形。

+0

但是,问的问题是线条和矩形是否相交,而不是线条是否包含在矩形中。 – Eric 2009-08-30 18:32:57

+0

在这种情况下,你只需要寻找任何边缘。 – FlySwat 2009-08-30 18:34:46

+0

首先要做的是什么。原来的问题几乎问到“我怎么检查线是否与广场的任何边缘相交?”。你只是说“寻找任何边缘”。 – Eric 2009-09-02 17:47:11

0

这里有一个办法:
- 用X坐标
正方形的顶点排序 - 排序的线的通过x坐标
端点 - 计算从行的其minX结束角度到每个中间的两个的(由X-坐标)的正方形顶点
- 计算线路
的角度 - 如果线的角度是可能的角度,所有你需要做的就是长度检查,是maxX线的末端>方形的minX顶点

如果广场直接面对线条,这可能会中断,在这种情况下,通过检查广场的第一个边缘来处理它。