Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Überprüfen ob ein rectangle ein anderes überlappt (https://www.delphipraxis.net/157461-ueberpruefen-ob-ein-rectangle-ein-anderes-ueberlappt.html)

fox67 12. Jan 2011 15:45

Ü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)

stahli 12. Jan 2011 15:46

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
schau Dir mal IntersectRect an...

DeddyH 12. Jan 2011 15:47

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Das geht am Einfachsten mit MSDN-Library durchsuchenIntersectRect.

fox67 12. Jan 2011 16:04

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Und wie funktioniert dieses IntersectRect

Bummi 12. Jan 2011 16:10

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Delphi-Quellcode:
var
  r:TRect;
begin
  if InterSectRect(r, Image1.BoundsRect, Image2.BoundsRect) then Showmessage('Kollision');

end;
In r ist bei Überlappung der überlappende Bereich

fox67 12. Jan 2011 16:17

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Code:
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;
wäre der code dann so richtig?

DeddyH 12. Jan 2011 16:25

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Nein. Was hat der Canvas da zu suchen? Canvas.Rectangle ist eine Methode.

fox67 12. Jan 2011 16:28

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

mquadrat 12. Jan 2011 16:31

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.

fox67 12. Jan 2011 16:34

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Tja leider kommt nur dass heraus
Zitat:

0 Ergebnisse für InterSectRect

DeddyH 12. Jan 2011 16:38

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Deshalb hatte ich die Funktion auch verlinkt (#3).

mquadrat 12. Jan 2011 16:44

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Ah, sorry mein Fehler. Ist ja ne WinAPI Funktion.

fox67 12. Jan 2011 16:45

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
macht nichts

Progman 12. Jan 2011 19:20

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-)

fox67 13. Jan 2011 14:11

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
und wie würde dass dann mit einem canavas rectangle aussehen

Deep-Sea 13. Jan 2011 14:14

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!

DeddyH 13. Jan 2011 14:18

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Zitat:

Zitat von Deep-Sea (Beitrag 1074481)
da hat der Canvas nix verloren!

Sach ich ja auch schon die ganze Zeit ;)

fox67 13. Jan 2011 14:42

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?

Bummi 13. Jan 2011 14:49

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 ....

DeddyH 13. Jan 2011 14:50

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.

fox67 13. Jan 2011 14:58

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Zitat:

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 ....
Also ich habe zwei Tcanvas rectangle das eine kann der spieler steuern dass andere versucht den anderen zu fangen und deshalb versuche ich zu überprüfen ob eins der canvas das andere überlappt

DeddyH 13. Jan 2011 15:00

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.

Bummi 13. Jan 2011 15:32

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.

stahli 13. Jan 2011 15:40

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...

blauweiss 13. Jan 2011 17:47

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Zitat:

Zitat von Bummi (Beitrag 1074515)
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.

Posting des Jahres :-D Bummi, ich liebe Deinen Schreibstil einfach :thumb:

DeddyH 13. Jan 2011 17:57

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Zitat:

Zitat von blauweiss (Beitrag 1074530)
ich liebe Deinen Schreibstil einfach :thumb:

Auf einem Canvas.Rectangle sähe das aber bestimmt anders aus :mrgreen:

Bummi 13. Jan 2011 20:10

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Zitat:

Canvas.Rectangle
ein No-go in diesem Thread, da wird sicher noch jemand fragen wie man da Kollisionen erkennen kann...

hoika 13. Jan 2011 20:28

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Hallo,

Google-Suche ist kaputt ?

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Steht doch alles schön da ...


Heiko

Bummi 13. Jan 2011 20:34

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
:wall::wall: wusst ich's doch :dance:
@hoika
Du hast den Threadverlauf nicht verfolgt,oder...

Memnarch 14. Jan 2011 10:51

AW: Überprüfen ob ein rectangle ein anderes überlappt
 
Blöde frage ABER:

Code:
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;
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)

Korrektes Overlapping müsste doch so aussehen(oder nicht?):

Code:
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:
MFG
Memnarch

DeddyH 14. Jan 2011 10:56

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.

Deep-Sea 14. Jan 2011 10:59

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:

Memnarch 14. Jan 2011 21:59

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:

mz23 16. Jan 2011 16:55

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

DeddyH 16. Jan 2011 17:14

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 00:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz