Kreis Kollisionen Unverständnisse

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Kreis Kollisionen Unverständnisse

BeitragFr, Feb 15, 2013 10:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,
ich hätte da mal 2 Fragen.

1. Dort wo ich hingeschrieben habe "Kein Plan1" dort weis ich nicht genau was die Befehle wie (abs oder sqr) machen.

2. Beim "Kein Plan2" weis ich nicht genau was ich machen soll wenn meine Objekte nicht gleich Groß sind, Kollidieren sie nicht richtig.

Eine Erklärung währe sicher Hilfreich, danke Smile

MFG:
Raidenkk | Kevin.K

Code: [AUSKLAPPEN]
Graphics(800, 600)

Global timerFrameTick:TTimer = CreateTimer(60)

Type Kreis
   Global x:Float = 350;
   Global y:Float = 250;
   Global size:Float = 100;
End Type

Global Kugel:Kreis = New Kreis

Repeat
   Cls
   
   'Steuerung
   If KeyDown(KEY_LEFT) Then
      Kugel.x:-5
   Else If KeyDown(KEY_RIGHT) Then
      Kugel.x:+5
   End If
   
   If KeyDown(KEY_UP) Then
      Kugel.y:-5
   Else If KeyDown(KEY_DOWN) Then
      Kugel.y:+5
   End If
   
   
   'Zeichnen
   DrawOval(Kugel.x, Kugel.y, Kugel.size, Kugel.size)
   DrawOval(100, 100, 100, 100)
   
   
   ' Einfärben
   If KreisKollision(Kugel.x, Kugel.y, Kugel.size, 100, 100, 100)
      SetColor(255, 255, 255)
   Else
      SetColor(255, 0, 0)
   End If
   Flip 0
   
   WaitTimer(timerFrameTick)
Until KeyDown(KEY_ESCAPE) Or AppTerminate()

Function KreisKollision:Int(newObj1X:Float, newObj1Y:Float, newObj1Size:Float, newObj2X:Float, newObj2Y:Float, newObj2Size:Float)
   'Mitte der Kreise berechnen und dann den abstand messen
   Local tempXab:Float = (newObj1X / 2) - (newObj2X / 2)
   Local tempYab:Float = (newObj1Y / 2) - (newObj2Y / 2)
   
   'Kein Plan1
   Local tempAbstand = Abs(Sqr((tempXab ^ 2) + (tempYab ^ 2)))
   
   'Kein Plan2
   If(tempAbstand > newObj1Size / 2) Then
      Return 1
   Else
      Return 0
   End If
End Function

Jan_

Ehemaliger Admin

BeitragFr, Feb 15, 2013 11:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Mathematic,

Satz des Phytagoras:

a^2+b^2=c^2

Also, der Abstand, in 2D, ist die Hypothenuse. (c)
c= wurzel(a^2+b^2)
c=sqr(a^2+b^2)
ABS=absolut
Beispiel:
abs(-5)=5
abs(-3)=3
abs(9)=9
abs(12)=12
abs(5)=5

Kein Plan2:
wenn Abstand der Objekte kleiner ist, als der radius (Raduis=Durchmesser/2)
Dann Kollision!
Jedoch, wird nur die Größe eines Objektes angenommen, das 2. ist ein Punkt-Objekt
Wenn das nicht so sein sollte:
(tempAbstand > (newObj1Size / 2+ newObj2Size / 2))
between angels and insects

Raiden93

BeitragFr, Feb 15, 2013 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke dir für die lehrreiche Hilfe.

Wenn ich folgendes mache:
Code: [AUSKLAPPEN]
If(tempAbstand > (newObj1Size / 2 + newObj2Size / 2)) Then
      Return 1
   Else
      Return 0
   End If


Wird der Abstand um das doppelte erhöht und ist nicht mehr richtig
 

PhillipK

BeitragFr, Feb 15, 2013 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt drauf an, was du als size verwendest.

Oder du hast die kleine aber feine 1 und 2 übersehen Wink

Grundsätzlich gilt: Bei kreisen wird vom zentrum geprüft. Dh da muss auch deine prüf-xy koordinate liegen.
Andernfalls musst du, um den abstand zu ermitteln, ersteinmal radius auf x und y rechnen, wenn der koordinatenursprung des kreises oben-links liegt.

2 Kreise überschneiden sind, wenn die distanz ihrer mittelpunkte kleiner als der radius beider kreise zusammen ist. Dabei ist es egal, ob ein kreis 1000meter durchmesser und der andere nur 1meter durchmesser hat - die logik geht immer auf.

Um den abstand zu errechnen, wie bereichts erwähnt: Frag den guten alten pythagoras.

Schau am besten mal in deiner Draw-Funktion nach, wo du den koordinaten ursprung hingesetzt hast, das ist ziemlich wichtig. Im idealfall sieht die zeichnung so aus:
BlitzMax: [AUSKLAPPEN]
DrawOval ( Self.x - Self.radius , Self.y - Self.radius , Self.radius*2, Self.radius*2)

Dh du geht von der x und y koordinate ersteinmal RADIUS nach "oben links", danach zeichnest du mit radius * 2 (aka Durchmesser) den kreis.

Falls du ein bild verwendest, sollte der handle mittig liegen - hat etwa den selben effekt.

Zum Distanz prüfen dann einfach eine kleine hilfsfunktion:
BlitzMax: [AUSKLAPPEN]

Function Pythagoras:Float( x1:Float, y1:Float , x2:Float,y2:Float)
Return Sqr( (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
End Function


Diese rufst du dann mit den beiden koordinatenpäärchen auf, dessen distanz du ermitteln möchtest.

Ich gehe einfach mal davon aus, du hast ein Type "TKreis", welches x,y, und radius als fields kennt. Alle daten sind float und der mittelpunkt des kreises wird durch x,y definiert:

BlitzMax: [AUSKLAPPEN]

Local distance:Float = Pythagoras( Self.x, Self.y, toCheck.x, toCheck.y)

If distance < (Self.radius + toCheck.radius) Then
'collision!
Else
'nix collision :)
EndIf


Alles hier ist reiner pseudocode. Aber die logik dahinter sollte begreifbar werden:
Gibt es ein problem mit den abfragen, gibt es ein problem mit deiner struktur Razz

Vergiss nicht die beschaffenheit und die namensgebung in sachen kreise:
Radius ist der HALBE durchmesser. Er kann durch eine linie vom zentrum zum rand dargestellt werden.
Durchmesser ist simpel ausgedrückt der doppelte radius.
Alle mathematischen rechnungen die du tätigen kannst, gehen am einfachsten, wenn dein objekt in der mitte seinen 0-punkt hat. Ergo: x,y würde auf dem papier dort liegen, wo du mit dem zirkel reinstichst Smile

Raiden93

BeitragSa, Feb 16, 2013 5:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke dir für die Erklärung.

Gruß

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group