Objekt entlang eines Pfades bewegen

    • VB.NET

    Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

      Objekt entlang eines Pfades bewegen

      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

      VB.NET-Quellcode

      1. Public Class Pfad
      2. Sub New()
      3. End Sub
      4. Sub New(ByVal P1 As Point, ByVal P2 As Point)
      5. AusgangsPunkt = P1
      6. ZielPunkt = P2
      7. End Sub
      8. Dim _AusgangsPunkt As Point = New Point(0, 0)
      9. Dim _ZielPunkt As Point = New Point(0, 0)
      10. Dim _PixelPerStep As Decimal = 10
      11. Dim deltaX As Integer = 0 'Unterschied der X-komponente von Ausgangspunkt und Zielpunkt
      12. Dim deltaY As Integer = 0 'Unterschied der Y-komponente von Ausgangspunkt und Zielpunkt
      13. Dim Weglänge As Double = 0
      14. Public Function GetPixelPerStep(ByVal _steps As Integer) As Decimal
      15. Dim PPS As Decimal = CDec(Weglänge / _steps)
      16. Return PPS
      17. End Function 'Gibt die anzahl der PixelPerStep in abhängigkeit der anzahl der stücke in die die linie unterteilt wird zurück
      18. Public Function GetSteps() As Integer
      19. Return CInt(Weglänge / PixelPerStep)
      20. End Function 'gibt die stücke-anzahl zurück
      21. Public Property PixelPerStep() As Decimal
      22. Get
      23. Return _PixelPerStep
      24. End Get
      25. Set(ByVal value As Decimal)
      26. _PixelPerStep = value
      27. End Set
      28. End Property
      29. Public Property AusgangsPunkt() As Point
      30. Get
      31. Return _AusgangsPunkt
      32. End Get
      33. Set(ByVal value As Point)
      34. _AusgangsPunkt = value
      35. deltaX = ZielPunkt.X - AusgangsPunkt.X
      36. deltaY = ZielPunkt.Y - AusgangsPunkt.Y
      37. Weglänge = Math.Sqrt(deltaX * deltaX + deltaY * deltaY) 'Satz des Pythagoras
      38. End Set
      39. End Property
      40. Public Property ZielPunkt() As Point
      41. Get
      42. Return _ZielPunkt
      43. End Get
      44. Set(ByVal value As Point)
      45. _ZielPunkt = value
      46. deltaX = ZielPunkt.X - AusgangsPunkt.X
      47. deltaY = ZielPunkt.Y - AusgangsPunkt.Y
      48. Weglänge = Math.Sqrt(deltaX * deltaX + deltaY * deltaY) 'Satz des Pythagoras
      49. End Set
      50. End Property
      51. Public Function GetStepArray() As Point()
      52. Dim Steps As Integer = GetSteps()
      53. Dim tmp(Steps) As Point
      54. If Steps > 0 Then
      55. Dim StepLengthX As Double = deltaX / Steps
      56. Dim StepLengthY As Double = deltaY / Steps
      57. Dim newLoc As Point = New Point(0, 0)
      58. For i = 0 To Steps
      59. newLoc = New Point(CInt(_AusgangsPunkt.X + i * StepLengthX), CInt(_AusgangsPunkt.Y + i * StepLengthY))
      60. tmp(i) = newLoc
      61. Next
      62. End If
      63. Return tmp.ToArray
      64. End Function 'Erstellt einen Array mit allen positionen zwischen Start und Zielpunkt
      65. 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^^

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Public Class Form1
      2. Dim P1 As Point = New Point(50, 500)
      3. Dim P2 As Point = New Point(800, 200)
      4. Dim SinglePfad As New Pfad
      5. Friend WithEvents Timer1 As New Timer
      6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      7. Me.Size = New Size(1000, 800)
      8. Me.DoubleBuffered = True
      9. Timer1.Interval = 10
      10. Timer1.Start()
      11. End Sub
      12. Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
      13. setSinglePfad(e.Button, e.Location)
      14. Me.Invalidate()
      15. End Sub
      16. Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
      17. If e.Button = Windows.Forms.MouseButtons.Left Then
      18. setSinglePfad(e.Button, e.Location)
      19. Me.Invalidate()
      20. End If
      21. End Sub
      22. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
      23. If P1 <> Nothing Then
      24. e.Graphics.DrawEllipse(New Pen(Color.Red, 3), P1.X - 10, P1.Y - 10, 20, 20)
      25. End If
      26. If P2 <> Nothing Then
      27. e.Graphics.DrawEllipse(New Pen(Color.Blue, 3), P2.X - 10, P2.Y - 10, 20, 20)
      28. End If
      29. If P1 <> Nothing And P2 <> Nothing Then
      30. SinglePfad.AusgangsPunkt = P1
      31. SinglePfad.ZielPunkt = P2
      32. Dim StepArray() As Point = SinglePfad.GetStepArray
      33. For i = 0 To StepArray.Count - 1
      34. Dim loc As Point = StepArray(i)
      35. e.Graphics.DrawEllipse(New Pen(Color.Gray, 2), loc.X - 5, loc.Y - 5, 10, 10)
      36. Next
      37. End If
      38. If ObjektLoc <> Nothing Then
      39. e.Graphics.DrawRectangle(New Pen(Color.Green, 4), ObjektLoc.X - 15, ObjektLoc.Y - 15, 30, 30)
      40. End If
      41. End Sub
      42. 'Private Sub cPPS_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) handles NumericUpDown1.changevalue
      43. ' SinglePfad.PixelPerStep = CInt(cPPS.Value)
      44. ' Me.Invalidate()
      45. 'End Sub
      46. Sub setSinglePfad(ByVal _button As MouseButtons, ByVal pos As Point)
      47. If _button = Windows.Forms.MouseButtons.Right Then
      48. P1 = Nothing
      49. P2 = Nothing
      50. End If
      51. If _button = Windows.Forms.MouseButtons.Left Then
      52. If P1 = Nothing Then
      53. P1 = pos
      54. Else
      55. P2 = pos
      56. End If
      57. End If
      58. End Sub
      59. Dim tmpStep As Integer = 0
      60. Dim ObjektLoc As Point = Nothing
      61. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      62. Me.Invalidate(New Region(New Rectangle(ObjektLoc.X - 20, ObjektLoc.Y - 20, 40, 40)))
      63. If P1 <> Nothing And P2 <> Nothing Then
      64. tmpStep += 1
      65. Dim StepArray() As Point = SinglePfad.GetStepArray
      66. If tmpStep <= StepArray.Count - 1 Then
      67. ObjektLoc = StepArray(tmpStep)
      68. Else
      69. tmpStep = 0
      70. ObjektLoc = Nothing
      71. End If
      72. Else
      73. tmpStep = 0
      74. ObjektLoc = Nothing
      75. End If
      76. Me.Invalidate(New Region(New Rectangle(ObjektLoc.X - 20, ObjektLoc.Y - 20, 40, 40)))
      77. End Sub
      78. End Class

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()

      Hi,

      .ToArray, wenn das Objekt schon eine Array ist? Wo liegt der Sinn?
      .Count bei einer Array? .Count ist für mich typisch für generische Listen. Da "StepArray" eine Array ist, warum nicht die Length-Property nehmen?
      Von meinem iPhone gesendet
      Hi,
      ich bezog mich mit der Count-Property auf generische Listen, wie z.B. die Standard-Liste:
      msdn.microsoft.com/en-us/library/d9hw1as6%28v=VS.80%29.aspx
      (hat auch im .NET-FW 2.0 eine Count-property)

      Wie ich oben beschrieben habe, ist dies keine Standard-Liste, sondern eine Array. Da sollte man die Length-Property benutzen.
      Von meinem iPhone gesendet
      Nikee..
      Ich wusste ja nicht, dass man die Array größe von Anfang an deklarieren kann?!
      Geht das also auch so:

      VB.NET-Quellcode

      1. Dim Arr(5) As Integer
      2. Arr(0) = 0
      3. Arr(1) = 1
      4. Arr(2) = 2
      5. Arr(3) = 3
      6. Arr(4) = 4
      7. Arr(5) = 5


      So gehts?!
      Ich dachte immer, wenn man z.b. Arr(0) macht ist das nur ReadOnly :O

      VB.NET-Quellcode

      1. dim arr(5) As Integer
      Erstellt eine sechselementige Array, die von 0 bis 5 geht.

      VB.NET-Quellcode

      1. dim arr as integer()
      Erstellt eine Array, bei der keine Anzahl von Elementen angegeben ist. Beim Benutzen müsste diese Array eine Exception schmeissen, sollte man ihr vorher keine Elementzahl zugewiesen haben.
      Von meinem iPhone gesendet