Ü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)