0

Windowsフォーム環境でシェイプを作成できるプロジェクトを行っています。現時点では、Circle1 と Rectangle1 という 2 つの異なる形状があります。これらは、似たようなプロパティを持っていると呼ばれるものです。

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> =  []

そして、ヒットテストを使用して、ユーザーがシェイプにヒットしたかどうかを判断します。

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

この問題に取り組む方法を知っている人はいますか? 率直に言って、私は迷っています。

4

3 に答える 3

3

ヒット テスト機能に基づいてRectangleList、画面に表示される順序とは逆の順序で四角形を格納しているようです (最初の四角形が最初にヒット テストされるため、一番上の四角形になります)。図)。

その場合、長方形を一番上に持ってきたい場合は、リストの先頭に移動するだけです。最初に指定された値で新しいリストを作成し、次を使用して残りのリストから値を削除できますfilter

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

関数はリストのみで機能するため、整数を使用した例を次に示します。

BringToFront 3 [ 1;2;3;4 ] = [3;1;2;4]
于 2013-01-05T22:17:32.803 に答える
2

Wmeyer と Tomas の回答は、比較的小さな長方形のセットに対する要求をうまく満たしています。10^3 以上の長方形を使用し、GUI を開始する前にそれらの座標を知っている場合は、ここにリンクの説明を入力する単純な静的構造があります。より複雑なケースでは、Hanan Samet による「The Design And Analysis Of Spatial Data Structures」の第 3 章が最適です。

于 2013-01-07T16:15:48.603 に答える
1

基本的な考え方:クラスにz座標を追加できます。Rectangle1四角形がヒットしたとき、それが最高z値を取得することを確認してください。四角形を描画する前に、それらが昇順で並べ替えられていることを確認してzください。

于 2013-01-05T19:49:27.977 に答える