2009-08-30 53 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頂點

如果廣場直接面對線條,這可能會中斷,在這種情況下,通過檢查廣場的第一個邊緣來處理它。