你所做的任何事情都是「使用線的方程式」,所以我不知道該怎麼做。我假設你只想簡單的不平等來檢查隨機點(x,y)
在哪個區域,所以這就是我將告訴你如何去做的。
從你的問題,這聽起來像你總是有一個平行四邊形,所以讓我們假設點(0,0)
,(a,b)
,(c,d)
,並(a+c,b+d)
,這使得解釋更容易一些跟隨。爲了修復你的心理圖片,想象一下(a,b)
大致在(0,0)
的「右邊」,(c,d)
大致在「上面」(0,0)
。那麼對於「水平」線方程是-bx+ay=0
和-bx+ay=-bc+ad
,讓你獲得三種可能性,這取決於如何-bx+cy
比較0
和-bc+ad
:
// Assuming -bc+ad is positive
-bx+ay < 0 // it's in the "bottom row"
0 < -bx+ay < -bc+ad // it's in the "middle row"
-bc+ad < -bx+ay // it's in the "top row"
同樣,對於「垂直」線方程是dx-cy=0
和dx-cy=da-bc
,所以三種可能性,這取決於如何dx-cy
比較0
和da-cb
:
// Still assuming ad-bc is positive
dx-cy < 0 // it's in the "left column"
0 < dx-cy < da-cb // it's in the "middle column"
da-cb < dx-cy // it's in the "right column"
當然,如果da-cb
爲負值,則每種情況下的三種可能性均爲「小於da-cb
」,「在da-cb
和0
之間」,而「大於0
」。最後,如果平等永遠成立,那麼點(x,y)
實際上是在其中一行,而不是其中一個區域。
如果您不想測試'da-cb'是正值還是負值,則你可以總是說'if(dx-cy <0 && dx-cy 0 && dx-cy> da-cb){right column} else {middle column} '和類似的東西來確定它是哪一行。注意,如果'(a,b)'不是「(0,0)」的右邊,並且「(c,d)」不是在「(0,0)」上方,「頂部」,「底部」,「左側」,「右側」這些術語開始混亂起來,因爲您的井字板翻轉和/或旋轉。仍然告訴區域相隔很好,但t的名字他的地區不再合適。 –
2009-08-01 06:02:25
謝謝,這真棒。對於提出梯形區域的意見,你怎麼看?就像我在那裏說的那樣,我想將外部點映射到形狀邊緣上的最佳點(我認爲這是*最接近*)點。由於梯形,我不認爲這種井字遊戲方法可行。我想我會檢查它是否是梯形,然後有其他一些行爲......有更好的方法可以做到嗎?我認爲這個「最接近的觀點」的想法可能是要走的路,所以我會考慮一下。 – cksubs 2009-08-02 22:40:42
爲了找到形狀邊緣上的*最接近的點,我沒有看到如何確定井字板的區域可以幫助您。我現在唯一能想到的方法是爲每個形狀邊緣生成一個候選對象(特定邊緣上的最接近的點是點到點的投影或兩個端點中的一個),然後檢查四個候選人中哪一個最近。如果您真的想要考慮這個問題,我建議您瞭解點積(http://en.wikipedia.org/wiki/Dot_product),特別是標量投影。 – 2009-08-02 23:20:38