//Hierbei handelt es sich um eine Fortsetzung zur Aufgabe: http://www.easy-coding.de/loesung-3d-objektdatei-zu-einem-2d-bild-t2545.html
Das obj-Format kann zusätzlich noch Zeilen der Form
haben, wobei <p1>, <p2>, <p2> Integerzahlen sind und Dreiecke repräsentieren.
Jede Zeile mit einem f repräsentiert ein Dreieck mit den Eckpunkten punkte[p1-1], punkte[p2-1] und punkte[p3-1].
Bei den Dreiecks-P's handelt es sich um die Indizes der Liste Punkte beginnend mit 1.
Um ein Dreieck in ein Bild zu zeichnen verwenden Sie das Modul ImageDraw.
Das folgende Beispiel zeichnet ein rechtwinkliges Dreieck vom Ursprung.
Meine Lösung:
Alles anzeigen
Das obj-Format kann zusätzlich noch Zeilen der Form
haben, wobei <p1>, <p2>, <p2> Integerzahlen sind und Dreiecke repräsentieren.
Jede Zeile mit einem f repräsentiert ein Dreieck mit den Eckpunkten punkte[p1-1], punkte[p2-1] und punkte[p3-1].
Bei den Dreiecks-P's handelt es sich um die Indizes der Liste Punkte beginnend mit 1.
Um ein Dreieck in ein Bild zu zeichnen verwenden Sie das Modul ImageDraw.
Das folgende Beispiel zeichnet ein rechtwinkliges Dreieck vom Ursprung.
Meine Lösung:
Quellcode
- import Image, ImageDraw, sys
- def objread(filename, literal):
- "liest eine objekt datei ein"
- f=map(lambda x:x.split(), file(filename))
- f=map(lambda x:x[1:], filter(lambda x:len(x)>0 and x[0]==literal, f))
- return map(lambda x:tuple(map(float, x)), f)
- def direction(x, mode):
- "reduziert drei punkte zu zweien"
- case = {"xz":(x[0],x[1]),"xy":(x[0],x[2]), "yz":(x[1],x[2])}
- return map(int, case[mode])
- def idx2pos(tupel, punkte):
- "ersetzt das tupel mit indizes durch ein tupel mit den koordinaten"
- return map(lambda x:tuple(punkte[int(x)-1]), tupel)
- def machebild(punkte, dreiecke, name = "bild", mode="xy"):
- "erstellt aus einer objekt datei ein Bild"
- im = Image.new('1',(400,270))
- punkte = map(lambda x:direction(x,mode), punkte)
- dreiecke = map(lambda x:idx2pos(x,punkte),dreiecke)
- draw = ImageDraw.Draw(im)
- for t in dreiecke:
- draw.polygon(t,1)
- im.save(name)
- if len(sys.argv) > 4:
- punkte = objread(sys.argv[1], 'v')
- dreiecke = objread(sys.argv[1], 'f')
- mode = ["xy","xz","yz"]
- x=0
- for filename in sys.argv[2:]:
- machebild(punkte, dreiecke, filename, mode[x])
- x+=1
- print "Bild(er) erstellt"
- else:
- print "Zu wenige Parameter\n"
- print "Beispiel zur richtigen Nutzung: a3.py aufg3.obj xy.png xz.png yz.png"