Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Positionen (x ,y Achse, float) nach Distanz sortieren (https://www.delphipraxis.net/157003-positionen-x-y-achse-float-nach-distanz-sortieren.html)

Diengo 23. Dez 2010 17:54

Positionen (x ,y Achse, float) nach Distanz sortieren
 
Hallo,

folgendes Vorhaben: Ich möchte etwa 1000~ Positionen welche sich in einem simplen Array vom Typ TPositions ->
Delphi-Quellcode:
TPositions = packed record
  x, y: single;
end;
befinden nach Distanz sortieren. Meine Überlegung war nun jede Position in dem Array zu durchlaufen und mittels abs die Distanz zu ermitteln. Meine simple Funktion hierzu:
Delphi-Quellcode:
function GetDistance(x1, y1, x2, y2: single): double;
begin
  result := abs(x2 - x1) + abs(y2 - y1);
end;
Wie sortiere ich die Positionen nun möglichst schnell im Array nach der Distanz? Einstiegspunkt soll dabei immer die Distanz zum ersten Eintrag im Array sein. Mir fällt da nur ein die Liste mehrmals zu durchlaufen um von jeder Position die Distanz zu ermitteln und dann irgendwie zu ordnen.

Geht das nicht irgendwie bequemer?

Gruß

Bummi 23. Dez 2010 18:49

AW: Positionen (x ,y Achse, float) nach Distanz sortieren
 
Wie der Betreff schon sagt, einfach per z.B. Quicksort sortieren ...:?:

stahli 23. Dez 2010 18:58

AW: Positionen (x ,y Achse, float) nach Distanz sortieren
 
Die Entfernung sollte man so berechnen (meint Google :wink:): a = Wurzel((x2-x1)²+(y2-y1)²).

Nach Möglichkeit würde ich den Record um "distance" erweitern, alle Entfernungen einmal berechnen lassen und dann das Array nach "distance" sortieren.

Uwe Raabe 23. Dez 2010 19:27

AW: Positionen (x ,y Achse, float) nach Distanz sortieren
 
Zitat:

Zitat von stahli (Beitrag 1070216)
Die Entfernung sollte man so berechnen (meint Google :wink:): a = Wurzel((x2-x1)²+(y2-y1)²).

Für die reine Sortierung sollte das unerheblich sein, da ein Vergleich der Abstände zweier Punkt-Paare mit beiden Abstandsfunktionen das gleiche Ergebnis liefert. Wenn die realen Abstände nicht noch für etwas anderes gebraucht werden, ist die Abs-Lösung etwas performanter.

Den korrekten Abstand zweier Punkte kann man aber auch mit
Delphi-Quellcode:
uses Math;

  a := Hypot(y2-y1, x2-x1);
bekommen.

stahli 23. Dez 2010 19:54

AW: Positionen (x ,y Achse, float) nach Distanz sortieren
 
Ich bin schon ein paar Jahre raus aus der Schule und hatte mir nur gedacht, dass

0/0 : 0/20
und
0/0 : 10/10

unterschiedliche Entfernungen ergeben müsste (was in der einfachen Variante ja nicht der Fall ist).
Daher habe ich mal gesucht...

Uwe Raabe 23. Dez 2010 20:26

AW: Positionen (x ,y Achse, float) nach Distanz sortieren
 
Zitat:

Zitat von stahli (Beitrag 1070224)
Ich bin schon ein paar Jahre raus aus der Schule und hatte mir nur gedacht, dass

0/0 : 0/20
und
0/0 : 10/10

unterschiedliche Entfernungen ergeben müsste (was in der einfachen Variante ja nicht der Fall ist).
Daher habe ich mal gesucht...

Stimmt, ich hatte mich da blenden lassen. Der alternative Ansatz für eine performantere Abstandsformel ist das weglassen der Wurzel - die Quadrate müssen bleiben. Sorry.

stahli 23. Dez 2010 21:03

AW: Positionen (x ,y Achse, float) nach Distanz sortieren
 
Ja, das leuchtet selbst mir ein :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 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