Определение объектов, попадающих в прямоугольник выбора (выделение) - PullRequest
1 голос
/ 10 ноября 2010

Я пишу программу, которая (помимо прочего) обеспечивает IDE-подобную среду для пользователя, где он может выбрать один или несколько объектов с помощью инструмента выбора прямоугольника.

Все выделенные объекты будут простым прямоугольником, а все выбираемые объекты также будут простыми прямоугольниками.

У меня уже есть код (VB.Net) для визуального создания эффекта резиновых полос - мне нужен эффективный алгоритм, который скажет мне, какие объекты имеют хотя бы часть своей площади в конечном прямоугольнике выбора.

Если это поможет визуализировать, то, что я хочу сделать, было бы идентично перетаскиванию поля выбора над значками на рабочем столе Windows ... какие бы значки ни с какой частью их областей, расположенных в пределах этого выделения, выделяются (выбирается) .

Буду признателен за любую помощь ... заранее спасибо

Ответы [ 2 ]

0 голосов
/ 11 ноября 2010

IntersectsWith работает, как уже упоминал BigFunger. Но дополнительно вы должны проверить, содержит ли прямоугольник другой прямоугольник (intersectsWith проверяет только пересечение).

Небольшой образец формы, который демонстрирует это:

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. и более важно для вас: проверяет также, пересекает ли один прямоугольник не только другой, но и дополнительно, если он содержит другой.

0 голосов
/ 11 ноября 2010
Dim Rect1 As New Rectangle(10, 10, 20, 20)
Dim Rect2 As New Rectangle(5, 5, 20, 20)

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