2010-08-17 68 views
1

如何獲得使用較小網格塊形成的輪廓形狀的座標。查找網格對齊方塊聯合的輪廓

例如,如果我使用32x32單位塊來構造形狀(任何形狀)。 那麼我怎樣才能得到形狀的整體座標,包括消極的空間。

例如: 人們可以安排這樣的塊: (每塊32×32和座標參考塊的左下角)

Block 1 - (0,0) 
BLock 2 - (32,0) 
Block 3 - 64,0) 
Block 4 - (64,32) 
Block 5 - (64, 64) 
BLock 6 - (32, 64) 
BLock 6 - (0 64) 
Block 7 - (0, 32) 

現在你可以看到這將創建一個空的空間在中間。

所以我想知道的是,如何讓上述形狀的座標是什麼,這樣我得到:

Main Block = (0,0), (96,0), (0,96) 
Empty space = (32,32), (64,32), (64,64), (32,64) 

有任何數學解決這個?

最終我會做複雜的形狀。

感謝

********編輯**** 嗨,

如何應對這種情況?

<------------------^<----^ 
|     || | 
V------------------>| | 
<------^   /^| | 
|  |<------^/|| | 
|  ||  |/ || | 
V------>V------>V-->V----> 

我想結果是這樣

<-------------------<----^ 
|      | 
V  ^----------->  | 
|  |  / | 
|  <-------^/  | 
|    |/  | 
V------>------->--->-----> 
+0

你想看看集合論。 – leppie 2010-08-17 10:17:11

回答

2

將每個方形看作由四個向量逆時針鏈組成的大綱。

<-----^ 
|  | 
|  | 
V-----> 

因此,對於您的形狀中的所有正方形,請使用它們的輪廓矢量的聯合。如果聯合中的兩個輪廓矢量是相同的,但方向相反,則它們相互抵消並從聯合中移除。

例如,對於兩個正方形是並排的聯合是8個矢量

<-----^<-----^ 
|  ||  | 
|  ||  | 
V----->V-----> 

其減少至6個載體,因爲在中間的兩個垂直矢量取消:

​​

對於你給的例子,結果是(取消後):

<-----<-----<-----^ 
|     | 
|     | 
V  ^-----> ^
|  |  |  | 
|  |  |  | 
V  <-----V ^
|     | 
|     | 
V----->----->-----> 

Yo你只需要連接最終簡化聯盟中的向量來讀取輪廓路徑。請注意,內部輪廓(「孔」)順時針旋轉。

+0

嗨, 聽起來很有希望。 基本上我試圖用PHP數組來做到這一點。 我還沒有找到一個好的PHP的矢量類。 btw。任何想法如何識別順時針方向的閉環並將它們從逆時針環路中分離出來? – ssdesign 2010-08-18 02:57:17

+0

這個邏輯即使是奇怪的形狀也能工作嗎?例如。如果第二個形狀是矩形(第一個方形的高度的一半),該怎麼辦? – ssdesign 2010-08-18 07:08:00

+0

@ssdesign,你並不需要一個Vector類,只是指示開始點和結束點,或者開始點+方向+長度。您可以在StackOverflow中搜索區分順時針和逆時針的測試。至於奇怪的形狀,我猜你可以有矢量部分取消彼此 - 所以1.0up + 0.5down = 0.5up。 – brainjam 2010-08-18 14:59:37