Возникли проблемы при попытке использовать словарь для определения параметров папоротника Барнсли - PullRequest
1 голос
/ 06 июля 2019

Я сделал рендеринг Barnsley Fern с использованием Python и Pygame и хотел включить все параметры в словарь для быстрого доступа, но он не работает.

Исходный код, который я написал, работает, как и ожидалось. Я попытался использовать словарь с ключами «a», «b», «c», «d», «e», «f» и «p» для всех параметров генерации папоротника Барнсли, как показано в https://en.wikipedia.org/wiki/Barnsley_fern.

Когда я запускаю код, окно зависает и:

Traceback (most recent call last):  
  File "C:/Users/owner/Desktop/Will's Stuff/Python/Pygame/Bransley'sFernDictionary.py", line 105, in <module>
    DrawPoint(fernx,ferny)  
  File "C:/Users/owner/Desktop/Will's Stuff/Python/Pygame/Bransley'sFernDictionary.py", line 47, in DrawPoint
    pygame.gfxdraw.pixel(screen,cartesianx,cartesiany,white)
OverflowError: signed short integer is less than minimum

Я ожидал, что папоротник Брэнсли, как показано в статье в Википедии, это то, что было создано в коде без словаря, но окно просто вылетает после построения нескольких пикселей.

import pygame  
import random  
import pygame.gfxdraw  
import math  
import sys  
pygame.init()  

def GeneralAlgorithm(a,b,c,d,e,f,x,y):  
    outputx = a*x + b*y + e  
    outputy = c*x + d*y + f  
    return outputx,outputy  

def GenerateNextPoint(x,y,constants):  
    randompercentage = random.randint(0,100)  
    for n in constants['p']:  
        if randompercentage <= n:  
            i = constants['p'].index(n)  
            print(i)  
            break  
    nextx, nexty = GeneralAlgorithm(constants['a'][i],constants['b'][i],constants['c'][i],constants['d'][i],constants['e'][i],constants['f'][i],x,y)  
    return nextx, nexty  

def DrawPoint(fernx,ferny):  
    cartesianx = int((fernx+2.1820+margin) * (width /(2.1820+2.6558+2*margin)))  
    cartesiany = int((ferny*-1+9.9983+margin) * (height/(9.9983+2*margin)))  
    pygame.gfxdraw.pixel(screen,cartesianx,cartesiany,white)  
    pygame.display.update()  


white = 255,255,255  
background = 20,40,100  

variables1 = {  
    'a':[0   ,0.85 ,0.2  ,-0.15],  
    'b':[0   ,0.04 ,-0.26,0.28 ],  
    'c':[0   ,-0.04,0,23 ,0.26 ],  
    'd':[0.16,0.85 ,0.22 ,0.24 ],  
    'e':[0   ,0    ,0    ,0    ],  
    'f':[0   ,1.6  ,1.6  ,0.44 ],  
    'p':[1   ,86   ,93   ,100  ]  
}  

fernx = 0  
ferny = 0  
width = int(500)  
height = int(500)  
margin = 0.5  

screen = pygame.display.set_mode((width,height))  
screen.fill(background)  
pygame.display.update()  

while True:  

    fernx,ferny = GenerateNextPoint(fernx,ferny,variables1)
    DrawPoint(fernx,ferny)

1 Ответ

0 голосов
/ 08 июля 2019

Боже мой, я дурак.

variables1 = {  
    'a':[0   ,0.85 ,0.2  ,-0.15],  
    'b':[0   ,0.04 ,-0.26,0.28 ],  
    'c':[0   ,-0.04,0,23 ,0.26 ],  
    'd':[0.16,0.85 ,0.22 ,0.24 ],  
    'e':[0   ,0    ,0    ,0    ],  
    'f':[0   ,1.6  ,1.6  ,0.44 ],  
    'p':[1   ,86   ,93   ,100  ]  
}  

Посмотрите внимательно на 'c'

    'c':[0   ,-0.04,0,23 ,0.26 ],

Где точка должна быть помещена, я использовал запятую.

Просто изменив это исправил мой алгоритм.

variables1 = {  
    'a':[0   ,0.85 ,0.2  ,-0.15],  
    'b':[0   ,0.04 ,-0.26,0.28 ],  
    'c':[0   ,-0.04,0.23 ,0.26 ],  
    'd':[0.16,0.85 ,0.22 ,0.24 ],  
    'e':[0   ,0    ,0    ,0    ],  
    'f':[0   ,1.6  ,1.6  ,0.44 ],  
    'p':[1   ,86   ,93   ,100  ]  
}  

Ответ очень прост.

FML

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