2012-02-11 8 views
6

Il mio programma per la creazione di un set Mandelbrot ha un bug: ogni volta che la penna cambia colore, e ogni 42 pixel dopo, è più leggero. Questo è, piuttosto casualmente, un mandelbug (sì, ho appena appreso quel termine), poiché è incoerente per molti pixel vicino a un "bordo" (potrebbe essere effettivamente sfocato tra il colore che dovrebbe essere e il colore l'ultimo, oppure successivamente, il pixel dovrebbe essere), ma è sempre il 42 ° pixel dopo quello fino al prossimo cambio di colore. Sto usando OSX 10.6.8, PYTHON 2.7. Quando ho scritto questo programma a scuola, ha funzionato perfettamente (Windows), e poi l'ho inviato a me stesso, e ci ho lavorato un po 'di più (principalmente solo facendo la dimensione del campione e quindi l'immagine più grande), e l'ho eseguito, ho ottenuto questo bug. EDIT: Il mio male, ho dimenticato di dire che questo accade solo con il mio programma Mandelbrot, gli altri pochi programmi di tartaruga che ho a casa stanno bene.Perché i pixel di alleggerimento delle tartarughe?

Parti di screenshot (in modo che non c'è bisogno di aspettare per sempre, mentre il programma viene eseguito per vedere che cosa sto parlando):

Dalla mia prima versione da casa:

I mean, just what?

Dalla versione corrente (lateralmente):

Please Note: this image is sideways

Ecco il codice:

import turtle 
import math 
turtle.speed(0) 
def benoit(onelen): 
    turtle.left(90) 
    for x in range(-2*onelen, onelen): 
     turtle.up() 
     turtle.goto(x, int(-1.5*onelen)-1) 
     turtle.down() 
     for y in range(int(-1.5*onelen)-1, int(1.5*onelen)-1): 
      z = complex(0,0) 
      c = complex(x*1.0/onelen,y*1.0/onelen) 
      for k in range(20): 
       z = z*z+c 
       if abs(z) > 2: 
        g = .2 + .8*(20-k)/20 
        break 
       if k == 19: 
        g = 0 
      turtle.pencolor(0,g,0) 
      turtle.forward(1) 
benoit(250) 
x = raw_input("Press Enter to Exityadayadayada") 

MODIFICA: una correzione è stata suggerita da DSM, a cui piace questo errore. Tuttavia, non ho esperienza nel modificare il codice sorgente Python, e tutti i caratteri di sottolineatura mi rendono nervoso. Qualcuno può dirmi specificatamente cosa modificare e/o come?

+1

Quanto tempo è necessario per eseguire questa operazione sulla macchina? Sta prendendo per sempre sul mio. –

+0

Sì, lo so, dovrebbe farlo; L'ho fatto notare nella mia domanda. Ecco perché ho fornito gli screenshot; sentiti libero di scaricarli e guarda più da vicino – IronBeard

risposta

6

Wow. Penso che questo sia uno dei miei bug preferiti in assoluto, e che ci crediate o no, il fatto che il numero sia 42 è davvero rilevante! Beh, perifericamente, in ogni caso .. In turtle.py:

def _goto(self, end): 
     """Move the pen to the point end, thereby drawing a line 
     if pen is down. All other methodes for turtle movement depend 
     on this one. 

[...] 

    ###### vererbung!!!!!!!!!!!!!!!!!!!!!! 
    self._position = end 
    if self._creatingPoly: 
     self._poly.append(end) 
    if len(self.currentLine) > 42: # 42! answer to the ultimate question 
            # of life, the universe and everything 
     self._newLine() 
    self._update() #count=True) 

Così il problema si verifica quando si decide di interrompere una riga, a quanto pare per motivi di prestazioni:

def _newLine(self, usePos=True): 
    """Closes current line item and starts a new one.            
     Remark: if current line became too long, animation           
     performance (via _drawline) slowed down considerably.          
    """ 

sono stato in grado di " sistemare "il bug alzando il limite del numero e/o diffondendo riferimenti self._pencolor in luoghi che non ne avevano. Ma non sei pazzo, comunque, e non è proprio niente che tu stia facendo. :-)

+0

SI! LO SAPEVO! Sapevo che era un riferimento Guida Hitchhikers! Non conoscevo la parte della performance o da dove veniva, anche se pensavo che fosse nella fonte delle tartarughe da qualche parte. Il fatto è che quando creo un programma che disegna solo una linea, il bug non viene visualizzato. Qualche idea? Inoltre, come posso inserire riferimenti self._pencolor? faccio solo linee che dicono self._pencolor? PS: questo è ora anche il mio bug preferito. – IronBeard

0

Posso offrire un suggerimento?

ho provato il tuo codice e ci sono voluti per sempre per eseguire ciò di cui sei a conoscenza, ma ciò di cui potresti non essere a conoscenza è la funzione di tracciamento ...Ho semplicemente messo all'inizio del codice:

wn=turtle.Screen() 
wn.tracer(10000) 

che elimina anche la necessità per la velocità (0) Funzione :)

Prova che ed eseguirlo di nuovo, ho fatto ed è renderizzato l'intera immagine in 62 secondi, i contati importando il modulo time mettendo questo codice all'inizio:

import time 
st=time.time() 

e questo codice alla fine:

print time.time()-st 

Ben fatto, Ive ha appena reso la mia molto più lenta e bassa della tua, ma utilizzava una matrice di forma quadrata e timbratura in ogni posizione che volevo nell'array lol, ma proverò a migliorarla in futuro, come ho scoperto, la tartaruga esisteva meno di una settimana fa.

Un'ultima cosa, se si digita:

from turtle import * 

invece di "tartaruga import" non avete bisogno di mettere tartaruga all'inizio di ogni funzione chiamata :) stessa cosa vale per tutti gli altri moduli.

Ive ha incluso la foto del tuo frattale che ha impiegato 62 secondi per il rendering sulla mia macchina che non è nemmeno potente Your code run on my weak machine.

Spero che tutto questo ti aiuti molto. noterai anche che non ho questo problema con la linea di luce, non sono sicuro che hai risolto il problema nel codice originale?

Problemi correlati