5

我创建了一个 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)

以及尺寸定义:

size1 = 500
size2 = 500
n=64
box=((-2,1.25),(0.5,-1.25))
plus = size[1]+size[0]
uleft = box[0]
lright = box[1]
xwidth = lright[0] - uleft[0]
ywidth = uleft[1] - lright[1]

我需要修改什么以使其呈现集合的某个部分?

4

2 回答 2

15

该行:

box=((-2,1.25),(0.5,-1.25))

是定义正在渲染的坐标空间区域的位,因此您只需要更改此行。第一个坐标对是区域的左上角,第二个是右下角。

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

X_complex=X_complex_origin+(X_image/X_image_width)*X_complex_width
于 2009-02-07T18:31:16.433 回答
4

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

coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth))

实际上,与屏幕像素坐标相对应的xy值正在被转换为正在查看的复平面上的对应点。这意味着(0,0)屏幕坐标将转换到被查看的左上区域(-2,1.25),并且将是相同的,但移动了 1/500和x 坐标(1,0)之间的距离(假设窗口宽度为 500 像素) 。-20.5

这正是那条线正在做的事情——我将用更多说明性的变量名称扩展 X 坐标位以表明这一点:

mandel_x = mandel_start_x + (screen_x / screen_width) * mandel_width

mandel_变量是指复平面上的坐标,screen_变量是指被绘制像素的屏幕坐标。)

如果你想放大屏幕的一个区域,你想做同样的事情:获取左上角和右下角区域的屏幕坐标,将它们转换为复平面坐标,然后使那些新的 uleft 和 lright 变量。即放大由屏幕坐标 (x1,y1)..(x2,y2) 分隔的框,使用:

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))

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

如果您好奇,mandelbrot 集背后的数学并没有那么复杂(只是复杂)。它所做的只是取一个特定的坐标,把它当作一个复数,然后反复平方它并将原始数字加到它上面。

对于某些数字,这样做会导致结果发散,在您重复该过程时不断向无穷大增长。对于其他人,它将始终保持在某个水平以下(例如,显然 (0.0, 0.0) 在此过程中永远不会变大。曼德布罗集(黑色区域)是那些不发散的坐标。已经证明,如果任何数字超过 5 的平方根,它都会发散 - 您的代码只是用作(~ )2.0的近似值,但这不会产生太大的差异。 sqrt(5)2.236

通常,分歧的区域会绘制出它们超过该值(trials代码中的变量)所需的过程迭代次数,这就是产生彩色区域的原因。

于 2009-02-07T20:19:36.137 回答