Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

1

28.05.2005, 22:43

Kollision von zwei Rechtecken berechnen

Hi,
ich habe mir das Tutorial auf der Seite bereits durchgelesen und auch die Suchfunktion benutzt, aber ich habe dennoch eine Frage.

Ich möchte prüfen ob zwei Rechtecke sich schneiden/überlappen.
Bei beiden habe ich folgende Informationen x,y,länge,breite.
Der Punkt (0|0) ist links oben.

Nehmen wir an ich habe ein Rechteck A und ein Rechteck B, mit folgenden Daten:

aX = 10
aY = 10
aBreite = 50
aHöhe = 50

bX = 15
bY = 17
bBreite = 50
bHöhe = 50

A hat folgende Seiten
aLinks
aRechts
aOben
aUnten

B hat folgende Seiten
bLinks
bRechts
bOben
bUnten

Wenn ich das ganze richtig verstanden habe so muss ich folgende Linienpaare prüfen:

aLinks mit bOben
aLinks mit bUnten
aRechts mit bOben
aRechts mit bUnten
aOben mit bRechts
aOben mit bLinks
aUnten mit bRechts
aUnten mit bLinks

Ist das so richtig?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

29.05.2005, 09:54

Da es Rechtecke sind, deren Linien nur zwei Richtungen haben können, kannst Du da allerdings noch viel optimieren.

Anonymous

unregistriert

3

29.05.2005, 12:09

Inwiefern kann ich da noch viel optimieren?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

29.05.2005, 13:04

Es ist mit viel weniger Aufwand verbunden, zwei rechtwinklig oder parallel zueinander verlaufende Linien auf Kollision zu prüfen als zwei beliebige Linien.

Atlan

Frischling

Beiträge: 27

Wohnort: Deutschland, NRW

Beruf: Azubi

  • Private Nachricht senden

5

29.05.2005, 14:53

Wenn du 2 Rechtecke hast, die sich nicht drehen können, ist das viel einfacher...

Die 4 Seiten Alinks & Arechts & Blinks & Brechts sind parallel.
Die 4 Seiten Aoben & Aunten & Boben & Bunten sind parallel.

Die Kolisionsprüfung könnte ca. so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
bool KolisionsprüfungVonZweiRechtecken
{
   if(Alinks > Brechts && Aoben > Bunten)
      return true;
   else if(Blinks > Arechts && Boben > Aunten)
      return true;
   return false;
}


Ich garantiere nicht für die Richtigkeit der Funktion :D

mfg
Atlan

edit:
Die Variablen Alinks & Arechts & Aoben & Aunten & Blinks & Brechts & Boben & Bunten sind alle integer oder floats!

Quellcode

1
Alinks = ALinkeObereEcke.x

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

29.05.2005, 15:13

Diese Funktion ist auf jeden Fall falsch.
Teste mal ein paar simple Fälle, wo die Rechtecke sich nicht schneiden - dann wirst Du es sehen!

Atlan

Frischling

Beiträge: 27

Wohnort: Deutschland, NRW

Beruf: Azubi

  • Private Nachricht senden

7

29.05.2005, 15:41

Ähmm ja, da hab ichs mir auf jeden Fall zu leicht gemacht;)

Neuer Ansatz:
Rechteck A&B werden jeweils durch 2Punkt beschrieben (linksOben & RechtsUnten)

Eine Kolision liegt vor wenn folgendes Eintritt:
Mindestens ein Punkt von Rechteck A liegt zwischen den beiden Punkten von Rechteck B! ODER
Mindestens ein Punkt von Rechteck B liegt zwischen den beiden Punkten von Rechteck A!

Neue Funktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct SRechteck
{
   Vector2 LinksOben;
   Vector2 RechtsUnten;
};

bool KolisionZweierRechtecke(SRechteck A, SRechteck B)
{
   if(A.LinksOben < B.LinksOben && A.LinksOben > B.RechtsUnten)
      return true;
   else if(B.LinksOben < A.LinksOben && B.LinksOben > A.RechtsUnten)
      return true;
   else if(A.RechtsUnten > B.LinksOben && A.RechtsUnten < B.RechtsUnten)
      return true;
   else if(B.RechtsUnten > A.LinksOben && B.RechtsUnten < A.RechtsUnten)
      return true;

   return false;
}


David, passt die Funktion jetzt wenigstens? :D

mfg
Atlan

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

29.05.2005, 16:18

Noch nicht ganz.
Es gibt nämlich auch Fälle, wo die Rechtecke sich zwar schneiden, aber kein Eckpunkt des einen Rechtecks innerhalb des Anderen liegt.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

29.05.2005, 16:53

"Wenn du 2 Rechtecke hast, die sich nicht drehen können, ist das viel einfacher... " in dem Falle geht es nciht ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

29.05.2005, 17:07

Zitat von »"Nox"«

"Wenn du 2 Rechtecke hast, die sich nicht drehen können, ist das viel einfacher... " in dem Falle geht es nciht ;)

Was geht dann nicht?
Ich meine so etwas hier:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
     ___
    |   |
    |   |
    |   |
 ___|___|___
|   |   |   |
|___|___|___|
    |   |
    |   |
    |   |
    |___|


Auch bekannt als "Kreuz" ;)
Kein Eckpunkt des einen Rechtecks liegt im Anderen, trotzdem schneiden sie sich.

Werbeanzeige