Kollision selbst errechnen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: Kollision selbst errechnen

BeitragDi, Jun 14, 2011 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Comunity!

Ich stelle mir grade selbst den Versuch, eine Kollision festzustellen.
Das ganze dient lediglich einem Lernzweck, da ich eine ablenkung von meinem aktuellen Projekt brauche Razz

Das ganze verfolgt einen Zweck: Ein landschaftsbild auslesen und je nach farbwert (Weiß == Luft) als "Kollisionsmaske" umarbeiten.
Das ganze stelle ich mir so vor, das ich quasie einen Binären Array anlege, mit XY koordinaten als Index.

Zb Global Maske:Byte[,] = New Byte[sizeX,sizeY]

Maske[5,5] könnte 1 sein, dh hier ist eine "kollision" möglich

Wenn ich nun eine Linie habe, weiß ich leider nicht, wie ich die Kollision darauf berechne.

Beispiel: Linie geht x+2,y+5 pro frame. So habe ich eine Strecke von ~5,38 länge, worauf irgendwo eine kollision stattgefunden haben könnte.

A|-------o------|B
Meine strecke AB, welche an 'o' eine kollision hat -> wie finde ich das raus?

Die einzige idee die ich dazu nun hätte, wäre die strecke mit je einer länge von ~1 nachzuverfolgen und zu prüfen, ob an dem punkt eine Kollision stattgefunden hat.

Dh je mit X = ((Cos(Winkel-90)) Y= ((Sin(winkel-90)) in einer forschleife durchklappern :< Allerdings sieht mir das nicht sehr elegant aus.. Gibt es noch gescheitere wege?

Edit: So ein mist, nun hat mein Internet gesponnen und ich habe diesen Beitrag 2x geöffnet -.- wie kann ich einen davon löschen? Sad War keine absicht >.<
 

n-Halbleiter

BeitragDi, Jun 14, 2011 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!

Ich denke, was dir hier helfen könnte, wäre der Bresenham-Algorithmus (oder ein anderer Linienplottender Algorithmus). Der Ansatz, an den ich denke, wäre der folgende:

Du plottest die Linie von Punkt A nach B (erhältst vom Algorithmus Punkte, an denen die Linie ist) und überprüfst anhand der Koordinaten in deinem Array, ob dort der Wert 1 ist.

Auf diese Weise ist es dir auch möglich, mehrere Kollisionspunkte zu berechnen.

Ich hoffe, ich konnte helfen. (:
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

PhillipK

BeitragDi, Jun 14, 2011 15:10
Antworten mit Zitat
Benutzer-Profile anzeigen
n-Halbleiter hat Folgendes geschrieben:
Du plottest die Linie von Punkt A nach B (erhältst vom Algorithmus Punkte, an denen die Linie ist) und überprüfst anhand der Koordinaten in deinem Array, ob dort der Wert 1 ist.


Danke, n-Halbleiter! Smile

Witzigerweise habe ich das bereits einmal geschrieben oO Wieso hab ich mich nicht daran errinnert? :/
Allerdings noch etwas "Unsauberer" wie es im Wiki angeboten wird.
Ich schreibe das ganze einmal ab und melde mich dann mit meinem ergebnis Smile

Bis dahin: Ist das wirklich die einzige Methode, eine solche Kollision festzustellen?
Andere vorschläge würde mich auchnoch reizen! Smile
 

n-Halbleiter

BeitragDi, Jun 14, 2011 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist nicht die einzige Lösung, allerdings die Lösung, die mir spontan so einfiel. Ich hoffe, dass sie für dich funktioniert.

Ein weiterer Ansatz wäre, deine Landschaft durch Punkte (die Ränder durch Linien) darzustellen und dann Linienkollisionen durchzuführen (die Anzahl der gegeneinander geprüften Linien lässt sich ja durch Koordinatenvergleiche verringern). Allerdings musst du dafür deine Landschaft erstmal konvertieren.

Merke: Es gibt selten nur eine Lösung für ein Problem. Je nachdem, wie die Daten vorliegen oder was man selbst bevorzugt (natürlich gibt es auch noch andere Faktoren), entwickelt man andere Ansätze. Wink
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit
Ploing!
Blog

"Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935)
 

PhillipK

BeitragMi, Jun 15, 2011 4:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!

Entschuldige, das ich erst so 'spät' *auf die uhr guck.. hust* schreibe!
Ich habe gestern noch das ganze ausprobiert und die c-implementierung abgeschrieben. Das funktionierte auf wie es aussah. Dann kam meine Freundin vonner Arbeit und sie war erstmal wichtig Smile
Leider hab ich das gefühl, das es nicht ganz so schnell läuft, aber das ist erstmal egal.
Es funktioniert auf jedenfall Smile

Linienkollision.. tjoar.. Hm Smile
Sagt mir nichts ^^ Hab mich nie mit dem Thema beschäftigt, lediglich vorgegebene Maßnahmen genutzt.

Zu dem Zweck des Testes versuche ich grade, ein Minispiel zu schreiben.
Das ganze stelle ich mir so vor, das ich ein paar Landschafts-templates lade (später generie, das wird der nächste lernschritt!), welches als TImage und TPixmap vorliegt.
Dann schleuder ich partikel mit einem Zufälligen flugwinkel und pseudo-gravitation rum, bis sie auf den boden 'aufschlagen' - dort sollen sie dann angefügt werden und die Landschaft "erweitern"
Wie ich die daten halte, habe ich noch nicht wirklich durchdacht, lediglich anhand der Farbwerte einen Byte-array erstellt, wo 'Nichts' bzw 'Kollision' vermerkt ist.

----

Eine weitere idee die ich hatte, wäre eine grobe vorprüfung, jedesmal beim verschieben eines Partikels diesen mit halben speed nach oben 'rausschleudern' - bzw vorher auf den ersten möglichen 'Nichts'-Platz setzen. Ist der Speed Sqr(SpeedX²+SpeedY²) < 1, so kann ich davon ausgehen, das der Partikel 'oben aufliegt' - grob im Kopf überschlagen dürfte das ganze kaum rechenleistung brauchen, da es nur ein IF pro verschiebung ist, allerdings gibt es Grafische und Logische fehler, wenn der Speed zu hoch wird.

----

Noch eine weitere Idee die mir grade einfällt:
Beim erstellen dieser 'Landschaft' habe ich für jeden Luftpunkt eine 255. Boden ist ein vorerst zufälliger wert zwischen 0 und 254. Das ganze könnte ich so ändern, das um landschaftspunkte rum der Array nach oben, links und rechts durchgecheckt wird.

For Local X:Int = Landschaft.X-3 to Landschaft.X+3
For Local Y:Int = Landschaft.Y-4 to Landschaft.Y
If Landschaft.Array[X,Y] = 255 then Landschaft.Array[X,Y] = 1
Next
Next

-> Setze ich nun jeden 'richtigen' bodenpunkt auf 0, haben ich einen Array, welcher in der Nähe von dem Boden eine 1 enthält, als boden selbst eine 0. Beim bewegen könnte ich nun feststellen, ob unter dem Partikel grade '1' ist und dementsprechend eine genauere Prüfung via Linienplotter durchführen.

----

Mag mir jemand meine Illusionen zerstören und mich auf den Boden der Tatsachen zurückholen? Very Happy
Und was genau ist eine Linienkollision(s berechnung) ? (gleich mal googlen *g*)

Gruß, Phillip


----
Edit:

Habe mir nun grade einmal Linienkollision angeschaut, hierzu diehnte Dieser Thread - das wird arbeit, das zu Kapieren :/
aber immerhin war es mir möglich, das Testprogramm schonmal selbst zu erweitern um es zu verstehen^^

Linienkollision ist allerdings nicht so einfach möglich, da ich Pixelbasierte kollisionsabfrage brauche.
Aber ich versuche dennoch, sie mal einzubauen Smile

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group