aufgerufen von: getVorschlag returned [int, None or Numpy Array, float]
def getRegel(knoten): '''gibt die Regel als Tupel von String, womöglich einem array, und einer Zahl zwischen 0 und 1 wieder''' #Wandelt Koordinaten in relative Positive Koordinaten um x = (knoten.koords[0]+variablen.rahmen[0])/(variablen.rahmen[0]*2) y = (knoten.koords[1]+variablen.rahmen[1])/(variablen.rahmen[1]*2) bevoelkerungsdichte = getBevoelkerungsdichte(x*variablen.img2.shape[1],y*variablen.img2.shape[0]) if knoten.seed: return [4, None,bevoelkerungsdichte] if not knoten.nebenstrasse: #Berechnet die relative Position des Punktes innerhalb der #Regel-Karte. Gibt abhaengig von den Farbwerten an diesem Punkt #eine die zutreffende Regel aus. intregel=np.argmax(variablen.img[y*variablen.img.shape[0]][x*variablen.img.shape[1]]) z=[0,0] #Bei Radial, suche das naechste Zentrum if intregel == 2: z=variablen.zentrum[np.argmin(np.linalg.norm(knoten.koords-variablen.zentrum,axis=1))] return [intregel,z,bevoelkerungsdichte] else: return [3, None,bevoelkerungsdichte]
In getRegel wird anhand der Koordinaten eines Knotens, von dem aus ein Vorschlag gemacht werden soll, die passende übergeordnete Regel ausgesucht. Da in getRegel die relativen Koordinaten auf dem „Rahmen“ berechnet werden, eignet sich auch hier ein Funktionsaufruf von getBevoelkerungsdichte. Dieser Wert ist ein float-Wert zwischen 0 und 1.
Returned werden: ein int-wert, womöglich ein Numpy-Array, und ein float zwischen 0 und 1. Die 5 möglichen Regeln entsprechen jeweils einem int-wert (0:gitter, 1:verzweigt, 2:radial, 3:nebenstrasse, 4:seed). Wenn der aktuelle Knoten ein Seed ist, wird die Seed-Regel benutzt. Wenn der Knoten also kein Seed ist und auch keine Nebenstrasse, dann wird der Farbwert des zugehörigen Pixels auf dem Input-Bild gefunden. Es wird dann geschaut, welcher der drei RGB-Werte am höchsten ist und anhand dessen wird eine der Folgenden Regeln ausgewäht. Wenn die radiale Regel ausgewählt wird, wird zusätzlich noch das von den Koordinaten nächste Zentrum (aus der Liste von Zentren die als Input übergeben werden) gefunden. Ansonsten ist der Knoten eine Nebenstrasse und es wird der passende int-Wert returned.
Es wird immer der letzte Vektor der zu dem Knoten, der gerade betrachtet wird, berechnet. Dann wird dieser Vektor (evtl. gedreht) auf die Koordinaten des aktuellen Knotens addiert.
Regel | pGeradeaus | pAbbiegen | Geradeaus-Drehung | Abbiegen-Drehung | lMin | lMax |
---|---|---|---|---|---|---|
Gitter | 1.0 | 0.08 | 0° | 90°,-90° | 1.0 | 1.0 |
Verzweigt | 1.0 | 0.05 | -30° bis +30° | 60° bis 120°,-120° bis -60° | 0.8 | 1.6 |
Radial | 1.0 | 0.06 | Abhängig von Position | Abhängig von Position | 0.8 | 1.6 |
Nebenstrasse | 0.05 | 0.8 | 0° | 90°,-90° | 1.0 | 1.0 |
Seed | - | - | - | - | 1.0 | 1.0 |