朱莉娅集分形

Posted

技术标签:

【中文标题】朱莉娅集分形【英文标题】:Julia set fractals 【发布时间】:2014-02-04 03:17:19 【问题描述】:

我编写了一个程序来生成 Julia 集分形。该程序还允许用户输入他们的 c 值或让程序生成一个随机值。这是代码:-

import pygame, sys, math, cmath, random
from pygame.locals import *
print("Julia set fractal generator")
custom = int(input("Do you want a custom set? Yes(1); No(-1): "))
if custom == -1:
    c = complex((random.randint(-999,1000))/1000.0,(random.randint(-999,1000))/1000.0)
else:
    a = float(input("Real?: "))
    b = float(input("Imaginary?: "))
    c = complex(a,b)
lim = 4
limn = -4
mul = 0
iteration_detail = 100
screen = pygame.display.set_mode((512,512),0,32)
pygame.display.set_caption("Julia set fractal generator")
def iterate (px_i,py_i,iters):
    itnum = 1
    z = complex(((px_i-256)/512.0)*4,((py_i-256)/512.0)*4)
    while itnum <= iters:
        if z.real >= lim or z.imag >= lim or z.real <= limn or z.imag <= limn:
                break
        z = z**2 + c
        itnum += 1
return(z.real, z.imag, itnum)
def pixel_color_set (iterx, itery, iterations):
    pixel_color = (0,0,0)
    if iterx >= lim or itery >= lim or iterx <= limn or itery <= limn:
        if iterations < 2:
                pixel_color = (204,0,102)
        elif iterations == 2:
                pixel_color = (204,0,204)
        elif iterations == 3:
                pixel_color = (102,0,204)
        elif iterations ==4:
                pixel_color = (0,0,204)
        elif iterations ==5:
                pixel_color = (0,102,204)
        elif iterations ==6:
                pixel_color = (0,204,204)
        elif iterations ==7:
                pixel_color = (0,204,102)
        elif iterations ==8:
                pixel_color = (0,204,0)
        elif iterations ==9:
                pixel_color = (102,204,0)
return(pixel_color)
def draw_pixel (px, py, color):
return(screen.fill(color, ((px, py),(1, 1))))
while 1:
for event in pygame.event.get():
        if event.type == QUIT:
                pygame.quit()
                sys.exit()
        if event.type == KEYDOWN:
                if event.key == K_UP:
                        mul = 0.1
                elif event.key == K_DOWN:
                        mul = -0.1
                if event.key == K_SPACE:
                        pygame.image.save(screen, "fractal.jpg")
        if event.type == KEYUP:
                 if event.key == K_UP:
                        mul = 0
                 elif event.key == K_DOWN:
                        mul = 0
        c += mul
ypxl = 0
while ypxl < 512:
        xpxl = 0
        while xpxl < 512:
                ipxl = iterate(xpxl,ypxl,iteration_detail)
                cpxl = pixel_color_set(ipxl[0], ipxl[1], ipxl[2])
                draw_pixel(xpxl, ypxl, cpxl)
                xpxl += 1
        ypxl += 1
pygame.display.update()

该代码确实有效,但它没有按预期生成分形。例如这个分形:-z = z**2 + c 其中c 等于 c = complex(-0.1, 0.651) 它应该看起来像这样

但它看起来像这样

我的代码有什么问题?此外,我无法制作缩放机制......不胜感激。

【问题讨论】:

这可能与缺少缩放机制有关。根据您放大的位置,分形非常不同。查看 youtube 以获取缩放分形的视频。看起来你只是获得了一个不那么有趣的职位。 @turbo 实际上,这是分形的最外层位置。如果我的程序正常运行,结果应该和上图类似。 嗯,也许你的迭代次数太少或太多? 尝试增加迭代次数 @turbo 我已经尝试了 10、50、100、1000、10000 次迭代,所有这些都给出了相同的结果。 :-/ 【参考方案1】:

像这样更改the pixel_color_set 效果很好。 从 0 到 iteration_detail 的迭代被缩放到 0 到 255 的范围内。

def pixel_color_set (iterx, itery, iterations):
    pixel_color = (0,0,0)
    if iterx >= lim or itery >= lim or iterx <= limn or itery <= limn:
        RGB =int(math.sqrt(iterations) * int(255.0 / math.sqrt(iteration_detail)))
        # RGB = iterations * int(255.0/ iteration_detail)
        pixel_color = (RGB, RGB, RGB)
    return(pixel_color)

我认为带有math.sqrt 的那个看起来更好一些,但是两者都试一下,然后选择你想要的。

【讨论】:

我该如何感谢你? :) 我希望我能做点什么来报答你。没有你的帮助,我什么都做不了……谢谢!! 没问题,这就是这个网站的用途:)【参考方案2】:

如果您使用除以 10 的迭代计数的余数来决定颜色,您也可以使用原始着色算法。但是,您必须首先检查最大计数以使内部始终为黑色。或者在计算循环之后通过将迭代次数设置为-1来编码最大计数,这样更容易在着色方法中检查。

【讨论】:

我还需要一个方法来缩放...有什么想法吗?【参考方案3】:

我的代码有什么问题?

没什么,你有很好的形象,但你想要不同的形象。为了使新图像改变绘图算法。你要制作的图片是:Julia set for fc(z)=z*z + c and c=-0.1+0.651. Made using DEM/J

它是用distance estimation 制作的,而不是像你的程序中那样使用转义时间

所以简单地改变算法

HTH

【讨论】:

以上是关于朱莉娅集分形的主要内容,如果未能解决你的问题,请参考以下文章

Java分形

分形之美

Python分形盒计数 - 分形维数

递归分形

递归分形

11E:分形盒