-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
14. Dez 2014
Nicht schon wieder, dieser Thread verfolgt mich langsam. :)
Der Thread beruhte auf einem Fehler in meinem Quicksort. Man kann Koordinaten "ganz normal" sortieren. Das hätte man auch um 03:57 bemerken können (Der Beitrag direkt über deinem).
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
12. Dez 2014
No problem, bin für klare Ansagen zu haben. Weißt du warum es auch Quark ist? Weil der Quicksort die ganze Zeit falsch war. Es geht sogar so. Der Thread Titel müßte eigentlich lauten, Auf welche Ideen man so kommt, wenn man von falschen Voraussetzungen ausgeht? :wall:
function SortCompareXY(const A, B: TFloatPoint): integer;
begin
Result := SortCompareX(A, B);
if Result = 0 then
...
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
12. Dez 2014
Sytem.Move. In #61 wird Delete ja auf die sehr viel kleinere SortList angewendet (SortList.Count << Self.Count).
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
11. Dez 2014
Also, ich weiß nicht was du machst? Anbei mein letztes Test Projekt.
Da man weiß, daß das
procedure TFloatPoints.DeleteDoubles;
var
I, J: integer;
begin
for I := FCount - 2 downto 0 do
for J := FCount - 1 downto I + 1 do
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
11. Dez 2014
Also, ich verabschiede mich mal an der Stelle hier und danke allen für die freundliche Unterstützung. Mit ca. 100.000 Punkten und ca. 30.000 Doppel bin ich mit #61 bei 100 ms.
FLoatPoints.Clear;
N := 30000;
for I := 1 to N do
FLoatPoints.AddXY(FloatRandom(0, 10000), FloatRandom(0, 10000));
for I := 0 to FLoatPoints.Count div 2 do
...
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
11. Dez 2014
Hi Bud,
nee, das dauert (mit #73) nicht (mehr) lange. So 1 bis 2 sec. beim Dxf Einlesen (Nur 1 mal erforderlich). Hier geht es um Fangpunkte, weil ohne diese ist die Zeichnerei eine Quälerei. Wichtig sind die Anzahl der Fangpunkte später beim Zeichenprozess (von neuen Objekten), weil diese bei MouseMove abgefragt werden (müssen). Deshalb kann man die auch nicht in einen Thread auslagern, weil...
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
10. Dez 2014
Wow. Schau ich mir. Thanx.
Ich hab auch noch einen (allerdings wie gehabt mit Quicksort): :-D
procedure TFloatPoints.Sort;
const
Eps = 1E-4;
var
X: double;
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
10. Dez 2014
Danke für den Code. Der gepostete Algo macht es aber leider nicht.
.. and (tmpf.X >= FItems.X + cEps) do
weiß nicht recht..
Und das Eps von Null ist ja auch nur eins von 1E-15 oder so.
Anyway.
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
10. Dez 2014
Bud, ich versteh dich nicht falsch. Mit eindimensionaler Sortierung kann man das hier (wenn überhaupt) nur bei mit stabilen Sortierverfahren so machen.
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
10. Dez 2014
Nein, so kann man keine Koordinaten sortieren (Siehe auch Namenloser und Horst). BTW, bei deiner FastAddPoints, fehlen da nicht die FillChars, TFLoatPoint ist doch ein Record?
Sort muss z.B. so:
procedure TFloatPoints.Sort(const RemoveDoubles: boolean);
const
Eps = 1E-4;
var
X: double;
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
9. Dez 2014
Ok. Sagt mir aber leider nix. :oops:
Hab doch noch Bock. :-D
Ungetestet:
procedure TFloatPoints.RemoveDoubles;
const
Eps = 1E-4;
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
9. Dez 2014
Nein, ich hatte nur das als letzte Möglichkeit gesehen um nicht groß am Code ändern zu müssen. Gut. Dann wäre das jetzt geklärt, daß es auch so nicht geht. Danke Horst. Allerdings steigt das Progamm nicht aus, sondern eine MessageBox wird angezeigt, daß FLoatPoints.RemoveDoubles nicht erfolgreich war. Dann kann man das mit der Sort Variante hier vergessen. Daß ich sattdessen im Code nun auf if...
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
9. Dez 2014
Hier nein. Das Delete ist der Witz an der Sache. Sonst würde es nicht funktionieren. SortX und SortY müssen auf verschiedene Listen angewendet werden, sonst hat man nur SortY (Siehe auch Namenloser).
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
9. Dez 2014
Ich hab mehrere Tests mit dem Code #47 durchgeführt. Scheint zu stimmen. Weiß aber nicht wieso?
Falls jemand probieren möchte (Testform):
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
9. Dez 2014
Stimmt. Leider.. Das Thema macht mich echt fertig. Horst, und wieso jetzt plötzlich das funzt? Keinen Plan.. Man findet im Netz über Delphi Koordinaten Sortieren fast nichts.
procedure TFloatPoints.ProbablyRemoveDoubles;
var
I: integer;
begin
SortbyX;
for I := FCount - 1 downto 1 do
if Util_SameFloatPoint(FItems, FItems) then
Delete(I);
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Der QuickSort hat die unangenehme Angewohnheit, daß wenn es Beispielsweise in einer Adressenverwaltung 2 Hans Müller in 12345 Berlin gibt, und man die Adressen nach Postleitzahl sortiert, daß einmal der eine und einmal der andere Müller vorne stehen kann. M.E. hat das hier aber keinen Einfluß, weil identisch und hintereinander (Wenn 2 Durchläufe). Ich weiß es aber eben auch nicht genau .....
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Ok. Thanx. Schau ich mir an.
Als letzter Versuch fäll tmir noch das ein? Der Quicksort ist ja unfassbar schnell. Ist das so korrekt? :gruebel:
function SortCompareX(const A, B: TFLoatPoint): integer;
const
Eps = 1E-4;
begin
Result := CompareValue(A.X, B.X, Eps);
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Ok. Was denkst du denn über # 16?
Edit: Vergiss es. Genasu so falsch..
Hast du ein Beispiel für K-d-Bäume?
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Wo du grad zu Höchstform aufläufst. Ich poste mal noch ein anderes Problem.
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Hab ich schon eingebaut. Sonst wäre mein Software ja so schnell wie "richtige" Software. :mrgreen:
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Das soll doch analog AddStrings sein. Die Zeile muß natürlich raus. :)
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Nicht schlecht. Aber, was soll das if newCount = Self.Count then exit in der FastAddPoints?
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Ok. Aber nur wenn du Zeit und Lust hast. Möchte das Thema auch nicht überstrapazieren? Hier (Auszug zusammenkopiert).
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Stimmt. Nochmal zum Geschwindigkeitsproblem. Ob einfache Schleife plus Quicksort schneller ist als Summe N Durchläufe wage ich allerdings zu bezweifeln. Ich lass es aber jetzt erst mal so. Von Hashmaps hab ich leider keine Ahnung und auch leider Keine Zeit weiter hieran zu arbeiten. Thanx!
function TFloatPoints.SortCompare(const I, J: integer): integer;
const
Eps = 1E-4;
begin
Result...
-
Forum: Object-Pascal / Delphi-Language
by Bjoerk,
8. Dez 2014
Thanx. Das war das wo ich auf dem Schlauch stand. :oops:
function TFloatPoints.SortCompare(const I, J: integer): integer;
const
Eps = 1E-4;
var
A, B: TFloatPoint;
begin
A := FItems;
B := FItems;