2012-02-11 4 views
6

Mi programa para crear un conjunto de Mandelbrot tiene un error: siempre que el lápiz cambia de color, y cada 42º píxel después de eso, es más claro. Esto es, casualmente, un mandelbug (sí, acabo de aprender ese término), ya que es inconsistente para muchos píxeles cerca de un "borde" (en realidad podría estar borroso entre el color que se supone que es y el color el último, o a continuación, se supone que es el píxel), pero siempre es el 42º píxel después de ese hasta que cambie el siguiente color. Estoy usando OSX 10.6.8, PYTHON 2.7. Cuando escribí este programa en la escuela, funcionó perfectamente (Windows), y luego me lo envié a mí mismo, trabajé un poco más (principalmente haciendo que el tamaño de la muestra y, por lo tanto, la imagen fuera mayor), y lo ejecuté, obtuve esto error. EDITAR: Es malo, olvidé mencionar que esto solo sucede con mi programa Mandelbrot, los otros pocos programas de tortugas que tengo en casa están bien.¿Por qué los píxeles del aligeramiento de tortugas?

Partes de imágenes (de modo que usted no tiene que esperar para siempre, mientras se ejecuta el programa para ver lo que estoy hablando):

Desde mi primera versión de la casa:

I mean, just what?

A partir de la versión actual (de lado):

Please Note: this image is sideways

Aquí está el código:

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") 

EDITAR: Una solución ha sido sugerida por DSM, a quien le gusta este error. Sin embargo, no tengo experiencia en editar el código fuente de Python, y todos los guiones bajos me ponen nervioso. ¿Puede alguien decirme específicamente qué editar y/o cómo?

+1

¿Cuánto tiempo lleva ejecutar esto en su máquina? Está tomando para siempre el mío. –

+0

Sí, lo sé, se supone que debe hacer eso; Lo señalé en mi pregunta. Es por eso que proporcioné las capturas de pantalla; no dude en descargarlos y mirar más de cerca – IronBeard

Respuesta

6

Wow. Creo que este es uno de mis errores favoritos, y lo crea o no, ¡el hecho de que el número sea 42 es realmente relevante! Bueno, periféricamente, de todos modos .. En 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) 

Así que el problema se produce cuando se decide romper una línea, al parecer por razones de rendimiento:

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.          
    """ 

pude " corrige "el error al aumentar el límite de número de lienzo y/o dispersar referencias self._pencolor en lugares que no tenían ninguno. Pero no estás loco, de todos modos, y no es realmente nada de lo que estás haciendo. :-)

+0

¡SÍ! ¡LO SABÍA! ¡Sabía que era una referencia de Hitchhikers Guide! No sabía la parte del rendimiento o de dónde venía, aunque supuse que estaba en la fuente de la tortuga en alguna parte. El problema es que cuando hago un programa que simplemente dibuja una línea, el error no aparece. ¿Algunas ideas? Además, ¿cómo pongo las referencias de self._pencolor? ¿Acabo de poner líneas que dicen self._pencolor? PD: ahora también es mi error favorito. – IronBeard

0

¿Puedo ofrecer una sugerencia?

intenté con su código y le llevó un tiempo ejecutar el que conoce pero de lo que quizás no tenga conocimiento es de la función trazadora ...Yo simplemente puse al comienzo de su código:

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

que también elimina la necesidad de la velocidad (0) :) función

Intenta eso y ejecutarlo de nuevo, lo hice y rendí la imagen completa en 62 segundos, lo cronometré importando el módulo de tiempo poniendo este código al principio:

import time 
st=time.time() 

y este código al final:

print time.time()-st 

Bien hecho por cierto, acabo de hacer mío eso es mucho más lento y de menor calidad que el tuyo, pero estaba usando una matriz de forma cuadrada y estampado en cada ubicación que quería en el arreglo jajaja, pero trataré de mejorarlo en el futuro, ya que solo descubrí que la tortuga existía hace menos de una semana.

Una última cosa, si escribe:

from turtle import * 

en lugar de "tortuga de importación" ya no tienes que poner tortuga al comienzo de cada función llamada :) Lo mismo ocurre con cualquier otro módulo.

He incluido la imagen de tu fractal que tardó 62 segundos en renderizar en mi máquina que no es tan potente Your code run on my weak machine.

Espero que todo esto lo ayude en gran medida. también notará que no tengo ese problema de línea luminosa, ¿no estoy seguro si solucionó ese problema en el código original arriba?

Cuestiones relacionadas