Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Flächenüberschneidung suchen (https://www.delphipraxis.net/157877-flaechenueberschneidung-suchen.html)

blablab 28. Jan 2011 07:59

Flächenüberschneidung suchen
 
Hallo!

Ich habe eine Menge von verschiedenen Flächen (TRects) die sich nicht überschneiden und möchte nun alle dieser Flächen ermitteln, die sich mit einem Punkt bzw. einer anderen gegebene Fläche (TRect) überschneiden. Das sind also 2 verschiedene (ziemlich ähnliche) Probleme.

Eine Lösung wäre wohl alle Flächen durchzugehen und jeweils zu überprüfen ob sich der Punkt darin befindet bzw. ob die gegebene Fläche geschnitten wird.

Aber ich bin die ganze Zeit am Überlegen ob es da nicht einen geschickteren Algorithmus gibt. Als erstes habe ich an Sortieren gedacht, allerdings haben die Flächen 4 Eigenschaften (left, top, right und bottom) und ich kann ja nur nach einer Eigenschaft sortieren... Und wenn ich nach allen 4 Eigenschaften einzeln sortiere, dann fallen zwar jedes Mal ein paar Flächen die nicht mehr in Frage kommen weg, allerdings muss ich am Schluss diese 4 Ergebnislisten wieder zu einer zusammenfügen, was auch wieder Zeit beansprucht...

Hat vielleicht jemand eine Idee???
Oder ist es doch am besten einfach alle Flächen durchzugehen???

Das ist wahrscheinlich etwas anspruchsvoll so früh am Morgen, aber ich weiß doch dass es hier schlaue Köpfe gibt! :-D

Grüße
blablab

DeddyH 28. Jan 2011 08:09

AW: Flächenüberschneidung suchen
 
Ich hoffe, dass ich keinen Denkfehler mache, aber es müsste doch so gehen: wenn Du alle Rects in einer Liste hast, nimmst Du das erste Element und vergleichst es mit allen folgenden auf Überschneidung. Anschließend das nächste Element wieder mit allen folgenden vergleichen. Ziehst Du das bis zum Ende der Liste durch, hast Du alle Rects miteinander verglichen.

Memnarch 28. Jan 2011 08:12

AW: Flächenüberschneidung suchen
 
@DeddyH: Und genau DAS wollte er vermeiden ;). Er wollte es möglichst so geschickt anstellen, das es möglichst wenig redundanz gibt.

@Blablab: Vllt könntest du kurz sagen wieviele flächen du hast(haben könntest. Dann lässt sich der aufwand u8nd der gewinn einer optimierung einschätzen ;)

MFG
Memnarch

blablab 28. Jan 2011 08:19

AW: Flächenüberschneidung suchen
 
Vielleicht hab ich das etwas blöd formuliert. Ich will nicht alle Flächen mit allen vergleichen.
Ich habe eine Menge von Rects, das nenn ich jetzt mal die Flächenliste. Ich bin mir nicht sicher ob das einen Unterschied macht, aber diese Flächenliste hat als besondere Eigenschaft, dass sich die einzelnen Flächen darin nicht überschneiden.

Und jetzt hab ich 2 Probleme:
1) Ich bekomme als Eingabe einen Punkt P.
Hier würde ich gerne ausrechnen ob dieser Punkt P eine Fläche der Flächenliste schneidet und wenn ja welche.

2) Ich bekomme als Eingabe eine Fläche F.
Hier möchte ich herausfinden welche und wie viele Flächen der Flächenliste die Fläche F schneiden.
Fläche Fläche Fläche :-D

DeddyH 28. Jan 2011 08:23

AW: Flächenüberschneidung suchen
 
Achso, Du suchst ein geeignetes Ausschlussverfahren. Da muss ich mal drüber nachdenken.

[edit] Wenn man nach mit CustomSort nach den Kriterien Left, Width, Top und Height sortiert, müsste sich doch eine binäre Suche realisieren lassen, oder täusche ich mich? [/edit]

Bummi 28. Jan 2011 08:42

AW: Flächenüberschneidung suchen
 
Iterierien mit PtInRect bzw. InsersectRect ?

DeddyH 28. Jan 2011 08:44

AW: Flächenüberschneidung suchen
 
Bummi, darum geht es ja nicht, das hatte ich auch erst falsch verstanden. Er sucht ein geeignetes Ausschlussverfahren, damit er nicht jedes Rect einzeln prüfen muss.

blablab 28. Jan 2011 09:22

AW: Flächenüberschneidung suchen
 
Kann es sein dass das mit dem sortieren sogar noch aufwändiger ist?
Ich muss ja dann in jeder Liste die binäre Suche anwenden (das ist noch nicht aufwändig). Als Ergebnis hab ich dann jeweils eine Position wo dann zum Beispiel oberhalb alle Rects in Frage kommen und unterhalb nicht. Um diese 4 Listen zusammenzufügen würde ich dann einen Boolean-Array mit der Länge n machen und dann alle Listen durchgehen und die Rects die nicht in Frage kommen im Boolean-Array markieren. Und dann müsste ich nochmal den Boolean-Array durchegehen und mir die die übriggebliebenen Rects rausschreiben.

Das wäre dann:
4*Binäre Suche = 4* log(n)
Boolean-Array initialisieren = n
Falsche Rects rausstreichen ~ 4* 1/2n
Übriggebliebenen Rects rausschreiben = n

Insgesamt sind das dann ganz grob >4n Operationen.
Das ist ja eigentlich nicht viel, aber wenn ich die n Rects einfach alle durchgehe, dann muss ich ja auch nur jeweils 4 Vergleiche pro Rect machen. Und wenn einer der 4 Vergleiche false ergibt, dann müssen die restlichen nicht verglichen werden. Das bedeutet es sind sogar eher weniger als 4n Operationen...

DeddyH 28. Jan 2011 09:37

AW: Flächenüberschneidung suchen
 
Wie kommst Du auf 4 Listen? Ich meinte eine einzige, aber nach 4 Kriterien sortiert. Solange sich die Rects nicht ändern, muss diese Sortierung ja nur einmalig vorgenommen werden.

Bummi 28. Jan 2011 09:43

AW: Flächenüberschneidung suchen
 
mein Bauch meint iterieren wird die schnellst Methode bleiben....


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.
Seite 1 von 2  1 2      

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