Autor Beitrag
fox67
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 09.09.10 10:05 
wie kann man überprüfen ob ein canvas recangle ein anderes überlappt. also auch wenn es nur ein pixe ist


Zuletzt bearbeitet von fox67 am Sa 11.09.10 14:36, insgesamt 1-mal bearbeitet
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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:

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

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: BenBE
helgew
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Do 30.09.10 23:36 
nicht mehr ganz aktuell, der thread hier ... aber so kanns funktionieren:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 01.10.10 14:17 
Hallo,

die WinAPI bietet schon IntersectRect(...) dafür, ein Beispiel:
ausblenden 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');

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )