![]() |
Überprüfen ob ein rectangle ein anderes überlappt
Hallo ich bin gerade dabei ein spiel zu programmieren und würde gerne wissen wie man überprüfen kann ob ein tcanvas recangle ein anderes üperlappt(und auch wenn es hur ein einziger Pixel ist)
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
schau Dir mal IntersectRect an...
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Das geht am Einfachsten mit
![]() |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Und wie funktioniert dieses IntersectRect
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Delphi-Quellcode:
In r ist bei Überlappung der überlappende Bereich
var
r:TRect; begin if InterSectRect(r, Image1.BoundsRect, Image2.BoundsRect) then Showmessage('Kollision'); end; |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Code:
wäre der code dann so richtig?
var
r:TRect; begin if InterSectRect(r, rCanvas.rectangle(Gauner.x*16, Gauner.y*16, Gauner.x*16+16, Gauner.y*16+16), rCanvas.rectangle(Polizei.x*16, Polizei.y*16, Polizei.x*16+16, Polizei.y*16+16)) then estgenommen :=true; end; |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Nein. Was hat der Canvas da zu suchen? Canvas.Rectangle ist eine Methode.
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
ja aber mir gehts es ja darum dass ich überprüfe ob ein canvas rectangle ein anderes überlappt
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Drück mal auf InterSectRect F1 und lies dir die Hilfe durch. Unter D7 funktioniert die ja noch. Dort ist dann beschrieben, wie die Parameter aussehen müssen und mit Glück auch ein Beispiel dabei.
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Tja leider kommt nur dass heraus
Zitat:
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Deshalb hatte ich die Funktion auch verlinkt (#3).
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Ah, sorry mein Fehler. Ist ja ne WinAPI Funktion.
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
macht nichts
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Man kann es aber auch so machen:
Delphi-Quellcode:
function RectInRect(const Rect1, Rect2: TRect): Boolean;
begin Result := (Rect1.Left >= Rect2.Left) and (Rect1.Right <= Rect2.Right) and (Rect1.Top >= Rect2.Top) and (Rect1.Bottom <= Rect2.Bottom); end; //oder function OverlapRect(const Rect1, Rect2: TRect): Boolean; begin Result := (Rect1.Left < Rect2.Right) and (Rect1.Right > Rect2.Left) and (Rect1.Top < Rect2.Bottom) and (Rect1.Bottom > Rect2.Top); end; ich denke, die zweite Function ist besser geeignet 8-) |
AW: Überprüfen ob ein rectangle ein anderes überlappt
und wie würde dass dann mit einem canavas rectangle aussehen
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Delphi-Quellcode:
If OverlapRect(Rect(1, 1, 8, 8), Rect(7, 2, 9, 9)) then ...
Du und dein Canvas ... da hat der Canvas nix verloren! |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Zitat:
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
jetzt hab ich eine Idee würde es funktioniere wenn ich an die position des canvas rectangels ein timage anhefte mit der gleichen größe wie wie das canvas?
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Alle Antworten beziehen sich immer auf Koordinaten, diese haben keine Bindung zu einem Canvas, Image was auch immer. Wenn Du etwas malen willst hast Du auch schon Koordinaten.
Wenn Du vor dem Malen auf eine Kollision prüfen willst, verwende die genannten Funktionen um zu prüfen ob Du mit den Koordinaten mit denen Du malen möchtest ein "Problem" bekommst. Oder meinst Du etwas ganz anderes .... |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Es würde funktionieren, wenn Du einfach die beiden Rechtecke angibst, dazu braucht man doch kein Image.
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Zitat:
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Du hast 2 Rechtecke, nicht Canvas.Rectangle :!: Diese Rechtecke werden ja wohl über 4 Punkte definiert. Nun nimmst Du diese 4 Punkte und wandelst sie mittels der Rect-Function in 2 TRect, die Du der Berechnung übergeben kannst.
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Meinst Du, Du haste zwei Images oder Shapes oder ähnliches welche Du hin und her schubst, falls ja dann Posting #5, ansonsten versteht hier niemand was Du nicht verstehst.
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Ich kann mich vielleicht noch eher in Anfänger hineindenken: :-D
Du hast zwei Möglichkeiten: Entweder, Du setzt 2 Komponenten (z.B. TImage oder testweise TPanel, eines rot, eines grün) auf ein Formular oder auf ein Panel, deren Position Du dann mit Left und Top änderst (dann brauchst Du Dich mit einem Canvas nicht herumschlagen, da die Komonenten automatisch gezeichnet werden) -oder- Du nimmst Dir irgendeine Komponente und zeichnest auf dessen Canvas zwei bunte Rechtecke (das ist etwas umständlicher, da Du diese Bereiche bei Verschiebungen löschen und versetzt neu zeichnen musst; auch das Steuern mit der Maus oder Tastatur ist etwas aufwendiger). In BEIDEN Fällen kannst Du aber nicht automatisch prüfen, ob es Überschneidungen gibt. Du musst die 2 Bereiche in TRect-Variablen speichern (egal, was nun tatsächlich auf dem Bildschirm passiert) und kannst die zwei TRect auf Überscneidungen prüfen... |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Zitat:
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Zitat:
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Zitat:
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Hallo,
Google-Suche ist kaputt ? ![]() Steht doch alles schön da ... Heiko |
AW: Überprüfen ob ein rectangle ein anderes überlappt
:wall::wall: wusst ich's doch :dance:
@hoika Du hast den Threadverlauf nicht verfolgt,oder... |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Blöde frage ABER:
Code:
Kann es nicht sein das obige funktionen beide nicht zum ziel führen? Die overlap zum beispiel erfordert doch das ALLE4 punkte des ersten im zweiten Rect liegen. Overlap heißt für mich aber auch das schon ein punkt im Anderen rechteck genügt o.O(ebend überlappend/überschneidend)
function RectInRect(const Rect1, Rect2: TRect): Boolean;
begin Result := (Rect1.Left >= Rect2.Left) and (Rect1.Right <= Rect2.Right) and (Rect1.Top >= Rect2.Top) and (Rect1.Bottom <= Rect2.Bottom); end; //oder function OverlapRect(const Rect1, Rect2: TRect): Boolean; begin Result := (Rect1.Left < Rect2.Right) and (Rect1.Right > Rect2.Left) and (Rect1.Top < Rect2.Bottom) and (Rect1.Bottom > Rect2.Top); end; Korrektes Overlapping müsste doch so aussehen(oder nicht?):
Code:
MFG
function IsOverlapping(ARect1, ARect2: TRect): Boolean;
begin Result := NOT((ARect1.Left > ARect2.Right) OR (ARect1.Right < ARect2.Left) OR (ARect1.Top < ARect2.Bottom) OR (ARect1.Bottom > ARect2.Top)); end: Memnarch |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Die Overlap-Funktion definiert Überlappung dadurch, dass das eine Rechteck nicht komplett rechts, links, oben oder unten des anderen steht. Das sollte schon korrekt sein IMO.
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
@Memnarch:
Wenn du alles umkehrst, also aus AND ein OR machst und aus "Größer als" ein "Kleiner gleich" usw., und dann vor die ganzen Sache noch ein NOT stellst, hast du exakt die gleiche Abfrage geschaffen :wink: |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Aha..hatte die funktion so gelesen als ob sie TRUE zurückgibt wen alle 4 ecken von rechteck a in rechteck b sin :stupid:
|
AW: Überprüfen ob ein rectangle ein anderes überlappt
Vielleicht liegt es daran, daß die einen von völliger Abdeckung eines Rechteckes durch ein anderes reden, andere bereits eine Teilabdeckung meinen. Wenn's ein Spiel mit Kollisionen ist, sollte man besser auf ein Berühren testen.
Konkret müssen 4 Fälle geprüft werden: 1) Stößt die Oberkante von Objekt A an die Unterkante von Objekt B, ... wenn die linke Kante von A links von der rechten Kante von B liegt UND rechts von der linken Kante von B ODER die rechte Kante von A rechts von der linken Kante von B UND links von der rechten Kante von B liegt, dann besteht die Möglichkeit, wenn Oberkante A gleich oder höher Unterkante B UND Oberkante A gleich oder niedriger Oberkante B liegt. 2) Stößt die Unterkante von Objekt A an die Oberkante von Objekt B, ... wenn die linke Kante von A links von der rechten Kante von B liegt UND rechts von der linken Kante von B ODER die rechte Kante von A rechts von der linken Kante von B UND links von der rechten Kante von B liegt, dann besteht die Möglichkeit, wenn Unterkante A gleich oder niedriger Oberkante B UND Oberkante A gleich oder höher Oberkante B liegt. 3) Stößt die linke Kante von Objekt A an die rechte Kante von Objekt B, ... wenn die obere Kante von A oberhalb von der unteren Kante von B liegt UND unterhalb der oberen Kante von B ODER die untere Kante von A unterhalb der oberen Kante von B UND oberhalb der unteren Kante von B liegt, dann besteht die Möglichkeit, wenn linke Kante A gleich oder linker von rechter Kante B UND linke Kante A gleich oder rechter linker Kante B liegt. 4) Stößt die rechte Kante von Objekt A an die linke Kante von Objekt B, ... wenn die obere Kante von A oberhalb von der unteren Kante von B liegt UND unterhalb der oberen Kante von B ODER die untere Kante von A unterhalb der oberen Kante von B UND oberhalb der unteren Kante von B liegt, dann besteht die Möglichkeit, wenn rechte Kante A gleich oder rechter von linker Kante B UND rechte Kante A gleich oder linker rechter Kante B liegt. MfG mz23 |
AW: Überprüfen ob ein rectangle ein anderes überlappt
Und damit man sich darüber nicht den Kopf zerbrechen muss, kann man auf IntersectRect zurückgreifen. Somit wären wir wieder am Anfang des Threads.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz