Entwickler-Ecke

Multimedia / Grafik - wie überprüft man ob ein tcanavas rechteck ein andres berürt


fox67 - Do 09.09.10 10:05
Titel: wie überprüft man ob ein tcanavas rechteck ein andres berürt
wie kann man überprüfen ob ein canvas recangle ein anderes überlappt. also auch wenn es nur ein pixe ist


Hidden - Do 09.09.10 10:16

Moin!

Nach dem Zeichnen, oder vor?
Vor dem Zeichnen ist einfach: Für alle Eckpunkte des TRect überprüfen, ob sie im 2. TRect liegen..

Nach dem Zeichnen(wenn du das Bild also nicht selber zeichnest, z.B. als Bitmap übergeben bekommst) musst du wohl erst einmal die Pixel auswerten, um auf die Eckpunkte zu kommen.

lg,


Martok - Do 09.09.10 15:43

Hallo,

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien [http://www.entwickler-ecke.de/richtlinien.html]:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. TCanvas könntest du, so es denn wichtig ist, in der "Betrifft"-Zeile eintragen. Danke Dir!

Viele Grüße,
Martok


helgew - Do 30.09.10 23:36

nicht mehr ganz aktuell, der thread hier ... aber so kanns funktionieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
   function Constrain(min, max, value: longint): longint; 
    begin
       result := value;
       if value < min then result := min;
       if value > max then result := max;
    end;

    function EmptyIntersection (Intersection: TRect): Boolean;
    begin
      result := ((Intersection.Left = Intersection.Right)
              or (Intersection.Top  = Intersection.Bottom));
    end;

    function IntersectionRect(inner, outer: TRect): TRect;
    begin;
      result.Left   := Constrain(outer.left,outer.Right, inner.Left);
      result.right  := Constrain(outer.left,outer.Right, inner.right);
      result.Top    := Constrain(outer.Top,outer.Bottom, inner.Top);
      result.Bottom := Constrain(outer.Top,outer.Bottom, inner.Bottom);
    end;



Man prüft einfach, ob der Schnitt der beiden Rechtecke leer ist. Wenn man die Rechtecke selbst zeichnet, sollte man diese ohnehin zwischenspeichern, mit den GDI-Funktionen (GetPixel) wieder herumlesen ist furchtbar langsam.


Lannes - Fr 01.10.10 14:17

Hallo,

die WinAPI bietet schon IntersectRect(...) dafür, ein Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var rDest, r1, r2: TRect;
begin
  r1 := Rect(0,0,100,100);
  Canvas.Brush.Color := clRed;
  Canvas.FillRect(r1);
  r2 := Rect(90,90,200,200);
  Canvas.Brush.Color := clBlue;
  Canvas.FillRect(r2);
  if IntersectRect(rDest, r1, r2) then
    begin
    showmessage('r2 überlappt r1');
    Canvas.Brush.Color := clBlack;
    Canvas.FillRect(rDest);
    end
    else
      showmessage('Keine Überlappung');