2009-02-22 66 views
2

我有一塊板作爲畫布,其上繪製了幾個形狀,其中一些是三角形,圓形,矩形,但都包含在它們自己的定界矩形內。處理板上形狀的選擇

「的圓圈將是一個矩形內」

我把兩個圓圈A,B上的板,其中A是通過B和具有一定的區域發生碰撞。 如果我點擊與容器盒相對應的區域,但不是實際的A圓形區域,我不會選擇A圓圈,但是這會阻止我選擇B,因爲我的容器重疊並且位於B之一。

在事件基本框架中,子事件將轉到父母,而不是我猜測的兄弟姐妹。

所以我的選擇是檢查所有形狀的容器,它們在z點排序的點x有一些區域。然後爲每個容器檢查它內部的形狀是否碰撞。

它似乎不是很高效,但有沒有其他方法?

--------- 
| -------- 
| |  | 
-----|  | 
    -------- 

回答

1

您正在處理它以及它可以被處理 - 窗口系統通常服從Z順序(圖層)。

無論如何,從長遠來看,這樣會更好,尤其是如果您希望能夠通過在其周圍繪製選擇框來選擇多個項目。

有一些算法可以通過將矩形轉換爲x和y軸上的2d表示來查找矩形是否重疊。你可以做同樣的事情,然後比較你的觀點,看看哪些對象的點重合:

Algorithm to detect intersection of two rectangles?

只是把你的點選擇(或矩形選擇,如果你畫一個邊界框來選擇多個項目)作爲另一個矩形將與其他矩形進行比較。

-Adam

0

如果你真的需要速度,你可以玩一些技巧。例如:

  • 如果您正在使用較深的托盤,則可以使用顏色的低位來標記對象。然後偷看像素會給你提供對象,或者至少可以快速剔除列表。
  • 即使在低比特深度,如果對象都是單色,你可以使用全綵
  • 如果在足夠低的分辨率是可以保持一個數組,說什麼對象擁有什麼像素。
  • 在更高的水庫,你可以做相同的,但使用RLE保持尺寸減小(也看成了四棵)
  • ,...等

如果只是簡單的實現你後,一個快速的技巧是記錄X,重新繪製屏幕,​​並注意哪個對象描繪了該像素。

- MarkusQ