2017-12-06 6 views
2

Ich versuche, die Mandelbrot-Sequenz mit Pythons Turtle-Grafiken zu zeichnen. Ich verwende zwei Klassen, eine für die Mandelbrot-Sequenz.Mandelbrot-Sequenz mit Pythons Turtle

class Mandelbrot: 
def __init__(self,c,limit=50): 
    self.__limit = int(limit) 
    self.__colormap = ['black','white'] 
    self.__cardinality = limit 
    z = 0 
    for i in range(limit): 
     z = z * z + c 


     if abs(z) > 2: 
      self.__cardinality = i 
      return 



def getColor(self): 
    if self.__cardinality == self.__limit: 
     return self.__colormap[0] 
    return self.__colormap[1] 

Die andere Klasse repräsentiert das Turtle-Display.

import turtle 
from mandelbrot import * 

class Display: 
    def __init__(self): 
     self.t = turtle.Turtle() 
     self.t.ht();self.t.turtlesize(1) 
     self.t.speed(0) 
     turtle.tracer(2000,0) 


    for x in range(-150,151): 
     for y in range(-150,151): 
      self.t.color(Mandelbrot(turtleConvert(x,y)).getColor()) 
      self.t.goto(x,y) 



def turtleConvert(x,y): #converts from turtle pixels to the complex plane 
    return complex((x/300)*4,(y/300)*4) 

Wenn ich eine Instanz der Anzeigeklasse machen, druckt das Programm läuft, aber nur die untere Hälfte des Fractal. Könnte jemand eine Lösung anbieten?

Dies ist ein Bild von meinem Ergebnis.

Fractal

Antwort

2

Auf meinem System (OSX), erzeugt das Programm die gesamte Fraktal:

enter image description here

kann dies also Python Schildkröte oder Tkinter Implementierung spezifisch sein. (Fügen Sie Ihre Systemdetails zu Ihrer Frage hinzu oder als Kommentar danach.)

Ich werde jedoch ein paar damit zusammenhängende Probleme ansprechen. Zunächst erstellen Sie eine neue Instanz Mandelbrots für jeden Punkt, den Sie Plot - nur eine Instanz benötigen, die Sie aufrufen, je nach Bedarf:

class Mandelbrot: 
    def __init__(self, limit=50): 
     self.__limit = int(limit) 
     self.__colormap = ['black', 'white'] 
     self.__cardinality = self.__limit 

    def computeCardinality(self, c): 
     z = 0 
     self.__cardinality = self.__limit 

     for i in range(self.__limit): 
      z = z * z + c 

      if abs(z) > 2: 
       self.__cardinality = i 
       return 

    def getColor(self): 
     if self.__cardinality == self.__limit: 
      return self.__colormap[0] 
     return self.__colormap[1] 

Ihr Hauptprogramm überarbeitet diese mandelbrot.py zu verwenden, und das Ändern Ihrer tracer() Logik leicht :

from turtle import Turtle, Screen 
from mandelbrot import * 

class Display: 
    def __init__(self, screen): 
     self.t = Turtle(visible=False) 
     self.t.speed('fastest') 
     screen.tracer(0) 

     mandelbrot = Mandelbrot() 

     for x in range(-150, 151): 
      for y in range(-150, 151): 
       mandelbrot.computeCardinality(turtleConvert(x, y)) 
       self.t.color(mandelbrot.getColor()) 
       self.t.goto(x, y) 
      screen.update() 

     screen.tracer(1) 

def turtleConvert(x, y): # converts from turtle pixels to the complex plane 
    return complex(x/75, y/75) 

screen = Screen() 
dummy = Display(screen) 
screen.mainloop() 

Das zweite Problem ist, dass, wenn Sie auf dem Bild, sehen ich oben erzeugt, werden Sie leichte geschwungene Linien über sie sehen. Je nachdem, welches System Sie verwenden, können Sie diese Erfahrung machen oder nicht. Wenn Sie dies tun bekommen, oder wollen einfach nur über sie erfahren, siehe:

2

ich das gleiche Problem auf Linux Mint, aber ich sehe es zieht Oberteil und später entfernt es es.

Problem ist, weil goto(x,y) weiße Linie zeichnet, wenn Schildkröte in der nächsten Spalte von oben nach unten bewegt - dh. von (0, 150) bis (1, -150) - und diese Zeile entfernt einen Teil Ihres Bildes.

Sie müssen es Linie

for x in range(-150,151): 
     for y in range(-150,151): 
      self.t.color(Mandelbrot(turtleConvert(x,y)).getColor()) 
      self.t.goto(x,y) 

     # move to bottom in next column without creating white line 
     self.t.up() 
     self.t.goto(x+1, -150) 
     self.t.down() 

Oder bewegen Sie es manuell ohne Zeichnung verschieben, bevor Sie jede neue Spalte

for x in range(-150, 151): 
     # move to bottom without creating white line 
     self.t.up() 
     self.t.goto(x, -150) 
     self.t.down() 

     for y in range(-150, 151): 
      self.t.color(Mandelbrot(turtleConvert(x,y)).getColor()) 
      self.t.goto(x,y) 
+1

Nizza Fang starten! (+1) Ich habe diesen Fehler mit ähnlichen Grafiken gesehen, [Turtle Grafiken zeichnen über sich selbst] (https://Stackoverflow.com/a/40985057/5771269), verpasste es aber dieses Mal, da mein System ein vollständiges Bild zeigte. – cdlane