[Question] Koordinaten-Werte in Array per Handles modifizieren und gleichzeitig sortieren [Résolu]

Balises:
  • SmartPart
  • Handle
  • Polygon
  • Sortieren
  • Array

Hallo

ich habe ein Smartpart bei welchem ein zweidimensionaler Array die Koordinaten eines Polygon beschreibt.
Die einzelnen Punkte des Polygons können über Handles bewegt werden. Da jedoch alle Segmente des Polygon von links nach rechts verlaufen müssen, wir der Array nach den X-Werten sortiert (Bubblesort). Bei der nummerischen Eingabe funktioniert dies ohne Probleme.

Sobald Werte im Array sortiert werden funktionieren die Handles nicht mehr richtig.
Der Punkt welcher verschoben wird, erhält seinen ursprünglichen Y-Wert. Der Punkt mit welchem der Platz im Array getauscht wird, erhält den Y-Wert des Handles.

Wie kann ich die Werte in Array per Handles modifizieren und gleichzeitig bei Bedarf sortieren?
Das betreffende Smartpart ist im Anhang.

Gruss und Dank
Hansruedi

Pièces-jointes (1)

Type: text/xml
Téléchargé 1033 fois
Size: 10,95 KiB

Show solution Hide solution

Es liegt daran, dass jedes Handle den Namen (und den Index) des zugewiesenen Parameters speichert.
Dieser Name und Index ändert sich während das Ziehens am Handle und dem dabei durchgeführten Sortieren nicht! Es wird zwar das Array vertauscht, aber der Index des Handles bleibt gleich, und "misst" dadurch einen falschen Wert.

Das Array lässt sich beim Ziehen am Handle nicht gleichzeitig sortieren!

Also braucht man ein zweites, sortiertes Array.

Dieses kopiert man aus dem ursprünglichen Array und sortiert es beim "Handle-Move".
Damit die Positionen der Handles dann wieder richtig sind, braucht man noch ein "Mapping"-Array,
welches sich beim Sortieren die Änderung der Indizes "merkt".

Die Polylinie zeichnet man dann mit dem sortierten Array, und die Handles werden an der "sortierten Stelle"
mit dem "Mapping-Array" dem korrekten Arraywert des unsortierten Arrays zugewiesen.

Folgende Hinweise noch zu Deinem SmartPart:
1. Der Typ des Arrays für die Punkt-Koordinaten darf nicht "Gleitkommazzahl" sonder muss vom Typ "Länge" sein!
2. Dein Bubble-Sort-Algorithmus ist unvollständig und uneffizient:
Der letzte Punkt wird nicht berücksichtigt, und es wird nicht abgebrochen, wenn in einer Iteration keine Vertauschungen mehr stattfinden.
3. Jede Änderung von Parameter-Array-Werten muss mit folgendem Muster erfolgen: a[i]=2*4 PARAMETERS a[i]=a[i]4. Bei "del_pnt" müssen die Arrays verkleinert werden mit REDIM a[new_cnt]

Pièces-jointes (1)

Type: text/xml
Téléchargé 1065 fois
Size: 15,52 KiB

Es liegt daran, dass jedes Handle den Namen (und den Index) des zugewiesenen Parameters speichert.
Dieser Name und Index ändert sich während das Ziehens am Handle und dem dabei durchgeführten Sortieren nicht! Es wird zwar das Array vertauscht, aber der Index des Handles bleibt gleich, und "misst" dadurch einen falschen Wert.

Das Array lässt sich beim Ziehen am Handle nicht gleichzeitig sortieren!

Also braucht man ein zweites, sortiertes Array.

Dieses kopiert man aus dem ursprünglichen Array und sortiert es beim "Handle-Move".
Damit die Positionen der Handles dann wieder richtig sind, braucht man noch ein "Mapping"-Array,
welches sich beim Sortieren die Änderung der Indizes "merkt".

Die Polylinie zeichnet man dann mit dem sortierten Array, und die Handles werden an der "sortierten Stelle"
mit dem "Mapping-Array" dem korrekten Arraywert des unsortierten Arrays zugewiesen.

Folgende Hinweise noch zu Deinem SmartPart:
1. Der Typ des Arrays für die Punkt-Koordinaten darf nicht "Gleitkommazzahl" sonder muss vom Typ "Länge" sein!
2. Dein Bubble-Sort-Algorithmus ist unvollständig und uneffizient:
Der letzte Punkt wird nicht berücksichtigt, und es wird nicht abgebrochen, wenn in einer Iteration keine Vertauschungen mehr stattfinden.
3. Jede Änderung von Parameter-Array-Werten muss mit folgendem Muster erfolgen: a[i]=2*4 PARAMETERS a[i]=a[i]4. Bei "del_pnt" müssen die Arrays verkleinert werden mit REDIM a[new_cnt]

Pièces-jointes (1)

Type: text/xml
Téléchargé 1065 fois
Size: 15,52 KiB

Hallo Jörg

vielen Dank für deine ausführliche Antwort.

Gruss
Hansruedi