Для примера, самый простой переход из точки в точку (от одной точки по первому клику мыши по форме, до второй – по второму клику)
- Код: Выделить всё
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Class Form1
Inherits Form
Dim i As Byte = 0
Dim apt(1) As Point
Shared Sub Main()
Application.Run(New Form1)
End Sub
Sub New()
ForeColor = SystemColors.WindowText
End Sub
Protected Overrides Sub OnMouseClick(ByVal mea As MouseEventArgs)
If i < apt.Length() Then
apt(i) = mea.Location
i += 1
If i = apt.Length() Then Invalidate()
End If
End Sub
Protected Overrides Sub OnPaint(ByVal pea As PaintEventArgs)
MyBase.OnPaint(pea)
If (i >= apt.Length()) Then
Dim grfx As Graphics = pea.Graphics
grfx.DrawLine(New Pen(ForeColor), apt(0), apt(1))
i = 0
End If
End Sub
End Class
Для централизации двух точек код преобразуется на такой
- Код: Выделить всё
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Class Form1
Inherits Form
Dim i As Byte = 0
Dim apt(1) As Point
Dim dX, dY As Integer
Shared Sub Main()
Application.Run(New Form1)
End Sub
Sub New()
dX = Me.ClientSize.Width / 5
dY = Me.ClientSize.Height / 5
ForeColor = SystemColors.WindowText
End Sub
Protected Overrides Sub OnMouseClick(ByVal mea As MouseEventArgs)
If i < apt.Length() Then
For iD As Integer = 0 To Me.ClientSize.Width Step dX
If (iD <= mea.Location.X) And (mea.Location.X < iD + dX) Then
apt(i).X = iD + dX / 2
iD = Me.ClientSize.Width 'break
End If
Next iD
For iD As Integer = 0 To Me.ClientSize.Height Step dY
If (iD <= mea.Location.Y) And (mea.Location.Y < iD + dY) Then
apt(i).Y = iD + dY / 2
iD = Me.ClientSize.Height 'break
End If
Next iD
i += 1
If i = apt.Length() Then Invalidate()
End If
End Sub
Protected Overrides Sub OnPaint(ByVal pea As PaintEventArgs)
Dim grfx As Graphics = pea.Graphics
If (i >= apt.Length()) Then
grfx.DrawLine(New Pen(ForeColor), apt(0), apt(1))
i = 0
End If
For iD As Integer = 0 To Me.ClientSize.Width Step dX
grfx.DrawLine(New Pen(ForeColor), New Point(iD, 0), New Point(iD, Me.ClientSize.Height))
Next iD
For iD As Integer = 0 To Me.ClientSize.Height Step dY
grfx.DrawLine(New Pen(ForeColor), New Point(0, iD), New Point(Me.ClientSize.Width, iD))
Next iD
End Sub
End Class
Переходы вертикальные, горизонтальные и диагональные всегда будут проходить через центр. В других случаях (из прямоугольников на разных прямых) этого не будет(см. скрин ).
Вопрос, от какого алгоритма отталкиваться для достижения цели (в случаи примера, дабы проход был как показывает красная линия)? Пока обдумываю работу с массивами точек клиентской области.
Кроме того, планирую добавить возможность ветвление, если прямоугольник помечен как занятый, его надо будет обходить. А если таких будет несколько, и к конечной точке не добраться, то тогда конечной должен стать ближайший по направлению к ней.
Спасибо.