[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