kreis kollision mit n vielen kreisen



  • hallo

    ich habe ein problem

    borland c++ builder 5.0 win xp

    ich will eine kolisionsabfrage schreibe, aber ich bekomme es nicht hin das ich sie für n viele kreise schreiben kann, bzw für n+1.

    meine kolisions abfrage sieht so aus abstand von kreismittelpunkt zum anderen kreismittelpunkt <= r1 + r2
    nun muss ich aber alle variablen fest legen für die kreise und das ist nachher nicht mehr erweiterbar

    die kreise sind in klassen geschrieben und nun brauche ich eine funktion die automatisch errechnet ob der kreis einen anderen kreis berrührt

    es ist auch eine andere lösung möglich (abstand von kreismittelpunkt zum anderen kreismittelpunkt <= r1 + r2) wenns leichter ist

    danke im vorraus



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Was für Variablen meinst du denn? Koordinaten der Mittelpunkte? o.ä. Willst du eine Fläche mit lauter Kreisen (versiedener Durchmesser) füllen? Für was genau brauchst du eine Lösung?



  • also so wie ich das verstanden habe:

    musst du von jedem Kreis die Koordinaten speichern und den Radius.
    Dann machst du einfach ne Schleife in der jede X-Koordinate mit jeder X-Koordinate der übrigen Kreise miteinander verglichen wird und dann das gleiche noch mit den Y-Koordinaten, wobei der Test darauf aus ist, dass ABSTAND>r1+r2 ist. Größer ist wichtig, denn >= würde heißen dass sich die Kreise berühren.
    Ob dann ein Kreis den anderen berührt, kannst du dir dann ja in einer bool speichern, und das dann irgendwie weiterverarbeiten.

    mfg
    Tom



  • Meinst du sowas:

    // Kreis.h
    //...
    class Kreis{
      private:
      // Mittelpunktskoordinaten und Radius
      int x, y, radius;
      public:
      // Konstruktoren und son Zeugs
      // ...
      bool kollidiert( Kreis& );
    };
    
    // Kreis.c
    bool Kreis::kollidiert( Kreis& k ){
      // alternativ: noch Wurzel ziehen
      long abstandQuadrat = (x-k.x) * (x-k.x) + (y-k.y) * (y-k.y);
      // alternativ: nur auf (radius + k.radius) prüfen
      long radiusQuadrat = radius * radius + 2 * radius * k.radius + k.radius * k.radius;
      if( abstandQuadrat <= radiusQuadrat )
        return true;
      else
        return false;
    }
    

    In deiner eigentlichen Anwendung musst du dann für alle deine Kreise die Funktion für die anderen Kreise aufrufen. Etwa so:

    int main(){
      int kAnz = 10;
      Kreis[kAnz] kreisVektor;
      // Kreise mit 'Leben' füllen
      // ...
      // Kollisionsabfrage
      for( int i = 0; i < kAnz-1; ++i ){
        for( int j = i+1; j < kAnz; ++j ){
          if( kreisVektor[i].kollidiert(KreisVector[j]) )
            cout << "Kreis " << i << " kollidiert mit Kreis " << j << endl;
          }
        }
      }
    }
    

    (alles ungetested)



  • hallo

    es tut mir leid wenn ich euch verwirt haben sollte.
    also meine frage war: Kolision mit n vielen Kreisen.
    damit meine ich wenn ich mir eine Klasse Kreis baue soll die eine Funktion haben die mit allen anderen erzeugten Kreisen eine Kolisionüberprüfung durchführt.

    ich brauche für mein jetziges Projekt nur eine Kolision von n vielen Kreisen mit ein Bestimmten Kreis.
    das habe ich gelöst in dem ich in der Klasse von dem bestimmten Kreis eine Funktion ist der man dem x und y Wert (mittelwerte) und den radius übergeben kann.
    der bestimmte Kreis überprüft dann mit der Formel
    Z = sqrt((P2x-x1)(P2x-x1) + (P2y-y1)(P2y-y1));
    wobei die P für die Werte des Kreises stehen und die x1... für den bestimmten Kreis
    Z ist dann der abstand der Mittelpunkte von dem Kreis

    dann Prüfe ich ob Z<=r1+r2 ist
    r1 = Radius des bestimmten Kreis
    r2 = Radius des anderen Kreises

    wenn die überprüfung zustimmt liegt eine Kolision vor.



  • FJK schrieb:

    hallo

    es tut mir leid wenn ich euch verwirt haben sollte.
    also meine frage war: Kolision mit n vielen Kreisen.
    damit meine ich wenn ich mir eine Klasse Kreis baue soll die eine Funktion haben die mit allen anderen erzeugten Kreisen eine Kolisionüberprüfung durchführt.

    ich brauche für mein jetziges Projekt nur eine Kolision von n vielen Kreisen mit ein Bestimmten Kreis.
    das habe ich gelöst in dem ich in der Klasse von dem bestimmten Kreis eine Funktion ist der man dem x und y Wert (mittelwerte) und den radius übergeben kann.
    der bestimmte Kreis überprüft dann mit der Formel
    Z = sqrt((P2x-x1)(P2x-x1) + (P2y-y1)(P2y-y1));
    wobei die P für die Werte des Kreises stehen und die x1... für den bestimmten Kreis
    Z ist dann der abstand der Mittelpunkte von dem Kreis

    dann Prüfe ich ob Z<=r1+r2 ist
    r1 = Radius des bestimmten Kreis
    r2 = Radius des anderen Kreises

    wenn die überprüfung zustimmt liegt eine Kolision vor.

    guten leitwert flo

    Also ich würd dies anders machen

    1. du hast ja eine klasse kreis. Ganz falsch wäre es für meine sichtweise, das dieser Bestimmte kreis X eine fkt haben soll mit der alle anderen überprüft werden sollen. der kreis soll doch gar nicht die anderen kennen

    was meinst du mit x und y (mittelwerte) ? du hast einen punkt, warum soll das ein mittelwert(e) sein? Du meinst den Ursprung des kreises ne?

    Ich würde in der klasse raum machen der verschiedene objekte haben kann ua kreise und diese klasse überprüft kolisionen. dann kann man wenn man will ( würd ich aber nicht machen ) eine fkt des kreises aufrufen die das überprüft in der art wie

    for schleife
    m_mein_kreis.IsColide( kreis[i] );

    aber das gefällt mir nicht denn die fkt berechnet ja dann nur den speziellen fall ( kreis mit kreis ) aber was wenn du später kreis mit rechteck brauchst?

    ich würde es der klasse raum überlassen

    z.b.

    m_raum.CheckColideAllObjekts();

    und in dieser würd ich dann dies überprüfen

    ok die fkt ist für dich nicht zu gebrauchen, weil du ja nur den kreis X brauchst , also

    m_raum.CheckSpecialObjekt( m_mein_kreis, TRUE );

    TRUE soll aussagen, das du nur ein objekt checkst der mit der selben gattung überprüft. also kreis mit kreis(en)

    darin gehst du deinen speziellen durch und überprüfst mit allen

    bedingung wäre:

    bestimme punkt A = m_mein_kreis.x und .y
    jetzt überprüpfe diesen Punkt A mit allen punkten ( in einer schleife )
    dabei muss gelten

    Abstand AB darf nicht kleiner sein als radius von Punkt A und Punkt Temp von i, weil sonst kolision besteht ( AB ist der Abstand, A ist der besondere Punkt im raum, Punkt Temp ist das akt objekt das zu überprüfen ist, i = der akt zähler vom array oder vector der alle kreise beinhaltet ). dazu kannst du gerne deine formel nehmen 😉



  • FJK schrieb:

    wenn ich mir eine Klasse Kreis baue soll die eine Funktion haben die mit allen anderen erzeugten Kreisen eine Kolisionüberprüfung durchführt.

    du kannst eine klassenvariable verwenden die auf eine liste aller kreise zeigt. du trägst dann im konstruktor der klasse kreis den neuen kreis in die liste ein. beim aufruf der kollisions-funktion kannst du dann den kreis mit allen anderen aus der liste auf kollision überprüfen. du mußt dabei natürlich beachten, daß der kreis, für den du die kollisionstest-methode aufrufst, ja auch in der liste ist und es soll ja nicht ein kreis auf kollision mit sich selbst geprüft werden.

    das problem ist allerdings, daß ein kreis mit mehreren anderen kreisen kollidieren kann. solange du aber nur wissen willst, ob ein kreis überhaupt mit einem anderen kollidiert sollte es gehen. dann bräuchte die kollisions-funktion nur einen bool-wert zurückzugeben.



  • Warum nicht einfach ne Methode für die Klasse Kreis, die auf Kollision mit EINEM anderen Kreis prüft. Irgendwo "außerhalb" von Kreis hast du ja sicher dein Feld/Liste oder sonstwas, wo alle Kreise gespeichert sind. Dann lässt du einfach eine Schleife über alle Kreise laufen.



  • hallo

    ich danke euch für die antworten
    ich habe zwar mein problem gelöst, aber die lösung ist etwas speziel, dass macht mich etwas unglücklich da ich versuche alles universal zu programieren so das ich es auch für alle anderen fälle benutzen kann.

    das problem das glaube ich auch eure lösungen haben ist
    das wenn ich n viele kreise oder andere objekte aufrufe das ich dann auch die funktion "kolidiere" manuel n mal aufrufen muss (manuel die überprüfung mit den n. kreis)

    ich wollte eine lösung haben die wenn ich mit new Kreis einen neuen kreis erschaffe automatisch auch die kolision mit allen vorherigen anderen kreisen und auch mit dem neu erschaffenden kreis berechnet wird.


Anmelden zum Antworten