我有:檢查是否在矩形的點
- 軸對齊矩形- [R;
- 非垂直線A(由兩點指定);
- 垂直線B(由x座標指定)。
以上所有物件由指定整數座標。
我需要檢查時,如果交叉甲和乙的結果是- [R。但我不能只計算穿越A和B的結果,因爲它在整數座標中可能是不可預測的。此外,我無法將其轉換爲雙打,因爲我需要得到絕對準確的結果而沒有任何不準確。
那麼,我該如何檢查它?
我有:檢查是否在矩形的點
以上所有物件由指定整數座標。
我需要檢查時,如果交叉甲和乙的結果是- [R。但我不能只計算穿越A和B的結果,因爲它在整數座標中可能是不可預測的。此外,我無法將其轉換爲雙打,因爲我需要得到絕對準確的結果而沒有任何不準確。
那麼,我該如何檢查它?
如果直線由整數座標指定,那麼它們的交點具有合理的座標,這可以與絕對精度進行比較。讓我們通過點(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
[讓我們忽略不感興趣的情況下,當B不相交R]
ř切斷從B中的段,讓我們稱它爲S.當且僅當A穿過S時,B和A的交點位於R內。
S的查找點很簡單。
要檢查一條線是否穿過線段,您應該檢查S的末端是否位於A的不同側 - 這可以通過帶符號的角度進行檢查。
假設A上的2個點是(x0, y0)
和(x1, y1)
,'x0 < x1'。
該矩形由一個確定的x座標和xR
y座標yR
在B線由確定x座標xB
你正在尋找的點是(xB, yB)
,其中yB
爲以某種方式確定,僅操縱整數:所以第一
,您需要檢查
xB * xR >= 0
(的同一側x座標)abs(xB) <= abs(xR)
(B線切矩形)如果它的確定,那麼你就需要檢查這個整數(等於(X1-X0)YB)
Y = (y1-y0)(xB-x0)+(x1-x0)y0
驗證
Y * yR >=0
(的y座標的相同側)abs(Y) <= (x1-x0) * abs(yR)
(也就是說你的交叉點是關於其y座標的區R)你的觀點是在'r當且僅當了4個條件是真實的。 希望它有幫助。
爲什麼你認爲使用'double'將比使用整數更精確? – Alnitak
交叉點的y座標是一個有理數,所以你想要做什麼。請注意,您只需檢查y座標,因爲B是否與R相交足以檢查x座標。潛在的問題是整數溢出。 –