Нарисуй интерактивный Мандельброт с пиглетом - PullRequest
0 голосов
/ 22 марта 2020

У меня есть функция, которая вычисляет множество Мандельброта в массиве размером numpy (500 500). Я могу нарисовать это в matplotlib. Теперь я хочу увеличить изображение с помощью мыши. Я хочу использовать Pyglet для этого, но бороться с рендерингом. Я знаю, что это (не рабочее) решение не элегантно, поэтому я рад советам, как сделать это лучше!

PS: Уровень масштабирования установлен прямо сейчас, моя проблема, которую я прошу о помощи, заключается в обновлении.

Функции, которые я заменил строкой документации, можно найти здесь

from pyglet.window import mouse
import pyglet
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
from pyglet import image
"""
def calc_pixel_array(x_center: float = 0, y_center: float = 0, 
                     scale: float = 1.0, width: int = 500, 
                     height: int = 500, threshold: int = 200):
    Returns numpy array with shape (500,500) with color values

def plot_pixel_array(pixel_array, cmap: str = 'gnuplot', show_plot: bool = False):
    Draws pixel_array via matplotlib and saves in curent_mandelbrot.png
"""    
pixel_array = calc_pixel_array()
plot_pixel_array(pixel_array)

scale = 1
i = 1
window = pyglet.window.Window(width = 500, height = 500)
image = pyglet.resource.image('curent_mandelbrot.png')
pic = image.load('curent_mandelbrot.png')

@window.event
def on_draw():
    window.clear()
    pic.blit(0, 0)

@window.event
def on_mouse_press(x, y, button, modifiers):
    if button == mouse.LEFT:
        i = np.random.randint(5)+1
        pixel_array = calc_pixel_array(scale/(10*i))
        plot_pixel_array(pixel_array)
        window.clear()
        image = pyglet.resource.image('curent_mandelbrot.png')
        image.blit(0,0)


pyglet.app.run()

1 Ответ

0 голосов
/ 22 марта 2020

Привет, после долгих попыток, я нашел this

 def draw_pixel_array(self, window):
        main_batch = pyglet.graphics.Batch()
        shape = self.pixel_array.shape
        for x in range(shape[0]):
            for y in range(shape[1]):
                color = int(self.pixel_array[x, y])
                pyglet.graphics.draw(1, pyglet.gl.GL_POINTS,
                                     ('v2i', (x, y)),
                                     ('c3B', (color, color, 0)))
        main_batch.draw()

Запустил его, убрав on draw и поместив все (вычисление и рисование) в функцию on_mouse_press.

Вы найдете полное решение здесь . Это все еще очень медленно в рисовании, любые предложения там тепло приветствуются!

...