Turtle: Binärwerte in Matrizen in Pixel umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hyperion hat geschrieben:Na gut, dann ändert man eben den Namen des Parameters von `color` in `colorname` o.ä.. Dann klappt's auch mit dem Aufruf von `color()` :-D
Oder noch besser: man lässt die *-Importe sein.
Das Leben ist wie ein Tennisball.
MikeOrMichael
User
Beiträge: 16
Registriert: Mittwoch 22. Februar 2012, 20:37

@Hyperion: Okay :mrgreen: .

Ich habe das jetzt so umgeschrieben:

Code: Alles auswählen

def _paint(x, y, bcolor):
    speed('fastest')
    up()
    goto (x, y)
    down()
    color(bcolor)
    fillcolor(bcolor)
    i = 0
    begin_fill()
    while i < 4:
        forward(10)
        right(90)
        i = i + 1
    end_fill()

def px(matrix, x, y):
        paint_mapping = {0: paint_black, 1: paint_white}
        for x, row in enumerate(matrix):
                for y, bcolor in enumerate(row):
                        paint_mapping[bcolor](x, y)
Er malt mir dann genau ein schwarzes Viereck, dann läuft da nix mehr und es hängt.
Außerdem erkennt er mir nicht xrange, was ich doch schon sehr komisch finde. Range() erkennt er tadellos.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dann verwendest Du vermutlich Python 3.x. Dort wurde aus `xrange` einfach `range`.

Wieso er hängt kann ich nicht sagen. Lass Dir halt mal die Werte der Schleifendurchläufe ausgeben. Dann siehst Du ja, ob er alles druchläuft, wie er soll. Wenn ja, dann liegt es an etwas anderem. Ich vermute mal, dass Du bei den Koordinaten noch einen Offset addieren / multiplizieren musst? Schließlich gehe ich ja nur Indexe durch... die laufen also von 0 bis 4 o.ä. `forward(10)` und `right(90)` hantieren da ja mit recht großen Zahlen. Wenn analog zu x und y die selbe Auflösung haben, ist ja klar, dass Du nicht viel siehst...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MikeOrMichael
User
Beiträge: 16
Registriert: Mittwoch 22. Februar 2012, 20:37

@Hyperion: Könntest du mir ganz kurz die beiden for- Schleifen und die enumerate-Funktion erklären ? Ich verstehe zum Bsp. nicht, warum x,row im selben Loop sind, da x,y die Koordinaten sind und row halt die Reihe ist.
Muss nicht lang sein, ich will halt nur verstehen, um zu lernen :) .
BlackJack

@MikeOrMichael: `enumerate()` liefert Tupel mit einer laufenden Nummer als erstes Element und dem dazugehörigen Element aus dem übergebenen iterierbaren Objekt. Die Matrix besteht aus Zeilen und die Zeilen aus den einzelnen Spaltenwerten in der Zeile. Traditionell hätte zu den Zeilen eher die `y`-Koordinate gehört, aber das bewirkt ja erst einmal nur, dass die Matrix 90° gedreht gezeichnet wird. Probier doch einfach in einer Python-Shell mal aus was die Funktion so macht:

Code: Alles auswählen

In [214]: matrix = [[1, 0, 1, 0], [1, 0, 0, 1]]

In [216]: for item in enumerate(matrix):
   .....:     print item
   .....: 
(0, [1, 0, 1, 0])
(1, [1, 0, 0, 1])

In [217]: for y, row in enumerate(matrix):
   .....:     for x, cell in enumerate(row):
   .....:         print x, y, cell
   .....: 
0 0 1
1 0 0
2 0 1
3 0 0
0 1 1
1 1 0
2 1 0
3 1 1
MikeOrMichael
User
Beiträge: 16
Registriert: Mittwoch 22. Februar 2012, 20:37

Die Funktion ist toll: sie gibt einen genauen Index von den Werten und der Position, danke :)

Code: Alles auswählen

def px(matrix, x, y):
     paint_mapping = {0: paint_black, 1: paint_white}
             for x, row in enumerate(matrix):
                     for y, bcolor in enumerate(row):
                             print(bcolor, x, y)

px(matrix, 25, 25)
1 0 0
0 0 1
1 0 2
0 0 3
1 1 0
0 1 1
0 1 2
1 1 3

def px(matrix, x, y):
        paint_mapping = {0: paint_black, 1: paint_white}
        for x, row in enumerate(matrix):
                for y, bcolor in enumerate(row):
                        print(bcolor)

px(matrix, 10, 10)
1
0
1
0
1
0
0
1

for x, row in enumerate(matrix):
	print(row)

	
[1, 0, 1, 0]
[1, 0, 0, 1]
Tut mir leid,dass ich noch frage: die Funktion paint_mapping, sie sorgt dafür, dass für den Wert 0/1 paint_white/black zugeordnet wird; aber ich habe nirgendwo die Bedeutung der { } ? Ich habe leider nichts dazu gefunden. Ist das ein Kürzel für eine Funktion ?
BlackJack

@MikeOrMichael: Du hast noch keine Wörterbücher (`dict`) kennen gelernt? Solltest Du schleunigst nachholen, denn das ist neben Listen der wohl wichtigste Containerdatentyp unter den Grundtypen von Python.
MikeOrMichael
User
Beiträge: 16
Registriert: Mittwoch 22. Februar 2012, 20:37

@BlackJack: Ich habe mich informiert. Wirklich sehr nützlich mit den Keys und den Items. Gibt es egrenzungen bei der Anzahl der Items pro Keys ?

An alle: Hyperions Funktion hat funktioniert ! Ohne hängen, ohne nichts. Das Problem ist: jetzt hat Python mir die Matrix (oder das Array) um 90° Ost gedreht :oops: . Ich glaube, da ist eine Variable, die dafür sorgt. Das ist die Funktion:

Code: Alles auswählen

def px(matrix, x, y):
        paint_mapping = {0: paint_white, 1: paint_black}
        for x, row in enumerate(matrix):
                for y,bcolor in enumerate(row):
                        paint_mapping[bcolor](x, y)
Kann es sein, dass die Argumente (x, y) in Zeile 1 und die Variablen x und y in den Schleifen eigentlich was anderes darstellen ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

MikeOrMichael hat geschrieben:@BlackJack: Ich habe mich informiert. Wirklich sehr nützlich mit den Keys und den Items. Gibt es egrenzungen bei der Anzahl der Items pro Keys ?
Ja, an einen Key geht nur ein Objekt.

(Und das darf beliebiges sein, Liste, Dict, eigene Klassen, Tupel)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
MikeOrMichael
User
Beiträge: 16
Registriert: Mittwoch 22. Februar 2012, 20:37

@Leonidas: Danke dir.

An alle: Problem gelöst !!!

Ich habe herausgefunden, dass bei der Funktion, egal welche ich Koordianten eingebe, er immer wieder auf (0, 0) als Grundpunkt zurückgeht. Es lag alles daran, da die Anfangsarguemnte (x, y), welche die Koordianten des Startpunktes darstellen, später zu den Argumenten der Matrix wurde, sprich x = Reihe und y = Kolonne.
Und da der Anfangspunkt der Matrix auch immer 0, 0 ist, hat er die [x][y] Werte als gleiche Koordianten benutzt. Ich habe einfach nur neue Variablen benutzt und diese dann hinzugefügt bzw. substrahiert (und bei paint_ kommt noch ein offset von *10 dazu):

Code: Alles auswählen

def _paint(x, y, bcolor):
    speed('fastest')
    up()
    goto (x*10, y*10)
    down()
    color(bcolor)
    fillcolor(bcolor)
    i = 0
    begin_fill()
    while i < 4:
        forward(10)
        right(90)
        i = i + 1
    end_fill()

def px(matrix, x, y):
        paint_mapping = {0: paint_white, 1: paint_black}
        for m, row in enumerate(matrix):
                for n,bcolor in enumerate(row):
                        paint_mapping[bcolor](x + n, y - m)
Vielen vielen Dank an alle !!! Besonders an Hyperion für seine tolle Funktion :mrgreen: .
Ihr habt mich wirklich gerettet und mir das Leben vereinfacht.
Ich werde jetzt Python weiterstudieren, da gibts noch vieeeeeel zu tun.
Im Abschluss: Nie wieder C++ ! :D
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MikeOrMichael hat geschrieben: Im Abschluss: Nie wieder C++ ! :D
Na dann haben wir die Welt ja ein wenig besser gemacht... :twisted:

SCNR ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

Langsamer ist nicht immer besser... :twisted:
SCNR either ;-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dobi hat geschrieben:Langsamer ist nicht immer besser... :twisted:
In Python geht vieles schneller! ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten