Überlappende Rechtecke feststellen



  • Hallo.

    Ich würde gerne feststllen wollen, ob 2 Komponenten sich überlappen.

    Gibt es einen einfacheren Weg als zu schauen, ob eine der 4 Koordinaten (Left,Top,(Left+Width),(Top+Height)) einer Komponente innerhalb der anderen Komponente ist?



  • Hallo

    Da ich keine entsprechende Mehtode in TControl oder TWinControl finde, sage ich mal, das du selber einen Vergleich über die Koordinaten machen must.

    bis bald
    akari



  • Die WIN 32 API hat eine solche Funktion enthalten. Leider ist mir der Name entfallen (interrect oder so ähnlich)



  • du meinst sicher IntersectRect



  • Ui, sehr Schade das es keine solche Funktion für float Koordinaten gibt 🙂



  • Joo, die meinte ich



  • minomin schrieb:

    Ui, sehr Schade das es keine solche Funktion für float Koordinaten gibt 🙂

    die sind mit 2-3 zeilen code selber geschrieben!



  • Redensart oder wirklich 2-3 Zeilen?
    Ich habe eine Funktion, wo ich jeweils (float) left,top,reight und bottom schaue ob eine der 4 innerhalb des 2. Rechteckes liegen. Das sind aber wesentlich mehr als 2 Zeilen. 🙂
    Gibt's ne bessere schnellere Lösung?



  • ich habe mir ne eigene template-klasse Rect gebastelt. hier mal zwei funktionen zum testen auf einen punkt innerhalb eines rechtecks und auf ueberschneidung (liefert nur true/false, keinen schnittpunkt).

    Left, Right, Top, Bottom sind natuerlich auch vom Typ T.

    //---------------------------------------------------------------------------
    // Funktion prüft ob der übergebenen Punkt innerhalb des Rechtecks liegt
    // -> ein Punkt liegt innerhalb des Rechtecks, wenn er sich auf der
    //    oberen bzw. linken Seite oder innerhalb aller 4 Seiten befindet
    // -> ein Punkt auf der rechten oder unteren Seite liegt ausserhalb!
    //---------------------------------------------------------------------------
    template <typename T> 
    inline bool Rect<T>::Contains(const T &x, const T &y) const
    {
      return ((x >= Left) && (x < Right) && (y >= Top) && (y < Bottom));
    }
    
    //---------------------------------------------------------------------------
    // Funktion prüft ob sich die beiden Rechtecke überschneiden.
    //---------------------------------------------------------------------------
    template <typename T> 
    inline bool Rect<T>::Intersect(const Rect<T> &rhs) const
    {
      return (Contains(rhs.Top, rhs.Left) || Contains(rhs.Bottom, rhs.Right));
    }
    

    wie du siehst, sinds effektiv nur 2 zeilen code (nur das was in den funktionen steht zählt)


Anmelden zum Antworten