Guten Tag^^
Da ich hier schon öfters "systeme zum bewegen von objekten zwischen zwei punkten" gesehen habe möchte ich euch nun meins vorstellen.
Alles basiert auf der Pfad-Klasse, sie enthält Ziel- und Ausgangspunkt, die Geschwindigkeit (pixel/step) und eine funktion (getStepArray as point() ) die einen Array aller punkte zwischen den beiden Hauptpunkten wiedergibt...
Spoiler anzeigen
Um die Funktion der Klasse gleich zeigen zu können, hier der code, der in die Form1 eines Standart VB Projects gehört. Es sollte dann sofort lauffähig sein.
Zu verwenen sind dann: Mausklicks rechts und links auf die form und das bewegen der Maus bei gedrückter linker maustaste. viel spass beim probieren^^
Spoiler anzeigen
Da ich hier schon öfters "systeme zum bewegen von objekten zwischen zwei punkten" gesehen habe möchte ich euch nun meins vorstellen.
Alles basiert auf der Pfad-Klasse, sie enthält Ziel- und Ausgangspunkt, die Geschwindigkeit (pixel/step) und eine funktion (getStepArray as point() ) die einen Array aller punkte zwischen den beiden Hauptpunkten wiedergibt...
VB.NET-Quellcode
- Public Class Pfad
- Sub New()
- End Sub
- Sub New(ByVal P1 As Point, ByVal P2 As Point)
- AusgangsPunkt = P1
- ZielPunkt = P2
- End Sub
- Dim _AusgangsPunkt As Point = New Point(0, 0)
- Dim _ZielPunkt As Point = New Point(0, 0)
- Dim _PixelPerStep As Decimal = 10
- Dim deltaX As Integer = 0 'Unterschied der X-komponente von Ausgangspunkt und Zielpunkt
- Dim deltaY As Integer = 0 'Unterschied der Y-komponente von Ausgangspunkt und Zielpunkt
- Dim Weglänge As Double = 0
- Public Function GetPixelPerStep(ByVal _steps As Integer) As Decimal
- Dim PPS As Decimal = CDec(Weglänge / _steps)
- Return PPS
- End Function 'Gibt die anzahl der PixelPerStep in abhängigkeit der anzahl der stücke in die die linie unterteilt wird zurück
- Public Function GetSteps() As Integer
- Return CInt(Weglänge / PixelPerStep)
- End Function 'gibt die stücke-anzahl zurück
- Public Property PixelPerStep() As Decimal
- Get
- Return _PixelPerStep
- End Get
- Set(ByVal value As Decimal)
- _PixelPerStep = value
- End Set
- End Property
- Public Property AusgangsPunkt() As Point
- Get
- Return _AusgangsPunkt
- End Get
- Set(ByVal value As Point)
- _AusgangsPunkt = value
- deltaX = ZielPunkt.X - AusgangsPunkt.X
- deltaY = ZielPunkt.Y - AusgangsPunkt.Y
- Weglänge = Math.Sqrt(deltaX * deltaX + deltaY * deltaY) 'Satz des Pythagoras
- End Set
- End Property
- Public Property ZielPunkt() As Point
- Get
- Return _ZielPunkt
- End Get
- Set(ByVal value As Point)
- _ZielPunkt = value
- deltaX = ZielPunkt.X - AusgangsPunkt.X
- deltaY = ZielPunkt.Y - AusgangsPunkt.Y
- Weglänge = Math.Sqrt(deltaX * deltaX + deltaY * deltaY) 'Satz des Pythagoras
- End Set
- End Property
- Public Function GetStepArray() As Point()
- Dim Steps As Integer = GetSteps()
- Dim tmp(Steps) As Point
- If Steps > 0 Then
- Dim StepLengthX As Double = deltaX / Steps
- Dim StepLengthY As Double = deltaY / Steps
- Dim newLoc As Point = New Point(0, 0)
- For i = 0 To Steps
- newLoc = New Point(CInt(_AusgangsPunkt.X + i * StepLengthX), CInt(_AusgangsPunkt.Y + i * StepLengthY))
- tmp(i) = newLoc
- Next
- End If
- Return tmp.ToArray
- End Function 'Erstellt einen Array mit allen positionen zwischen Start und Zielpunkt
- End Class
Um die Funktion der Klasse gleich zeigen zu können, hier der code, der in die Form1 eines Standart VB Projects gehört. Es sollte dann sofort lauffähig sein.
Zu verwenen sind dann: Mausklicks rechts und links auf die form und das bewegen der Maus bei gedrückter linker maustaste. viel spass beim probieren^^
VB.NET-Quellcode
- Public Class Form1
- Dim P1 As Point = New Point(50, 500)
- Dim P2 As Point = New Point(800, 200)
- Dim SinglePfad As New Pfad
- Friend WithEvents Timer1 As New Timer
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Me.Size = New Size(1000, 800)
- Me.DoubleBuffered = True
- Timer1.Interval = 10
- Timer1.Start()
- End Sub
- Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
- setSinglePfad(e.Button, e.Location)
- Me.Invalidate()
- End Sub
- Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
- If e.Button = Windows.Forms.MouseButtons.Left Then
- setSinglePfad(e.Button, e.Location)
- Me.Invalidate()
- End If
- End Sub
- Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
- If P1 <> Nothing Then
- e.Graphics.DrawEllipse(New Pen(Color.Red, 3), P1.X - 10, P1.Y - 10, 20, 20)
- End If
- If P2 <> Nothing Then
- e.Graphics.DrawEllipse(New Pen(Color.Blue, 3), P2.X - 10, P2.Y - 10, 20, 20)
- End If
- If P1 <> Nothing And P2 <> Nothing Then
- SinglePfad.AusgangsPunkt = P1
- SinglePfad.ZielPunkt = P2
- Dim StepArray() As Point = SinglePfad.GetStepArray
- For i = 0 To StepArray.Count - 1
- Dim loc As Point = StepArray(i)
- e.Graphics.DrawEllipse(New Pen(Color.Gray, 2), loc.X - 5, loc.Y - 5, 10, 10)
- Next
- End If
- If ObjektLoc <> Nothing Then
- e.Graphics.DrawRectangle(New Pen(Color.Green, 4), ObjektLoc.X - 15, ObjektLoc.Y - 15, 30, 30)
- End If
- End Sub
- 'Private Sub cPPS_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) handles NumericUpDown1.changevalue
- ' SinglePfad.PixelPerStep = CInt(cPPS.Value)
- ' Me.Invalidate()
- 'End Sub
- Sub setSinglePfad(ByVal _button As MouseButtons, ByVal pos As Point)
- If _button = Windows.Forms.MouseButtons.Right Then
- P1 = Nothing
- P2 = Nothing
- End If
- If _button = Windows.Forms.MouseButtons.Left Then
- If P1 = Nothing Then
- P1 = pos
- Else
- P2 = pos
- End If
- End If
- End Sub
- Dim tmpStep As Integer = 0
- Dim ObjektLoc As Point = Nothing
- Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
- Me.Invalidate(New Region(New Rectangle(ObjektLoc.X - 20, ObjektLoc.Y - 20, 40, 40)))
- If P1 <> Nothing And P2 <> Nothing Then
- tmpStep += 1
- Dim StepArray() As Point = SinglePfad.GetStepArray
- If tmpStep <= StepArray.Count - 1 Then
- ObjektLoc = StepArray(tmpStep)
- Else
- tmpStep = 0
- ObjektLoc = Nothing
- End If
- Else
- tmpStep = 0
- ObjektLoc = Nothing
- End If
- Me.Invalidate(New Region(New Rectangle(ObjektLoc.X - 20, ObjektLoc.Y - 20, 40, 40)))
- End Sub
- End Class
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()