[Talk-de] Noch mehr Winkeldings
Thomas Hieber
thieber at gmx.net
Sa Apr 12 11:15:21 UTC 2008
Frederik Ramm schrieb:
> Hallo,
>
>
>> Das fände ich immens wichtig. Vor allem langfristig wird es (hoffentlich)
>> immer mehr Anwendungen geben, die osm-daten referenzieren und hierfür muss
>> man sinnigerweise die id ranziehen. Deswegen wär es unfein, wenn josm einen
>> dazu animiert, bestehende objekte zu löschen und neu zu generieren.
>> "align nodes in rectangle" wär mir auch zu wenig, es sollte schon "align nodes
>> in 90°", also dass auch sowas da aligned werden kann:
>> ----
>> | |
>> | ---
>> | |
>> |-----
>>
>
> Machst Du mir einen Algorithmus dafuer ;-)? "Finde diejenige
> geometrische Figur, die nur rechte Winkel hat und bei der die Summe
> der Entfernungen der Punkte vom Original minimal ist" oder so... ich
> nehm auch Pseudocode.
>
> Das einzige, was mir jetzt einfiele, waere, in einer Ecke zu starten,
> den naechsten Punkt auf der Linie so zu verschieben, dass es ein
> rechter Winkel ist, dann den uebernaechsten undsoweiter, und dann eine
> Sonderregel fuer das letzte Segment, um wieder den Anfang zu
> "treffen"...
>
> Bye
> Frederik
>
>
Wie wäre es damit: (Ist mir grad so eingefallen, könnte aber funktionieren)
Nimm alle Linien und berechne den absoluten Winkel zur waagerechten so,
dass der Winkel zwischen 0° und 180° liegt. (falls der Winkel zwischen
180° und 360° liegt muss man Anfang und Ende vertauschen. ) Speichere
den resultierenden Winkel in einem Array.
Probiere für alle Winkel zwischen 0° und 89° aus, wie gut die Lage der
einzelnen Winkel passt. (Hierzu wird geschaut, wie groß die Summe der
Abweichungen aller gespeicherten Winkel von zu testenden Winkel, bzw.
dem zu testenden Winkel + 90° ist). Der am besten passende Winkel aus
diesem Durchlauf wird dann als Referenz genommen.
Jetzt werden alle Knoten durchlaufen, beginnend in der Mitte der Figur.
Für den Knoten werden alle verbundenen Linien gewählt und so um den
Knoten gedreht, dass der der resultierende Winkel entweder dem
Referenzwinkel, dem Referenzwinkel + /-90° oder dem Referenzwinkel +
180° entspricht (Natürlich den Winkel mit der kleinsten Abweichung
wählen) und die Länge konstant bleibt. Der Knoten ist nach dieser
Operation "fixiert" und darf bei der Bearbeitung der restlichen Knoten
nicht mehr verschoben werden. Das ganze wird für alle weiteren Knoten
wiederholt.
Der Algoritmus wird vermutlich nicht bei allen denkbaren Sonderfällen
funktionieren - in diesem Fall bleiben halt nicht angepasste Segmente
erhalten.
Ich glaube aber dass das im großen und ganzen recht gut funktionieren würde.
Gruß,
Thomas
Mehr Informationen über die Mailingliste Talk-de