Hi all, ich hoffe, ihr hattet schöne Weihnachtstage.
Ich habe eine Klasse
Spoiler anzeigen
Von dieser Klasse gibt es mehrere Instanzen in der
Spoiler anzeigen
Nun gibt es einen Timer_Tick, der regelmäßig
aufruft, sodass
Hierin soll es nun eine Kollisionserkennung geben. Wie kann ich eine Funktion schreiben, die prüft, ob 2 Kugeln sich treffen? Das Problem ist, dass zur Laufzeit nicht immer klar ist, wie viele Rechtecke es zur Zeit gibt, und es muss außerdem egal sein, aus welcher Richtung sie sich treffen. Sobald sich 2 Kugeln treffen, muss ich wissen, welchen beiden Kugeln (oder deren Um-Rechtecke) es sind. Und ich bräuchte den genauen Berührungspunkt, um mit dem Skalarprodukt berechnen zu können, wohin beide Kugeln abdriften.
en.wikipedia.org/wiki/Momentum
PS: Ich brauche nicht das Abprallen an den 4 Wänden. Das habe ich schon.
Ich habe eine Klasse
Kugel
, die die wichtigsten physikalischen Eigenschaften einer normalen Kugel enthält. VB.NET-Quellcode
- Imports System.Windows
- Public Class Kugel
- Public velocity As Vector
- ''' <summary>
- ''' m [g] = ρ [g/cm^3] * V [cm^3] mit ρ = 2.6989
- ''' </summary>
- Public mass As Double
- Public Property Startposition As Vector
- ''' <summary>
- ''' Impuls
- ''' </summary>
- Public momentum As Vector = New Vector(0, 0)
- Public Farbe As Color
- ''' <summary>
- ''' [cm]
- ''' </summary>
- Public Durchmesser As Double
- Public Property akt_Position As Vector
- Public Property steht_zwar__aber_nicht_auf_Startposition As Boolean = False
- Public Property steht As Boolean = True
- Public Property Span As TimeSpan
- Public Property DateBeginn As Date
- Public Sub New(ByVal posX As Double, ByVal posY As Double, ByVal R As Byte, ByVal G As Byte, ByVal B As Byte, ByVal Du As Double)
- Me.Startposition = New Vector(posX, posY)
- Me.Farbe = Color.FromArgb(R, G, B)
- Me.Durchmesser = Du
- Me.mass = 4.0 / 3.0 * Math.PI * Math.Pow((Du / 2.0), 3) * 2.6989
- End Sub
- End Class
Von dieser Klasse gibt es mehrere Instanzen in der
Public alleKugelnListe As New List(Of Kugel)
. Im Form_MainLoad- und Button_start_sub werden die Instanzen initialisiert.VB.NET-Quellcode
- Private Sub Form_Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Me.BackColor = Color.FromArgb(141, 161, 148)
- Button_Start.BackColor = Color.FromArgb(195, 219, 204)
- Button_Stopp.BackColor = Color.FromArgb(195, 219, 204)
- Me.Location = New Drawing.Point(0, CInt(Math.Round(Screen.PrimaryScreen.WorkingArea.Height / 2.0 - Me.Size.Height / 2.0, 0)))
- alleKugelnListe.Add(New Kugel(15, 15, 0, 229, 255, 30.0))
- alleKugelnListe.Add(New Kugel(1275.0 / 2.0, 15, 8, 0, 255, 30.0))
- alleKugelnListe.Add(New Kugel(1275.0 / 2.0, 360, 255, 0, 230, 30.0))
- alleKugelnListe.Add(New Kugel(1275.0 / 3.0, 500, 60, 242, 5, 30.0))
- alleKugelnListe.Add(New Kugel(1275.0 / 4.0, 600, 0, 0, 0, 50.0))
- End Sub
- Private Async Sub Button_Start_Click(sender As Object, e As EventArgs) Handles Button_Start.Click
- Await Task.Run(Sub() alle_Kugeln_initialisieren())
- End Sub
- Private Sub alle_Kugeln_initialisieren()
- alleKugelnListe(0).velocity = New Vector(110.0, 0.0)
- alleKugelnListe(0).steht = False
- alleKugelnListe(0).akt_Position = alleKugelnListe(0).Startposition
- alleKugelnListe(0).DateBeginn = Date.Now
- alleKugelnListe(1).velocity = New Vector(0.0, 0.0)
- alleKugelnListe(1).steht = True
- alleKugelnListe(1).akt_Position = alleKugelnListe(1).Startposition
- alleKugelnListe(2).velocity = New Vector(0.0, 0.0)
- alleKugelnListe(2).steht = True
- alleKugelnListe(2).akt_Position = alleKugelnListe(2).Startposition
- alleKugelnListe(3).velocity = New Vector(-120.0, 0.0)
- alleKugelnListe(3).steht = False
- alleKugelnListe(3).akt_Position = alleKugelnListe(3).Startposition
- alleKugelnListe(3).DateBeginn = Date.Now
- alleKugelnListe(4).velocity = New Vector(-130.0, -130.0)
- alleKugelnListe(4).steht = False
- alleKugelnListe(4).akt_Position = alleKugelnListe(4).Startposition
- alleKugelnListe(4).DateBeginn = Date.Now
- bereit = True
- Me.Invoke(Sub() Timer1.Start())
- Me.Invoke(Sub() Timer2.Start())
- End Sub
Nun gibt es einen Timer_Tick, der regelmäßig
aufruft, sodass
PictureBox1_Paint
aufgerufen wird. Hierin werden ständig alle Eigenschaften berechnet, unter anderem der Geschwindigkeitsvektor und der zurückgelegte Weg. bereit
ist nur ein Notbhelf, um dafür zu sorgen, dass er beim Programmstart (Formaufbau) nicht das alles ausführt.Hierin soll es nun eine Kollisionserkennung geben. Wie kann ich eine Funktion schreiben, die prüft, ob 2 Kugeln sich treffen? Das Problem ist, dass zur Laufzeit nicht immer klar ist, wie viele Rechtecke es zur Zeit gibt, und es muss außerdem egal sein, aus welcher Richtung sie sich treffen. Sobald sich 2 Kugeln treffen, muss ich wissen, welchen beiden Kugeln (oder deren Um-Rechtecke) es sind. Und ich bräuchte den genauen Berührungspunkt, um mit dem Skalarprodukt berechnen zu können, wohin beide Kugeln abdriften.
en.wikipedia.org/wiki/Momentum
PS: Ich brauche nicht das Abprallen an den 4 Wänden. Das habe ich schon.