AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Kollision zweier 2dim Polygonen.
Thema durchsuchen
Ansicht
Themen-Optionen

Kollision zweier 2dim Polygonen.

Ein Thema von Chris88 · begonnen am 8. Dez 2006 · letzter Beitrag vom 9. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Chris88

Registriert seit: 25. Sep 2005
4 Beiträge
 
#1

Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 00:11
Hi, ich suche einen ähnlichen Algorithmus für 2 Polygone, wie es man ihn überall für die Kollision von einem Punkt und einem Polygon findet.
Bewegung ist dabei relativ egal. Ich will einfach nur wissen, ob zwei 2dim Polygone kollidieren.

Habe bisher recht wenig gefunden. Das beste von allem waren Algorithmen in anderen Programmiersprachen, welche dort spezifische Funktionen benutzen, welche ich wohl schlecht in Delphi konvertieren könnte. Geschweige denn verstehen.

Gruß
Chris
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#2

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 02:35
Zitat von Chris88:
Hi, ich suche einen ähnlichen Algorithmus für 2 Polygone, wie es man ihn überall für die Kollision von einem Punkt und einem Polygon findet.
Bewegung ist dabei relativ egal. Ich will einfach nur wissen, ob zwei 2dim Polygone kollidieren.

Habe bisher recht wenig gefunden. Das beste von allem waren Algorithmen in anderen Programmiersprachen, welche dort spezifische Funktionen benutzen, welche ich wohl schlecht in Delphi konvertieren könnte. Geschweige denn verstehen.

Gruß
Chris
Hallo,

2 Polygone kollidieren, wenn sich irgendwelche ihrer Umrandungslinien schneiden. D.h. bei 1 Fünf- und 1 Sechseck 5 x 6 = 30 mal berechnen, ob sich 2 Geradenstücke (nicht Geraden!) schneiden. Ich weiss nicht, ob es eine schnellere Möglichkeit gibt.

Gruss Reinhard
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 08:46
Hallo Chris,

ich kann keine Aussage über die zu erreichende Geschwindigkeit machen, aber hast du es schon einmal mit den Region-Befehlen aus der Win32-API versucht? Mit MSDN-Library durchsuchenCreatePolygonRgn kannst du aus deinen Polygonen jeweils eine Region erzeugen, mit MSDN-Library durchsuchenCombineRgn und dem Modus RGN_AND prüfst du, ob es Überdeckungen gibt.

Gruß Hawkeye

PS: Willkommen in der Delphi-PRAXiS!
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 09:22
Du Must auch Berücksichtigen das 1 Polygon Komplett in einem Anderen drin sein kann.

Ich zieh mir zu diesem Zeug grad die Ganze Theorie rein. Aber es wird noch ein paar Tage dauern bis ich verwertbare Ergebnisse habe.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#5

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 10:28
Solange die Polygone beide Konvex sind, kollidieren sie, wenn ein Punkt des ersten im zweiten oder ein Punkt des zweiten im ersten liegt.
Nachdem Du wie Du schriebst bereits einen Algorithmus hast, der einen Punkt mit einem Poly vergleicht sollte das einfach sein.
Du kannst aber auch zuerst jeweils den Umkreis (Oder Umrechteck, ist schneller, aber ungenauer) beider Polygone berechnen (einmal reicht, oder sobald sie sich ändern) und erstmal gucken, ob sich die Umkreise berühren. Wenn nein kollidieren sie nicht, wenn ja, musst Du Punktgenau werden.

Bei Konvexen Polygonen gilt die erste Regel immernoch, aber in der Einschränkung, dass wenn nicht, die Polys dennoch kollidieren können. In dem Fall musst Du dann wirklich alle Seiten paarweise kreuzen.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#6

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 11:58
Zitat von Corpsman:
Du Must auch Berücksichtigen das 1 Polygon Komplett in einem Anderen drin sein kann.

Ich zieh mir zu diesem Zeug grad die Ganze Theorie rein. Aber es wird noch ein paar Tage dauern bis ich verwertbare Ergebnisse habe.
Hallo,

ja, das habe ich übersehen. Aber das bedeutet nur, dass man noch 2 Prüfungen Punkt zu Polygon anhängen muss, wobei es ja egal ist, welchen Punkt man jeweils nimmt, also am einfachsten den Startpunkt für den Umriss.

Gruss Reinhard
  Mit Zitat antworten Zitat
Chris88

Registriert seit: 25. Sep 2005
4 Beiträge
 
#7

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 15:15
Das mit dem gegenseitigen Punkttest, kommt mir etwas Langsam vor.
Versuche gerade die Lösung von Hawkeye219 zu realisieren. Mir fehlt allerdings noch eine Zeile :-/

Code:
function PolygonInPolygon(PointArrayA, PointArrayB: Array of TPoint):boolean;
var RgnA, RgnB, RgnC: hdc;
begin
  RgnA := CreatePolygonRgn(PointArrayA,Length(PointArrayA),Winding);
  RgnB := CreatePolygonRgn(PointArrayB,Length(PointArrayB),Winding);
  try
    CombineRgn(
      RgnC,      // handle to destination region
      RgnA,      // handle to source region
      RgnB,      // handle to source region
      RGN_AND    // region combining mode
    );
    (* Hier muss natürlich jetzt eine Abfrage stehen, ob es RgnB ein Polygon ist *)
  finally
    DeleteObject(RgnA);
    DeleteObject(RgnB);
    DeleteObject(RgnC);
  end;
end;
Wie muss jetzt mein Vergleich jetzt Aussehen? Ich kenne mich mit Regionen in keinster Weise aus.
Für meinen Punkttest benutze ich übrigens auch die Windows API Funktion.

Gruß
Chris
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#8

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 15:21
Der Rückgabewert von CombineRgn kann einer der folgenden sein:

Zitat:
NULLREGION The region is empty.
SIMPLEREGION The region is a single rectangle.
COMPLEXREGION The region is more than a single rectangle.
ERROR No region is created.
Wenn SIMPLEREGION oder COMPLEXREGION dabei rauskommt, kollidieren die also, schätze ich.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 15:54
Wie wäre es damit? Ich hatte schonmal das selbe Problem...

http://www.coding-board.de/board/sho...6002#post96002

EDIT: Ich habe den Code mal hier her kopiert, um toten Links vorzubeugen:

Delphi-Quellcode:
type
  TPointArray = array of TPoint;

function PointInPolygon(const Polygon : TPointArray; const P : TPoint): boolean;
var
  ToTheLeftofPoint, ToTheRightofPoint : byte;
  np : integer;
  OpenPolygon : boolean;
  XIntersection : real;
begin
  ToTheLeftofPoint := 0;
  ToTheRightofPoint := 0;
  OpenPolygon := False;

  if not ((Polygon[0].X = Polygon[High(Polygon)].X) and
   (Polygon[0].Y = Polygon[High(Polygon)].Y)) then
   OpenPolygon := True;

  for np := 1 to High(Polygon) do
   if ((Polygon[np - 1].Y <= P.Y) and
     (Polygon[np].Y > P.Y)) or
     ((Polygon[np - 1].Y > P.Y) and
     (Polygon[np].Y <= P.Y)) then
   begin
     XIntersection := Polygon[np - 1].X +
      ((Polygon[np].X - Polygon[np - 1].X) /
      (Polygon[np].Y - Polygon[np - 1].Y)) * (P.Y - Polygon[np - 1].Y);

     if XIntersection < P.X then Inc(ToTheLeftofPoint);
     if XIntersection > P.X then Inc(ToTheRightofPoint);
   end;

  if OpenPolygon then
  begin
   np := High(Polygon);
   if ((Polygon[np].Y <= P.Y) and
     (Polygon[0].Y > P.Y)) or
     ((Polygon[np].Y > P.Y) and
     (Polygon[0].Y <= P.Y)) then
   begin
     XIntersection := Polygon[np].X +
      ((Polygon[0].X - Polygon[np].X) /
      (Polygon[0].Y - Polygon[np].Y)) * (P.Y - Polygon[np].Y);

     if XIntersection < P.X then Inc(ToTheLeftofPoint);
     if XIntersection > P.X then Inc(ToTheRightofPoint);
   end;
  end;

  if (ToTheLeftofPoint mod 2 = 1) and (ToTheRightofPoint mod 2 = 1) then
   Result := True
  else
   Result := False;
end;
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Chris88

Registriert seit: 25. Sep 2005
4 Beiträge
 
#10

Re: Kollision zweier 2dim Polygonen.

  Alt 8. Dez 2006, 17:07
@igel457: Das ist ja nur eine Funktion, um zu testen, ob ein Punkt in einem Polygon liegt. Ich suche aber eine Funktion, welche prüft ob ein Polygon in einem anderen Polygon ist...


Habe meine Funktion mal angepasst, sie funktioniert aber nicht.
Hier mal die Funktion, welche ich zum testen benutzt habe:

Delphi-Quellcode:
procedure TestPolygonInPolygon;
var
  RgnA, RgnB, RgnC: hdc;
  TestA, TestB: Array of TPoint;
begin
  SetLength(TestA, 3);
  TestA[0] := point(1,1);
  TestA[1] := point(5,1);
  TestA[2] := point(2,6);

  SetLength(TestB, 3);
  TestB[0] := point(3,1);
  TestB[1] := point(1,4);
  TestB[2] := point(4,4);

  RgnA := CreatePolygonRgn(TestA,3,Winding);
  RgnB := CreatePolygonRgn(TestB,3,Winding);
  try
    showmessage(IntToStr(CombineRgn(
      RgnC, // handle to destination region
      RgnA, // handle to source region
      RgnB, // handle to source region
      RGN_AND // region combining mode
    ))+#10+'NULLREGION: '+IntToStr(NULLREGION)
    +#10+'SIMPLEREGION: '+IntToStr(SIMPLEREGION)
    +#10+'COMPLEXREGION: '+IntToStr(COMPLEXREGION)
    +#10+'ERROR: '+IntToStr(ERROR));


  finally
    DeleteObject(RgnA);
    DeleteObject(RgnB);
    DeleteObject(RgnC);
  end;
end;
Als Rückgabewert bekomme ich immer '0' also einen Fehler. Hat jemand eine Ahnung warum?

Gruß
Chris
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 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