Vb.net 确定哪些对象位于选择矩形(选框)内

Vb.net 确定哪些对象位于选择矩形(选框)内,vb.net,selection,marquee,Vb.net,Selection,Marquee,我正在编写一个程序,它(除其他外)为用户提供了一个类似IDE的环境,用户可以使用矩形选择工具选择一个或多个对象 所有选择将是一个简单的矩形,所有可选择的对象也将是简单的矩形 我已经有了可视化创建橡皮筋效果的代码(VB.Net)——我需要的是一个高效的算法,可以告诉我哪些对象在最终选择矩形中至少有一部分区域 如果它有助于可视化,我想做的就是在Windows桌面上的图标上拖动一个选择框。。。无论哪个图标的区域中哪怕有一部分位于该选择框内,都会高亮显示(选中) 任何帮助都将不胜感激。。。提前感谢正如B

我正在编写一个程序,它(除其他外)为用户提供了一个类似IDE的环境,用户可以使用矩形选择工具选择一个或多个对象

所有选择将是一个简单的矩形,所有可选择的对象也将是简单的矩形

我已经有了可视化创建橡皮筋效果的代码(VB.Net)——我需要的是一个高效的算法,可以告诉我哪些对象在最终选择矩形中至少有一部分区域

如果它有助于可视化,我想做的就是在Windows桌面上的图标上拖动一个选择框。。。无论哪个图标的区域中哪怕有一部分位于该选择框内,都会高亮显示(选中)

任何帮助都将不胜感激。。。提前感谢

正如BigFunger已经提到的那样。但是,您也应该检查一个矩形是否与另一个矩形相交(只检查相交)

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

Debug.Print(Rect1.IntersectsWith(Rect2))
一个小的示例表单演示了这一点:

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

更新:将此代码更改为1。首先检查两个方向和2。对您来说更重要的是:还检查一个矩形是否不仅与另一个矩形相交,而且还检查它是否包含另一个矩形。

这不会检查一个矩形是否包含另一个矩形。/facepalm感谢您捕捉到这一点!