Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何';缩放';在Mandelbrot集合的一部分?_Python_Math_Mandelbrot - Fatal编程技术网

Python 如何';缩放';在Mandelbrot集合的一部分?

Python 如何';缩放';在Mandelbrot集合的一部分?,python,math,mandelbrot,Python,Math,Mandelbrot,我创建了一个Python文件来生成Mandelbrot集图像。最初的数学代码不是我的,所以我不理解它——我只是对它进行了大量修改,使它快了大约250倍(线程规则!) 无论如何,我想知道如何修改代码的数学部分,使其呈现一个特定的位。以下是数学部分: for y in xrange(size[1]): coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth)) z = c

我创建了一个Python文件来生成Mandelbrot集图像。最初的数学代码不是我的,所以我不理解它——我只是对它进行了大量修改,使它快了大约250倍(线程规则!)

无论如何,我想知道如何修改代码的数学部分,使其呈现一个特定的位。以下是数学部分:

for y in xrange(size[1]):
        coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth))
        z = complex(coords[0],coords[1])
        o = complex(0,0)
        dotcolor = 0  # default, convergent
        for trials in xrange(n):
            if abs(o) <= 2.0:
                o = o**2 + z
            else:
                dotcolor = trials
                break  # diverged
        im.putpixel((x,y),dotcolor)
我需要修改什么才能使其呈现集合的特定部分?

行:

box=((-2,1.25),(0.5,-1.25))
是定义正在渲染的坐标空间区域的位,因此您只需更改此行。第一个坐标对是区域的左上角,第二个是右下角

从图像中获取新坐标应该非常简单。您有两个坐标系,您的“图像”系统大小为100x100像素,原点为(0,0)。以及由“框”定义的“复杂”平面坐标系。对于X:


理解如何做到这一点的关键是理解
coords=
行在做什么:

coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth))
实际上,与屏幕像素坐标相对应的循环中的
x
y
值被转换到正在查看的复平面上的对应点。这意味着
(0,0)
屏幕坐标将转换到正在查看的左上区域
(-2,1.25)
,并且
(1,0)
将是相同的,但移动了
-2
0.5
x坐标之间距离的1/500(假设窗口宽度为500像素)

这正是该行所做的-我将用更具说明性的变量名展开X坐标位,以表明这一点:

mandel_x = mandel_start_x + (screen_x / screen_width) * mandel_width
(mandel变量指的是复杂平面上的坐标,
screen变量指的是正在绘制的像素的屏幕坐标。)

如果你想放大屏幕的某个区域,你需要做完全相同的事情:获取左上角和右下角区域的屏幕坐标,将它们转换为复杂的平面坐标,并将它们作为新的uleft和lright变量。ie要放大由屏幕坐标(x1,y1)…(x2,y2)分隔的框,请使用:

(显然,您需要根据新坐标重新计算大小、xwidth、ywidth和其他因变量)

如果你好奇的话,mandelbrot集合背后的数学并没有那么复杂(只是复杂)。 它所做的只是取一个特定的坐标,将其视为一个复数,然后重复地将其平方,并将原始的数字相加

对于某些数字,这样做会导致结果发散,并在重复该过程时不断向无穷大方向增长。对于其他人来说,它将始终保持在某个水平以下(例如,显然(0.0,0.0)在此过程中不会变得更大。mandelbrot集(黑色区域)是那些不发散的坐标。它表明,如果任何数字超过5的平方根,它将发散-您的代码只是使用
2.0
作为它的近似值
sqrt(5)
(~
2.236
),但这不会有太大的区别


通常,发散的区域会被绘制为超过此值(代码中的
试验
变量)的过程的迭代次数,这就是产生彩色区域的原因。

谢谢!我如何将其转换为X和Y值?是否可能?框中包含两个X,Y对:框=((X,Y),(X,Y))这回答了你的问题吗?啊,很抱歉,我搞错了。我的意思是,如果我有完整渲染图像的尺寸(比如100x100),我如何将100x100图像的一部分的x和y值转换为x和y值以“放大”呢?我怀疑这是可能的,谢谢你的回答!这应该很简单。你有两个坐标系,你的“图像”系统大小为100x100像素,原点为(0,0)。你的“复杂”平面坐标系由“长方体”。对于X:X_复数=X_复数_原点+(X_图像/X_图像宽度)*X_complex_width也许我应该编辑我的答案!谢谢!你能更新你的答案吗,以防我需要检查这里并忘记注释!我想念你如何使用线程来加快代码速度,因为线程上的python字节码不会因为GIL而同时执行。
coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth))
mandel_x = mandel_start_x + (screen_x / screen_width) * mandel_width
new_uleft = (uleft[0] + (x1/size[0]) * (xwidth), uleft[1] - (y1/size[1]) * (ywidth))
new_lright = (uleft[0] + (x2/size[0]) * (xwidth), uleft[1] - (y2/size[1]) * (ywidth))