Python-Fraktal-Programm vereinfachen?

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.
Antworten
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

Hallo an alle,
noch mal eine Frage(naja mehrere aber wirklich zum gleichen Thema :D )
Also ich habe ein Programm geschrieben, welches Fraktale erstellt(also immer nur den gleichen :/ )
(ich schreib das Programm hier rein und unten kommen dann die Fragen)

Code: Alles auswählen

# -*- coding: cp1252 -*-
import pygame, sys, time, easygui
from pygame.color import THECOLORS




groesse=100
displaygroesse=600
displayhaelfte=displaygroesse/2
breite=displaygroesse/groesse/2
hoehe=breite
quatsch=1.345566




pygame.init()
screen=pygame.display.set_mode([displaygroesse+breite,displaygroesse+hoehe])
screen.fill(THECOLORS["black"])


def test(c):
    z=complex(0,0)
    for i in range(101):
        z=z*z+c
        if(abs(z)>1000000000000000000):
            return i
    return i


def zeichne(z,s,f):
    if (f<10):
        farbe=THECOLORS["red"]
    elif (f>80):
        farbe=THECOLORS["green"]
    else:
        farbe=THECOLORS["blue"]
    links=s*displayhaelfte/groesse+displayhaelfte
    oben=(-z)*displayhaelfte/groesse+displayhaelfte
#    print(s,z,links,oben,breite,hoehe)
#    farbe=THECOLORS["white"]
    pygame.draw.rect(screen, farbe, [links, oben, breite, hoehe], 0)
    pygame.display.flip()
    







for zeile in range(-groesse,groesse+1):
    for schritt in range(-groesse,groesse+1):
        c=complex(1.5*schritt/groesse,1.5*zeile/groesse)
#        print(c),
#        print test(c)
        zeichne(zeile, schritt, test(c))
#        for i in range(1000000):
#              quatsch=quatsch/777

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
Also das ist das Programm, aber(ich kann nicht gut programmieren...) das ist alles noch so ein bisschen sehr komisch...
Also meine Fragen:

--1-- : Hättet ihr eine Idee wie ich das Programm etwas übersichtlicher machen könnte?
--2-- : Es wäre toll wenn man ganz am Anfang z.B. mit easygui oder iirgeendwaas eine Eingabeaufforderuung bekommt in der man:
-Die Pixel-anzahl
-Die verschiedenen Farben
-Und die Diplaygröße
eingeben muss, denn so wie es jetzt ist ist es ein bisschen schwer das zu verändern, und nach ner Zeit lang sicherlich auch nervig...
--3-- : Ähm...mist vergessen...

Ich freue mich auf auf antworten,

Pyanfänger

:) :)
PS: Die Kommentare braucht ihr nicht lesen, die habe ich davor gebraucht(also kein-Kommentar Programm) um zu testen ob er c auch ausgibt usw :)
-
BlackJack

@Pyanfänger: Etwas weniger vertikaler Leerraum, dafür aber mehr Leerzeichen innerhalb der Zeilen würde die Lesbarkeit erhöhen. Also um binäre Operatoren und nach Kommas zum Beispiel.

Unbenutzer Quelltext gehört nicht auskommentiert, sondern entfernt. Und unbenutzte Namen/Werte dann auch. `quatsch` macht da seinem Namen alle Ehre.

`THECOLORS` ist überflüssig, denn AFAIK kann man an der Stelle wo Farben erwartet werden direkt die Zeichenketten angeben, die in dem Wörterbuch als Schlüssel vorkommen. Also ``screen.fill('black')`` zum Beispiel.

Bedingungen bei ``if`` & Co brauchen keine Klammern.

Namen sollten nicht aus einfachen Buchstaben bestehen. An ``zeichne(z, s, f)`` kann man zum Beispiel nicht wirklich ablesen was die Argumente bedeuten.
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

Oh ok :oops:

Danke für die Antwort :)
Werd ich dann gleich mal ändern.
Weißt du auch wie man die Pixelanzahl erhöhen könnte?
(Also hab in mein Programm jetzt eine Eingabe eingefügt)Da das Maximum 150 ist und es Dan noch nen bisschen grob aussieht.
-
Pyanfänger
User
Beiträge: 99
Registriert: Mittwoch 28. Dezember 2011, 12:50

Noch ne Frage : Kann mir jemand sagen wie ich (wenn ich reingzoomzt hab) wieder rauszoomen kann?also das man mit der maus ein Viereck zieht.
Hier das veränderte Programm:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import pygame, sys, easygui
from pygame.color import THECOLORS

displayheight=input("Höhe des Bildschirms?  ")
displaywidth=input("Breite des Bildschirms?   ")
screen=pygame.display.set_mode([displaywidth,displayheight])
screen.fill(THECOLORS["black"])
    
def test(c):
    z=complex(0,0)
    for i in range(101):
        z=z*z+c
        if(abs(z)>1000000000000000000):
            return i
    return i

def transform(dx,dy,x0,y0,pixelresolution):
    x=float(dx+pixelresolution/2)/displaywidth*xw+x0
    y=float(dy+pixelresolution/2)/displayheight*yw+y0
    return complex(x,y)

def colortransform(f):
    if (f<7):
        farbe=THECOLORS["red"]
    if (f<10):
        farbe=THECOLORS["orange"]
    elif (f<20):
        farbe=THECOLORS["yellow"]
    elif (f<40):
        farbe=THECOLORS["green"]
    elif (f<70):
        farbe=THECOLORS["blue"]
    else:
        farbe=THECOLORS["violet"]
    return(farbe)

def zeichne(dx,dy,pixelresolution,f):
    farbe=colortransform(f)
    if (pixelresolution!=1):
        pygame.draw.rect(screen, farbe, [dx,dy,pixelresolution, pixelresolution], 0)
    else:
        pygame.draw.line(screen, farbe, [dx,dy],[dx,dy], 1)
    

def makefraktal(x0,xw,y0,yw):
#    print (x0,xw,y0,yw)
    pixelresolution=easygui.integerbox("Groesse eines Pixels:  ")
    dx=0
    dy=0
    pygame.init()
    while (dy<displayheight):
        dx=0
        while (dx<displaywidth):
            x=transform(dx,dy,x0,y0,pixelresolution)
#        print(dx,dy,pixelresolution,x)
            zeichne(dx,dy,pixelresolution,test(x))
            dx=dx+pixelresolution
        dy=dy+pixelresolution
        pygame.display.flip()

    button1_action=0
    while True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                sys.exit()
            elif (event.type==pygame.MOUSEBUTTONDOWN):
                pos1=pygame.mouse.get_pos()
                button1_action=1
            elif (event.type==pygame.MOUSEBUTTONUP):
                pos2=pygame.mouse.get_pos()
                if (button1_action==1):
                    button1_action=2
        if (button1_action==2):
            break
    print (button1_action,pos1,pos2)
    dx1=pos1[0]
    dy1=pos1[1]
    dx2=pos2[0]
    dy2=pos2[1]
    return dx1*xw/displaywidth+x0,(dx2-dx1)*xw/displaywidth,dy1*yw/displayheight+y0,(dy2-dy1)*yw/displaywidth

x0=-2.1
xw=3.0
y0=-1.5
yw=xw*displayheight/displaywidth
pygame.mouse.set_visible(True)
while True:
    (x0,xw,y0,yw)=makefraktal(x0,xw,y0,yw)
    print (x0,xw,y0,yw)
Pyanfänger

Edit://Kann niemand Antworten? :(

PS: Hat jemand auch ne idee wie man machen könnte das man das Viereck das man auswählt sieht?
-
Antworten