Kolision mit n vielen Kreisen

FJK

Erfahrenes Mitglied
Hallo

borland c++ builder 5.0 win xp

habe malwieder ein Problem und zwar...

Ich brauche eine Kolisionsabfrage von n vielen Kreisen, die eigendliche abfrage ob sie kolidieren ist nicht das Problem (abstand von Kreismittelpunkt zum anderen Kreismittelpunkt <= R1 + R2).
Es ist in Klassen geschrieben, und wie kann ich mir jetzt eine universelle fkt schreiben um an die Koordinaten und Radien der anderen Kreise zu kommen?
Es ist aber wichtig das man nachher auch n+1 kreise benutzen kann.

eine andere Kolision wäre auch möglich
 
Zuletzt bearbeitet:
Hi,

würde an deiner Stelle eine Matrix mit x*y für den Bildschirm machen, und dann jeden äußersten Punkt des Kreises in die Matrix eintragen. Wenn der Punkt schon belegt ist, gibts ne Kollision, wenn nicht dann nicht.


Problem :

wenn die Kreise von den Punkten her so sind

x x
xx
xx
xx
x x


Dann würden die nicht Kollidieren. Wenn das der Fall sein sollte, kannst du auch den 2. Kreis von innen mit in die Matrix eintragen, dann wird er das erkennen.

Wenn du auch Kreise hast, vo der eine IN den anderen passt, wirst du wohl nicht drum rumkommen, den kompletten Kreis in die Matrix einzuzeichen.


Aber ist nur eine Idee von mir, denke mal es gibt sicher Algorithmen die das besser und weniger CPU lastig machen, als die Lösung oben.


Gruss

MFC OpenGL
 
ahm aber dann brauch ich für ein spielfeld von 800*600 pixeln ein 480000 faches Array oder?

das sprengt doch den Ramen
 
Zuletzt bearbeitet:
Nö, vom Speichertechnischen ist das minimal. Du brauchst ja nur 480000 byte was ca
470KB sind... und das sind (bei 128MB Ram) gerade mal 0,36% - also nichts.
Das einzige Dumme bei dem Array wird das Überprüfen sein - das sieht nämlich
nach Rechenarbeit für die CPU aus.
 
ich habe es anderes geregelt, trotzdem danke

aber ich habe noch eine frage.

wie kann man die einzelnen Spalten der StatusBar ansprechen

die erste kann man ja mit
Form2->StatusBar1->SimpleText=Bev;
aber wie kann man jetzt auf die zweite zugreifen?
 
Zuletzt bearbeitet:
Es wäre schön wenn du deine Lösung auch hier hinschreiben könntest.
Falls ein anderer das gleiche Problem hat.
 
Servus,

da du von Kreisen sprichst, gehe ich mal davon aus, dass du dich im 2D Bereich befindest. Weiterhin wird aus deiner Fragegestellung nicht ganz klar, ob du alle n Kreise untereinander auf eine Kollision prüfen willst oder nur ein Objekt mit n Kreisen.

Jedenfalls würde sich für sowas ein QuadTree anbieten. Du teilst deine 2D Fläche in 4 Quadrate ein, die dann für sich nochmal unterteilt werden. Die einzelnen Kreise werden dann den Raumunterteilungsflächen zugeordnet. Willst du nun eine Kollision zwischen deinem Objekt - ich gehe jetzt mal davon aus, dass du nur ein Objekt hast, welches du mit den Kreisen testen willst - und den Kreisen prüfen, schaust du in deinen Baum, in welchem Quadrat sich dein Objekt befindet und welche Kreise sich ebenfalls dort befinden. Somit hast du deine Kollision eingeschränkt, da dein Objekt nur mit den Kreisen, die sich auch in dem Quadranten befinden, kollidieren kann.

Für die Kollision würde ich ein eigenständiges Objekt nehmen, damit die Logik für die Kollisionsüberprüfung nicht im Kreisobjekt mit enthalten ist.

Hoffe, dass wird einigen beim nächstem Mal helfen.

Grüße Patrick

Bzgl StatusBar: Die Borland-Hilfe - per F1 zu erreichen - ist ziemlich gut, hast du dort schon mal nachgeschaut, wie man die StatusBar anspricht? Sollte dort alles gut beschrieben sein.
 
Wieso so kompliziert?
Trage doch einfach jeden Kreis in eine Liste ein, mit Mittelpunkt und Radius. Die übergibst du dann der Kollisions-Testfunktion. In dieser Funktion gehst du dann die Liste durch und prüfst für jeden Kreis mit allen anderen Kreisen der Liste ob der Abstand der Mittelpunkte <= (r1 + r2) ist. Sollte doch kein Problem sein, oder?
 
Morgen zusammen,
ein Problem sollte es nicht sein und den Algorithmus kann man auch verwenden, allerdings ist der Vorachlag von Patrick Kamin nicht von der Hand zuweisen. Der Vorteil liegt hier eindeutig in der Laufzeit. Bei n=3 oder so wird der Aufwand zum erstellen des Tree's zwar nicht akzeptabel gegenüber dem Nutzen aber bei n>>3 überwiegt der Nutzen.
Das ist wie Bubble- und Quicksort. Beide haben Vorteile.
Sollte das ganze nur zum Testen sein und nicht Laufzeit kritisch, dann reicht eine Liste, die man jedesmal durchgeht.

Soviel zum Thema "Warum macht man manches Komplizierter als es sein müsste"

Gruss Michael
 
Zurück