Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - ... den überschneidenden Bereich zweier Rechtecke berechnen?


GTA-Place - So 06.08.06 17:26
Titel: ... den überschneidenden Bereich zweier Rechtecke berechnen?
Wenn ich 2 Rechtecke vom Typ TRect übereinander liegen habe, wie kann ich dann den überschneidenen Bereich berechnen?


Wenn man sicher ist, dass sich 2 Rechtecke überlagen
1:
2:
3:
4:
5:
6:
7:
function ColRect(A, B: TRect): TRect;  
begin  
  Result.Left   := max(min(A.Right, B.Left), min(A.Left, B.Right));  
  Result.Right  := min(max(A.Right, B.Left), max(A.Left, B.Right));  
  Result.Top    := max(min(A.Bottom, B.Top), min(A.Top, B.Bottom));  
  Result.Bottom := min(max(A.Bottom, B.Top), max(A.Top, B.Bottom));  
end;



Wenn man nicht sicher ist, ob sich 2 Rechtecke überlagern
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function ColRect(A, B: TRect): TRect;
var
  IsCol: Boolean;
begin
  IsCol := (A.Left <= B.Right) AND (A.Right >= B.Left) AND (A.Top <= B.Bottom) AND (A.Bottom >= B.Top);

  if IsCol then
  begin
    Result.Left   := max(min(A.Right, B.Left), min(A.Left, B.Right));
    Result.Right  := min(max(A.Right, B.Left), max(A.Left, B.Right));
    Result.Top    := max(min(A.Bottom, B.Top), min(A.Top, B.Bottom));
    Result.Bottom := min(max(A.Bottom, B.Top), max(A.Top, B.Bottom));
  end;
end;


Aufzurufen mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  Rect1, Rect2, Rect3: TRect;
begin
  Rect1 := Rect(1010100100);
  Rect2 := Rect(5050150150);

  Rect3 := ColRect(Rect1, Rect2);

  ShowMessage('Der überschneidende Bereich ist ' + IntToStr(Rect3.Right - Rect3.Left) + ' Pixel breit.');
  ShowMessage('Der überschneidende Bereich ist ' + IntToStr(Rect3.Bottom - Rect3.Top) + ' Pixel hoch.');
end;


Ich hoffe, dass es das noch nicht gab. Ist mein erster FAQ-Eintrag :-).