Intersektion - Index des zweiten Objekts ermitteln



  • Hallo, ich habe ein Intersektions-Rechteck einer Kollision von zwei rechteckigen Objekten berechnet. Wenn ich nun durch die Intersektion des ersten Objekts iterieren will, mach ich object.tiles[intersection.x - 1][intersection.y - 1] . Aber wie lauten die Indizien, für das zweite Objekt? Da muss ich irgendein Offset berechnen, habe schon so viel geraten, aber war nie richtig. Wie berechne ich diesen Offset zum Indizieren des zweiten Objekts?

    Gegeben sind drei Rechtecke:
    - Das Rechteck des ersten Objekts (left, top, right, bottom)
    - Das Rechteck des zweiten Objekts
    - Das Rechteck der Intersektion



  • Verstehe es nicht so ganz, so etwas?

    `if(l1 < l2) i_box_l = l2 else i_box_l = l1;

    if(r1 > r2) i_box_r = r2 else i_box_r = r1;

    if(b1 < b2) i_box_b = b2 else i_box_b = b1;

    if(t1 < t2) i_box_t = t1 else i_box_t = t1;`

    l1 = Rechteck erstes Objekt left
    l2 = Rechteck zweites Objekt left usw.
    i_box = Rechteck der Intersektion

    Also ich habe es nicht überprüft, ob es auch stimmen könnte.



  • bool object::collides(const object& rhs) const{
    // überprüfe rechteckige Kollision
                auto box1 = get_global_bounds(), box2 = rhs.get_global_bounds();
                bool has_collision = (box1.width < box2.x || box1.x > box2.width || box1.height < box2.y || box1.y > box2.height);
    
    // wenn sich die zwei Objekte nicht überlappen, gebe false zurück
                if(!has_collision)
                    return false;
    
    // berechne Intersektion
                box1 = {
                    std::min(box1.width, box2.width), std::min(box1.height, box2.height),
                    std::max(box1.x, box2.x), std::max(box1.y, box2.y)
                };
    
    // iteriere durch die Intersektion der zwei Objekten
                for( ; box1.y < box1.height; ++box1.y){
                    for( ; box1.x < box1.width; ++box1.x)
                        if(tiles[box1.x - 1][box1.y - 1] && rhs.tiles[][]) // was muss ich bei rhs.tiles[hier][einfügen]?
                            return true;
                }
    
                return false;
            }
    

    Ich versuche eine Text-Objekt-Kollision (Ncurses) zu machen, dabei handelt es sich bei tiles um einen vector<vector<char>> . In der Intersektion muss ich überprüfen ob beide Tiles nicht Null sind, wenn ja, hat eine Kollision stattgefunden.



  • Ups, bei has_collision hab ich ein Zeichen zu viel weggekürzt, sorry für das. Es geht um Zeile 19.



  • Kann jemand den Thread für mich mal ins C++-Forum verschieben? Ich hab zwar kein C++ Problem, aber vielleicht weiß da jemand wie ich das machen soll?



  • Puuhh... Habs raus.

    Die for-Schleifen sind schonmal nicht korrekt, und zweitens die x und y muss von den Positionen der Boxen abziehen.

    Problem solved.



  • Multipost schrieb:

    Oben hat sich ein Fehlerühühüchen eingeschlichen, jetzt sollte es besser stimmen, evntl. immer noch nicht ganz.

    `if(l1 < l2) i_box_l = l2 else i_box_l = l1;

    if(r1 > r2) i_box_r = r2 else i_box_r = r1;

    if(b1 < b2) i_box_b = b2 else i_box_b = b1;

    if(t1 > t2) i_box_t = t2 else i_box_t = t1;`



  • Du bringst mich durcheinander.

    Antworte entweder richtig oder gar nicht. Ich bin der Meinung den/die Fehler gefunden zu haben, wenn dem nicht so ist, wäre ich dankbar, dass mich einer erleuchten könnte.

    Ansonsten hat sich das Thema erledigt.


Anmelden zum Antworten