2012-07-26 66 views
1

我想寫一個應用程序來繪製包含矩形,線條和圓形的示意圖。現在我想添加另一個功能來將矩形拖到不同的位置。我面臨的問題是檢測我是否在矩形內點擊過。我知道有一個功能,如Rectangle.Contains(Point)。要使用這種方法,我需要使用for循環來檢查每個矩形。如果我有大量的矩形存在,那麼使用這種方法並不明智。有沒有其他的方式來完成這項任務。如何檢測我的鼠標位置是否在矩形c#內?

回答

0

我會將顯示區域劃分爲象限。 然後將矩形放置到左上角,右上角,左下角,右下角的網格中。 放置它們意味着,爲每個象限創建一個列表,並在其中放置矩形。

點擊該點後,確定它屬於哪個區域並僅在那些矩形中搜索。這種方法將您的線性搜索減少了4倍。

請記住,您還需要注意重疊的地方可以屬於許多矩形。這裏矩形的z順序很重要。因此,雖然列表是爲象限維護的,但它應該按z順序作爲關鍵字進行排序。

希望這會有所幫助。

3

你需要計算機圖形學教科書,經常討論這個和類似的問題。

如果記憶爲我服務,請確保該點位於矩形的頂部邊緣之下,底部邊緣之上,左邊緣的左邊緣和左邊緣的右邊之上。

關於測試循環中的一串矩形。考慮讓每個矩形都有一個圓圈,一個邊界圓。首先測試該點是否遠離圓的起點,而不是圓的半徑。如果是這樣,則不需要測試矩形,它是一個小姐。好的,那是一個非常理論上的答案。實際上,計算從點到原點的距離可能是一個非常昂貴的計算,它涉及平方根,所以在矩形檢查中進行四點比較可能會更快。再次,如果內存服務器我,我們並不在乎距離原點的距離只有大於半徑。所以只需部分執行距離計算,省略最終的平方根,然後與半徑的平方進行比較。當然,您仍然需要進行實驗和配置文件,以確保此邊界圓檢查比矩形檢查中的常規點更快,您需要確保您有足夠的失誤來抵消最終會做的點擊邊界圓和矩形都檢查。

0

可能是這樣的嗎?

public bool isRectangelContainPoint(RectangleF rec, PointF pt) 
    { 
     if (pt.X >= rec.Left && pt.X <= rec.Right && pt.Y <= rec.Bottom && pt.Y >= rec.Top) 
      return true; 
     else 
      return false; 
    } 
0

您需要使用空間索引快速查找鼠標所在的矩形。我建議一個R樹,這裏的理論框架部分:

http://en.wikipedia.org/wiki/R-tree

和C#,執行:

http://sourceforge.net/projects/cspatialindexrt/

創建rtee,添加矩形,然後調用rtree.nearest方法用鼠標座標來知道包含鼠標光標的矩形。您可以使用距離參數進行遊戲。

希望它能幫助,

鞍本Panglose。

相關問題