Physik -> Kollision zweier Kreise -> Resultat

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MindCode.

    Physik -> Kollision zweier Kreise -> Resultat

    Hallo,

    Die Kollisionsabfrage habe ich bereits, das könnt ihr aus dem Sourcecode entnehmen.
    In dem Code steht die Gesamte Physik-Engine, also alles was man braucht um mir evtl. helfen
    zu können.

    Es handelt sich um 2+n Bälle die sich Physikalisch korrekt Verhalten in einem System
    mit Gravitation. Kollision am Rand klappt gut, auch die Kollisionserkennung zwischen
    den Bällen. Das problem ist nur. Sobald die Bälle in Ruhe sind und z.b "Aufeinander" liegen.
    Sinken sie langsam runter. Ich kann es da nicht so einfach Lösen wie mit dem Border.


    Seht selbst:

    Hier das Gesamte Projekt zum Download:
    Download

    Quellcode

    1. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. Dim aN As Single
    3. Dim bN As Single
    4. Render.Refresh()
    5. Render.BackColor = Color.Black
    6. For i = 0 To Ball_IndX
    7. If MoVinG(i) = 0 Then
    8. speedY(i) += gravity
    9. speedY(i) += ay(i)
    10. speedX(i) += ax(i)
    11. speedY(i) *= friction
    12. speedX(i) *= friction
    13. ball_loc_x(i) += speedX(i)
    14. ball_loc_y(i) += speedY(i)
    15. '// Collision with other Balls:
    16. bCenterX(i) = ball_loc_x(i) + 25
    17. bCenterY(i) = ball_loc_y(i) + 25
    18. If Ball_IndX > 0 Then
    19. For x = 0 To 10
    20. a = bCenterX(i) - (ball_loc_x(x) + 25)
    21. b = bCenterY(i) - (ball_loc_y(x) + 25)
    22. If a = 0 Or b = 0 Then
    23. If b = 0 Then Abstand = Abs(a)
    24. If a = 0 Then Abstand = Abs(b)
    25. Else
    26. Abstand = Sqrt((Abs(a) ^ 2) + (Abs(b) ^ 2))
    27. End If
    28. Label10.Text = b
    29. If Abstand < 50 And Abstand <> 0 Then
    30. speedX(i) *= -1
    31. speedY(i) *= -1
    32. ball_loc_y(i) = ball_loc_y(x) - 25
    33. ' ++++ 'Genau hier ist das Problem. Entweder ich lasse die Zeile mit ball_loc_y(i) stehen
    34. 'dann hüpft der ball allerdings nicht mehr zurück sondern bleibt sofort "kleben".
    35. Oder ich entferne deise Zeile und nach dem beide Bälle in ruhe sind, sinkt der obere
    36. in den unteren... :-(
    37. 'Render.BackColor = Color.White
    38. End If
    39. Next
    40. End If
    41. '// Collision with Walls
    42. If ball_loc_y(i) > bottom_side Then
    43. ball_loc_y(i) = bottom_side
    44. speedY(i) *= -1
    45. ElseIf ball_loc_y(i) < 0 Then
    46. ball_loc_y(i) = 0
    47. speedY(i) *= -1
    48. End If
    49. If ball_loc_x(i) > right_side Then
    50. ball_loc_x(i) = right_side
    51. speedX(i) *= -1
    52. ElseIf ball_loc_x(i) < 0 Then
    53. ball_loc_x(i) = 0
    54. speedX(i) *= -1
    55. End If
    56. Label1.Text = "Location X: " & ball_loc_x(0)
    57. Label2.Text = "Location Y: " & ball_loc_y(0)
    58. Label3.Text = "Speed X: " & speedX(0)
    59. Label4.Text = "Speed Y: " & speedY(0)
    60. Label5.Text = "Acceleration X: " & ax(0)
    61. Label6.Text = "Acceleration Y: " & ay(0)
    62. Label7.Text = "Friction: " & friction
    63. Label8.Text = "Gravity: " & gravity
    64. End If
    65. Next
    66. End Sub
    Vielleicht ein Grenzwertproblem?

    Sinkt der Ball auch, wenn du ein Luftpolster bildest?

    VB.NET-Quellcode

    1. If Abstand < 50 And Abstand > 1 Then


    Edit:
    Abstand scheint ein Double zu sein und kann deshalb auch Werte zwischen 0 und 1 annehmen.
    Wenn du dann 1 abziehst, ist der Wert unter Null und wird nie wieder 0 annehmen.
    Vielleicht solltest du Abstand beim Vergleich auf ganze Zahlen runden.
    Auch in diesem Fall müsste die oben angegebene Variante helfen.
    Du kannst aber auch in dem Fall vor der Abfrage den Abstand korrigieren:

    VB.NET-Quellcode

    1. If Abstand <1 Then Abstand=0
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    petaod schrieb:

    Vielleicht ein Grenzwertproblem?

    Sinkt der Ball auch, wenn du ein Luftpolster bildest?

    VB.NET-Quellcode

    1. If Abstand < 50 And Abstand > 1 Then


    Edit:
    Abstand scheint ein Double zu sein und kann deshalb auch Werte zwischen 0 und 1 annehmen.
    Wenn du dann 1 abziehst, ist der Wert unter Null und wird nie wieder 0 annehmen.
    Vielleicht solltest du Abstand beim Vergleich auf ganze Zahlen runden.
    Auch in diesem Fall müsste die oben angegebene Variante helfen.
    Du kannst aber auch in dem Fall vor der Abfrage den Abstand korrigieren:

    VB.NET-Quellcode

    1. If Abstand <1 Then Abstand=0
    Das ist leider nicht die Lösung des Problems. Es ändert sich nichts ausser dass
    der Ball irgendwann mal mit voller wucht wieder Wegspringt!

    Ich habe die Vermutung, dass es etwas
    mit der der For x schleife zu tun hat, bei einer Kollision wird zwar der Ball beschleunigt in negative Richtung.
    Aber im nächsten Durchlauf schon wieder seine Position gesetzt?!

    SAR-71 schrieb:

    Entferne "ball_loc_y(i) = ball_loc_y(x) - 25" aus der For-Schleife.
    Warum setzt du überhaupt seine Position?


    Mfg.
    SAR
    Wenn ich das entferne, und beide Bälle nun in Ruhe sind und aufeinanderliegen, sinkt ganz langsam
    der oberste ball in den unteren rein.

    Wenn man sich die Kollision mit den Rändern ansieht, setze ich ja genau so seine position damit der Ball auch ja nicht
    über den Rand fliegt, dannach wird die beschleunigung negiert. Da funktioniert das seltsamerweise so wie es soll.
    Ach leute, ich hab bei der For X schleife als Endwert 10 und nicht Ball_IndX
    Dadurch checkt er auch nach bällen die noch garnich existieren... omg
    nu klappts, jetzt kann ich endlich weiter machen, aber ich glaub ihr
    werdet diesbezüglich evtl noch mehr fragen von mir hören, also freut euch ;)

    danke für eure hilfe!