2013-10-26 5 views
3

Я пытаюсь преобразовать уравнение указана here в код Python:Проблемы преобразование фрактального уравнения для алгоритма Python

r = +/- (1+1.414sin(theta)cos(theta)-0.5cos(theta)cos(theta))^(1/6)exp(-0.4714(theta)) 

Это мой результат (немного взломан для целей тестирования):

import random 
import pygame 
import math 
from pygame.locals import * 

def random_spiral_pos(maxradius,theta=None): 
    "Finds a random position in a spiral galaxy pattern." 
    #Get a random angle (in rad). Could do this with a random 
    #variable in the range (0,2*pi), but this i clearer if inefficient 
    if theta == None: 
     theta=math.radians(random.randint(0,360)) 

    #Then use a fractal equation to get distance from center as a function 
    #of angle 
    #Source: http://www.philica.com/display_observation.php?observation_id=52 
    r = (1+1.414*math.sin(theta)*math.cos(theta) -0.5*math.cos(theta)*math.cos(theta))**(1/6)*math.exp(-0.4714*theta) 

    print(r) 

    #R will be in the range 0-1, so we multiply it by 
    #the radius of our drawing area 
    r=r*maxradius 

    #Convert the angle into polar coordinates, give the resultant vector 
    #magnitude R (polar coordinates are a direction vector from the 
    #origin), then floor those values so Pygame can use them 
    x=math.floor(math.cos(theta)*r) 
    y=math.floor(math.sin(theta)*r) 

    x=x+maxradius//2 
    y=y+maxradius//2 
    return (x,y) 


if __name__ == '__main__': 
    pygame.init() 
    screen = pygame.display.set_mode((600,600)) 
    clock=pygame.time.Clock() 
    pygame.key.set_repeat(25,5) 

    #Main loop 
    while 1: 

     #timing 
     clock.tick(60) 

     #gfx 
     screen.fill((0,0,0)) 
     screen.lock() 
     for t in range (0,360): 
      screen.set_at(random_spiral_pos(100,math.radians(t)),(255,255,255)) 
     screen.unlock() 
     pygame.display.flip() 

Однако результат кажется просто простой спиралью. Скорее всего, я только что сделал ошибку в преобразовании математической функции в оператор Python, так как представленная здесь математика - это некоторые способы, которые меня не устраивают. Это так, и как это должно быть выражено, если так?

ответ

3

Здесь есть хотя бы одна ошибка. У вас есть это:

r = (1+1.414*math.sin(theta)*math.cos(theta)*-0.5*math.cos(theta)*math.cos(theta))**(1/6)*math.exp(-0.4714*theta) 

и, по ссылке, так и должно быть:

r = (1+1.414*math.sin(theta)*math.cos(theta) -0.5*math.cos(theta)*math.cos(theta))**(1/6)*math.exp(-0.4714*theta) 

Кроме того, будьте осторожны с выражениями типа (1/6) в Python. Если вы используете Python2.X, то это будет выполнять целочисленное деление, а результат будет 0. Чтобы получить деление с плавающей запятой в качестве стандарта, вам необходимо поставить

from __future__ import division 

в верхней части вашего скрипта.

+1

Ваша модификация кода привносит ее в соответствие с тем, что предлагает графический инструмент автора, спасибо! Я использую Python 3, но я буду помнить об этом. К сожалению, я до сих пор не могу понять, как уравнение должно дать «график типичной спиральной галактики» ... – Schilcote

+0

В случае, если это помогло вам [принять ответ] (http://stackoverflow.com/help/accepted-answer) –

+0

Ну, проблема не решена, так как код не делает то, что мне нужно, но я уверен, что просто полностью не понимаю, с чем я работаю. – Schilcote