Interessante Funktionen für Rechtecke

Die Windows 32 API enthält einige nette Funktionen für den Umgang mit Rechtecken, die das entwickeln doch vereinfachen können.Die Windows-API erwartet immer einen Zeifer auf eine RECT Struktur (LPRECT ). Dabei wird in der Struktur left, top, right, bottom angegeben. Damit sind die absoluten Koordinaten des Rechteckes gemeint. Das setzen eines Rechteckes mit SetRect(LPRECT rec,100,100,120,120); ergibt also ein Rechteck welches an der Position 100,100 beginnt und an der Position 120,120 endet und somit 20 Pixel groß ist.

SetRect

Setzt die Werte für ein Rechteck

SetRect(LPRECT rec,left,top,right,bottom);

SetRectEmpty

Setzt alle Werte eines Rechtecks auf 0

SetRectEmpty(LPRECT rec);

CopyRect

Kopiert ein Rechteck

CopyRect(LPRECT dest,LPRECT source);

EqualRect

Prüft, ob zwei Rechtecke gleich sind

EqualRect(LPRECT rec1,LPRECT rec2);

IsRectEmpty

Prüft, ob ein Rechteck leer ist, also Höhe UND Breite sind 0

IsRectEmpty(LPRECT rec);

PtInRect

Prüft, ob ein Punkt innerhalb eines Rechtecks liegt oder nicht. pt ist eine POINT Struktur.

PtInRect(LPRECT rec,pt);

OffsetRect

Verschiebt ein Rechteck um die angegebenen Werte, wobei negative Werte nach links bzw. nach oben verschieben

OffsetRect(LPRECT rec,x,y);

InflateRect

Dehnt oder staucht ein Rechteck um die angegebenen Werte, wobei negative Werte ein Stauchen bewirken

InflateRect(LPRECT rec,x,y);

IntersectRect

Prüft, ob sich zwei Rechtecke überlappen und gibt die Schnittmenge zurück

InflateRect(LPRECT dest,LPRECT rec1, LPRECT rec2);

UnionRect

Gibt die größtmögliche Fläche zweier Rechtecke zurück. Führt also beide Rechtecke zusammen

InflateRect(LPRECT dest,LPRECT rec1, LPRECT rec2);

Der C++Builder kennt zusätzlich zu der WIN 32 API Struktur RECT den Typ TRect. Dieser wird für die Funktionen (bsp. Canvas->FillRect) des C++Builders benutzt. Die Initialisierung kann direkt mit

TRect re(100,100,150,150);
oder
TRect re(TPoint,TPoint);

erfolgen (Es gibt auch Funktionen, die das machen, sind aber m.E. durch die obigen Möglichkeiten obsolet. Das obige Beispiel hat ein Rechteck von der Position 100,100 bis zur Position 150,150 also in einer Größe von 50 Pixel erzeugt. Mit den Methoden Width und Height kann die Weite und Höhe des Rechtecks ermittelt werden. In diesem Beispiel 50. Die TRect Struktur ist mit der RECT Struktur der WIN 32 API kompatibel. Das heisst, ein Aufruf einer der WIN 32 API Funktionen kann direkt mit der TRect Struktur erfolgen.

bool test=IsRectEmpty(re);

Hier noch zwei Templates für die Prüfung, ob ein Punkt innerhalb eines Rechteckes liegt oder ob sich zwei Rechtecke überlappen.

//--------------------------------------------------------------------------- 
// 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 const bool Rect<T>::Intersection(const Rect<T> &rhs) const {
  return ((Bottom > rhs.Top)  && (Top  < rhs.Bottom) &&
          (Right  > rhs.Left) && (Left < rhs.Right));
}

Die beiden Routinen wurden von Rico Sonntag aus dem C++Forum entwickelt.

Zur Übersicht