2013-01-05 69 views
0

我正在做一個項目,您應該可以在Windows窗體環境中創建形狀。我目前有兩種不同的形狀,稱爲Circle1和Rectangle1,它們正是它們所稱的具有類似的屬性。將圖形帶到前面F#

type Rectangle1(x:int, y:int,brush1)= 
    let mutable thisx = x 
    let mutable thisy = y 
    let mutable thiswidth = 50 
    let mutable thisheight = 20 
    let mutable brush = brush1 
    member obj.x with get() = thisx and set x = thisx <- x 
    member oby.y with get() = thisy and set y = thisy <- y 
    member obj.brush1 with get() = brush and set brush1 = brush <- brush1 
    member obj.width with get() = thiswidth and set width = thiswidth <- width 
    member obj.height with get() = thisheight and set height = thisheight <- height 
    member obj.draw(g:Graphics) = g.FillRectangle(brush,thisx,thisy,thiswidth,thisheight) 

這個矩形是可點擊和移動的,但我遇到了一個問題。我需要一些類似於c#bringToFront()方法的方法。所以當我點擊一個形狀時,我的形狀就會轉到所有其他形狀的前面。

我的存儲列表如下:

let mutable RectangleList:List<Rectangle1> = [] 

我用一則hitTest來確定用戶是否擊中的形狀或不:

let rec VilketObjRec (e:MouseEventArgs) (inputlist:List<Rectangle1>) = 
match inputlist with 
    |[] -> None 
    |head::tail -> if (((e.X >= head.x) && (e.X <= (head.x + head.width))) && (e.Y >= head.y) && (e.Y <= (head.y+head.height))) 
         then Some(head) else VilketObjRec e tail 

任何人有什麼樣的想法,如何解決這個問題?坦率地說,我迷路了。

回答

1

基本思路:您可以添加一個z座標到Rectangle1類。當一個矩形被擊中時,確保它獲得最高值z值。繪製矩形之前,請確保按照升序z的值排序。

3

基於命中測試功能,看來你RectangleList商店比它們出現在屏幕上的順序顛倒順序的矩形(在開始的矩形被擊中首先測試,因此這將是一個在圖的頂部)。

在這種情況下,如果要將矩形放在頂部,只需將其移至列表的開頭。您可以創建一個新的列表與年初指定的值,然後從列表的其餘部分刪除值使用filter

let BringToFront value list = 
    value :: (List.filter (fun v -> v <> value) list) 

功能的工作原理ANLY名單上,所以這裏使用整數的例子:

BringToFront 3 [ 1;2;3;4 ] = [3;1;2;4] 
2

Wmeyer's和Tomas的答案很好地滿足您對相對較小的一組矩形的要求。如果您將使用10^3或更多的矩形,並且在GUI啓動之前知道它們的座標,則有簡單的靜態結構enter link description here。在更復雜的情況下,Hanan Samet的「空間數據結構的設計和分析」第3章是您最好的朋友。