Autor |
Beitrag |
fox67
Hält's aus hier
Beiträge: 2
|
Verfasst: 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
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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  oder  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
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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'); |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
|