2012-05-08 95 views
1

我有:檢查是否在矩形的點

  1. 軸對齊矩形- [R;
  2. 非垂直線A(由兩點指定);
  3. 垂直線B(由x座標指定)。

以上所有物件由指定整數座標

我需要檢查時,如果交叉的結果是- [R但我不能只計算穿越AB的結果,因爲它在整數座標中可能是不可預測的。此外,我無法將其轉換爲雙打,因爲我需要得到絕對準確的結果而沒有任何不準確。

那麼,我該如何檢查它?

+0

爲什麼你認爲使用'double'將比使用整數更精確? – Alnitak

+1

交叉點的y座標是一個有理數,所以你想要做什麼。請注意,您只需檢查y座標,因爲B是否與R相交足以檢查x座標。潛在的問題是整數溢出。 –

回答

1

如果直線由整數座標指定,那麼它們的交點具有合理的座標,這可以與絕對精度進行比較。讓我們通過點(ax0,ay0)和(ax1,ay1),並且B在X0座標處。 (ay0 *(ax1-ax0)+(x0-ax0)*(ay1-ay0))/(ax1-ax0)= p/q,其中p和q是整數,q是積極的(如果需要,否定提名人)。

然後p可以與R.Top進行比較* q和R.Bottom * Q

0

[讓我們忽略不感興趣的情況下,當B不相交R]

ř切斷從B中的段,讓我們稱它爲S.當且僅當A穿過S時,B和A的交點位於R內。

S的查找點很簡單。

要檢查一條線是否穿過線段,您應該檢查S的末端是否位於A的不同側 - 這可以通過帶符號的角度進行檢查。

0

假設A上的2個點是(x0, y0)(x1, y1),'x0 < x1'。

該矩形由一個確定的x座標和xR y座標yR

在B線由確定x座標xB

你正在尋找的點是(xB, yB),其中yB爲以某種方式確定,僅操縱整數:所以第一

,您需要檢查

  1. 如果xB * xR >= 0(的同一側x座標)
  2. 如果abs(xB) <= abs(xR)(B線切矩形)

如果它的確定,那麼你就需要檢查這個整數(等於(X1-X0)YB)

Y = (y1-y0)(xB-x0)+(x1-x0)y0 

驗證

  1. Y * yR >=0(的y座標的相同側)
  2. abs(Y) <= (x1-x0) * abs(yR)(也就是說你的交叉點是關於其y座標的區R)

你的觀點是在'r當且僅當了4個條件是真實的。 希望它有幫助。