2009-08-01 91 views
1

我有4個點形成一些四邊形。線條不能交叉或類似的東西,它應該是正方形,矩形,菱形,平行四邊形等。找到哪個區域包含基於座標的點

連接它們的線將該字段分成9個區域。有了正方形,它看起來就像是一個井字棋板(#),但是其他形狀的線條將會成角度。

一個點隨機地落入這個9區的字段。我知道隨機點的座標以及四邊形四角的座標。

有沒有什麼辦法可以找到哪個字段包含點而不使用線條方程

我基本上尋找類似

if(p.x > q1.x && p.x < q4.x && p.y < q3.y) { 
    //It's in the top left region 
} 
etc 

我在想,這用斜線(而不是正方形/長方形)不解決線方程時是不可能的。但我認爲我會先由數學家來運行它。謝謝!

回答

2

你所做的任何事情都是「使用線的方程式」,所以我不知道該怎麼做。我假設你只想簡單的不平等來檢查隨機點(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=0dx-cy=da-bc,所以三種可能性,這取決於如何dx-cy比較0da-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-cb0之間」,而「大於0」。最後,如果平等永遠成立,那麼點(x,y)實際上是其中一行,而不是其中一個區域。

+1

如果您不想測試'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

+0

謝謝,這真棒。對於提出梯形區域的意見,你怎麼看?就像我在那裏說的那樣,我想將外部點映射到形狀邊緣上的最佳點(我認爲這是*最接近*)點。由於梯形,我不認爲這種井字遊戲方法可行。我想我會檢查它是否是梯形,然後有其他一些行爲......有更好的方法可以做到嗎?我認爲這個「最接近的觀點」的想法可能是要走的路,所以我會考慮一下。 – cksubs 2009-08-02 22:40:42

+1

爲了找到形狀邊緣上的*最接近的點,我沒有看到如何確定井字板的區域可以幫助您。我現在唯一能想到的方法是爲每個形狀邊緣生成一個候選對象(特定邊緣上的最接近的點是點到點的投影或兩個端點中的一個),然後檢查四個候選人中哪一個最近。如果您真的想要考慮這個問題,我建議您瞭解點積(http://en.wikipedia.org/wiki/Dot_product),特別是標量投影。 – 2009-08-02 23:20:38

4

它可能等同於'使用線的方程',但顯而易見的事情是計算仿射變換,它將四個點指向單位平方(0,0),(0,1) ,(1,0),(1,1)。要確定一個點的位置,將變換應用到該點並將結果與​​單位平方進行比較。

+0

嗯...聽起來很複雜:) 我正在這樣做,以便更容易使一些條件如原來的問題。做一個正方形或矩形是微不足道的,我的代碼被設置爲接受這個,所以我寧願有類似的東西。 我明白如何使用線的方程來確定區域,但我將不得不做一些計算等,它不會像它是一個正方形一樣整齊。我即將這樣做,除非任何人有更好的建議。 那麼這個東西,我可以簡單/容易/整齊地計算?如果不是的話,我可能只是用線。儘管非常感謝。 – cksubs 2009-08-01 01:15:55

+0

不那麼複雜......第四點由其他3決定,現在假定一點是(0,0)。其他2點是(a,b)和(c,d)。因此,變換如下: 因此,比較這些值爲0和() 1.爲了允許點(p,q)而不是(0,0),只需計算: (x,y) - >(D(bx-ay) - p,D(cy-dx) - q – 2009-08-01 01:50:33

+0

(當計算(pq)!=(0,0)時,相對於p調整a,b,c,d,q – 2009-08-01 01:51:56

1

連接它們的線將該字段分成9個區域。有了正方形,它看起來就像是一個井字棋板(#),但是其他形狀的線條將會成角度。

如果你的點組成一個梯形(或梯形),該怎麼辦?例如,如果點是(-2,0),(2,0),(-1,1),(1,1),則'線......在角'處將相交併且目前還不清楚其中的「9個區」,你會想,說,(0,10)是在:

http://imgur.com/NaGwJ.png

(請原諒我畫圖的技能...)

除非「線不能交叉或類似的東西」,你的意思是四邊形總是一個平行四邊形?

+0

嗯,你說得對。我的意思是「行不能跨越」,你不能得到一個沙漏形狀的圖形,但這使事情變得複雜。該死的......我需要知道的是如何正確地將區域外的點映射到區域邊緣上的點。有9個井字遊戲區域很容易......如果它位於其中一個角落區域,請將其設置爲該形狀的角落。否則,將其設置爲形狀邊緣上的某個點。但有了這個新的信息,藍色的點可以在左邊,頂部或中心邊緣,或者在任何一個頂角。我需要更好地考慮這個...... – cksubs 2009-08-02 22:36:33

+0

@cksubs:還要注意,如果你在兩個水平的紅線之間選擇一個點,它的右邊是* way * off,那麼邊界上*最接近的*點就是低點即使點不在右下角區域。這些地區沒有做你想做的事。 – 2009-08-02 23:27:14