2010-11-10 36 views
1

我正在編寫一個程序(其中包括)爲用戶提供類似IDE的環境,以便用戶可以使用一個矩形選擇工具選擇一個或多個對象。確定哪些對象屬於選擇矩形(選取框)

所有選擇將是一個簡單的矩形,所有可選擇的對象也將是簡單的矩形。

我已經有代碼(VB.Net)以可視方式創建橡皮帶效果 - 我需要的是一種高效算法,它將告訴我哪些對象在最終選擇矩形內至少有一部分區域。

如果它有助於形象化,我想要做的事情與將選擇框拖到Windows桌面上的圖標上相同......無論哪個圖標的某些部分位於該選擇框內的區域都突出顯示(選中)。

任何幫助,將不勝感激...謝謝你提前

回答

0
Dim Rect1 As New Rectangle(10, 10, 20, 20) 
Dim Rect2 As New Rectangle(5, 5, 20, 20) 

Debug.Print(Rect1.IntersectsWith(Rect2)) 
+0

這並不檢查一個矩形是否包含另一個矩形。 – 2010-11-10 22:01:57

+0

/facepalm 感謝您的支持! – BigFunger 2010-11-10 22:40:31

0

IntersectsWith作品BigFunger已經提到。但是,從理論上講,您應該檢查矩形contains是否有另一個矩形(相交只有交叉點檢查)。

一個小樣本的形式,演示了它:

Public Class SelectionRectangle 
    Private first As Point 
    Private allRectangles As New List(Of RectangleF) 

    Private Sub form_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseDown 
     first = New Point(e.X, e.Y) 
    End Sub 

    Private Sub form_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseUp 
     Dim p As New Pen(Brushes.Black, 2) 
     Dim g As Graphics 
     Dim second As New Point(e.X, e.Y) 
     Dim x, y, w, h As Int32 
     x = DirectCast(IIf(first.X > second.X, second.X, first.X), Int32) 
     y = DirectCast(IIf(first.Y > second.Y, second.Y, first.Y), Int32) 
     w = Math.Abs(second.X - first.X) 
     h = Math.Abs(second.Y - first.Y) 
     Dim nextRec As New RectangleF(x, y, w, h) 
     Dim intersects As Boolean = False 
     For Each rec As RectangleF In allRectangles 
      If rec.Contains(nextRec) OrElse rec.IntersectsWith(nextRec) Then 
       intersects = True 
       Exit For 
      End If 
     Next 
     If Not intersects Then 
      p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot 
      g = Me.CreateGraphics() 
      g.DrawLine(p, first.X, first.Y, second.X, first.Y) 
      g.DrawLine(p, second.X, second.Y, first.X, second.Y) 
      g.DrawLine(p, first.X, first.Y, first.X, second.Y) 
      g.DrawLine(p, second.X, second.Y, second.X, first.Y) 
      allRectangles.Add(nextRec) 
     Else 
      Beep() 
     End If 
    End Sub 
End Class 

UPDATE:改變了這種代碼1.首先檢查在兩個方向和2,更重要的是你:檢查還如果不是矩形只與另一個相交,但另外如果它包含另一個