Пустые области при рисовании Heighway Dragon в Python - PullRequest
0 голосов
/ 31 марта 2020

Итак, я выполнил несколько упражнений из экзамена на аттестат зрелости, и было одно, чтобы нарисовать дракона-хейвея.

Программа должна фокусироваться на двух парах переменных:

x '= -0,4 * x - 1

y' = -0,4 * y + 0,1

и

x '= 0,76 * x -0,4 * y

y '= 0,4 * x + 0,76 * y

В начале x = 1 и y = 1, затем подсчитайте новые x и y, используя формула случайно взятой пары, показанная выше (шанс 50/50) и отметьте точку (x, y) на графике. Все повторяют 5000 раз.

Итак, я попробовал его, используя python, но проблема в том, что когда я наконец нарисовал дракона, на графике я мог видеть, что это не был один постоянный рисунок, но у него были пустые области, как на фотографии ниже , Это все еще приемлемо или я допустил ошибку? Есть ли способ, чтобы он выглядел как правильный?

Мой график

Правильный для сравнения

Мой код:

import matplotlib.pyplot as plt
import random


x = 1
y = 1
sumx = 0
sumy = 0
max_x = 0
max_y = 0

for i in range(5000):

    rand = random.randint(0, 1)
    if rand == 0:
        x = (-0.4 * x) - 1
        y = (-0.4 * y) + 0.1
    else:
        x = (0.76 * x) - (0.4 * y)
        y = (0.4 * x) + (0.76 * y)
    if i >= 100:
        sumx += x
        sumy += y
        plt.plot(x, y, c='black', marker='P', markersize=6)

        if x > max_x:
            max_x = x
        if y > max_y:
            max_y = y

plt.show()
avg_x = sumx / 5000
avg_y = sumy / 5000
print(round(avg_x, 1), round(avg_y, 1))
print('maximum x: ' + str(max_x) + ', maximum y: ' + str(max_y))

1 Ответ

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

Если координаты x' и y' определенно рассчитаны так, как вы их написали выше, тогда ваш код в порядке (хотя я не уверен, почему вы начинаете черчение только после того, как повторили 100 раз).

Однако, вызов функции построения графика pyplot требует больших вычислительных ресурсов, поэтому я бы предложил следующее:

  • вычислите все ваши значения x и y и сохраните их в списках
  • сделайте один вызов plt.scatter вне вашего номера для l oop

, таким образом, время выполнения вашего кода значительно улучшится. Я сделал это в следующем коде, а также убрал условие i >= 100. Я также изменил способ генерации случайного числа, чтобы увидеть, оказал ли он влияние, но он все еще производит очень похожий вывод на исходный код (см. Изображение ниже).

import matplotlib.pyplot as plt
import random
import sys

x = 1
y = 1
sumx = 0
sumy = 0
max_x = 0
max_y = 0

x_values = []
y_values = []

for i in range(5000):
    rand = random.uniform(0,1)
    if rand <= 0.5:
        x = ((-0.4 * x) - 1)
        y = ((-0.4 * y) + 0.1)
        x_values.append(x)
        y_values.append(y)
    else:
        x = ((0.76 * x) - (0.4 * y))
        y = ((0.4 * x) + (0.76 * y))
        x_values.append(x)
        y_values.append(y)
    sumx += x
    sumy += y

    if x > max_x:
        max_x = x
    if y > max_y:
        max_y = y

plt.scatter(x_values, y_values, c='black', marker='P')
plt.ylim([-1, 0.4])
plt.xlim([-1.5, 0.5])
plt.show()

avg_x = sumx / 5000
avg_y = sumy / 5000
print(round(avg_x, 1), round(avg_y, 1))
print('maximum x: ' + str(max_x) + ', maximum y: ' + str(max_y))

dragon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...