有人能搞乱它吗?

2024-04-25 17:15:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python的新手,我对它产生分形图像的能力非常感兴趣。我自己也写了一些简单的,但我刚刚发现了曼德尔布罗特分形的脚本。。。它能以你想要的分辨率产生美丽的全彩图像。。。。但是代码被混淆了,看起来像曼德尔布洛特的ASCII艺术。。。。真的很酷,但是如果你想轻松阅读的话就太傻了。它包含了我在python中还没有学到的函数,所以如果有人可以缩进脚本使其看起来像普通的python脚本,那就太好了。 剧本:

_                                      =   (
                                        255,
                                      lambda
                               V       ,B,c
                             :c   and Y(V*V+B,B,  c
                               -1)if(abs(V)<6)else
               (              2+c-4*abs(V)**-0.4)/i
                 )  ;v,      x=7200,4800;C=range(v*x
                  );import  struct;P=struct.pack;M,\
            j  ='<QIIHHHH',open('M.bmp','wb').write
for X in j('BM'+P(M,v*x*3+26,26,12,v,x,1,24))or C:
            i  ,Y=_;j(P('BBB',*(lambda T:(T*80+T**9
                  *i-950*T  **99,T*70-880*T**18+701*
                 T  **9     ,T*i**(1-T**45*2)))(sum(
               [              Y(0,(A%3/3.+X%v+(X/v+
                               A/3/3.-x/2)/1j)*2.5
                             /x   -2.7,i)**2 for  \
                               A       in C
                                      [:9]])
                                        /9)
                                       )   )

就像我说的,艺术很酷,但是太难读了!如果有人能做到这一点,我将万分感激。在


Tags: lambda代码in图像脚本for分辨率能力
1条回答
网友
1楼 · 发布于 2024-04-25 17:15:05

注意:这并不是一个明确的答案,而是一步一步地进行模糊处理。如果你能提供一个额外的步骤,使事情更清楚,如果你能把它加到这个答案中,那就太好了。

好的,让我们从给代码适当的换行和缩进开始:

_ = (255,
    lambda V, B, c: c and Y(V*V + B, B, c-1) if(abs(V) < 6) else (2 + c - 4 * abs(V)**-0.4)/i)
v, x = 7200, 4800
C = range(v*x)
import struct
P=struct.pack
M, j = '<QIIHHHH', open('M.bmp','wb').write
for X in j('BM' + P(M, v*x*3+26, 26, 12, v, x, 1, 24)) or C:
    i, Y = _
    j(
        P('BBB',
                *(lambda T: (T * 80 + T**9 * i - 950 * T**99, T*70 - 880* T**18 + 701* T**9, T* i**(1-T**45*2)))(
                    sum([Y(0, (A%3/3. + X%v + (X/v + A/3/3. - x/2)/1j) * 2.5/x - 2.7, i)**2 for A in C[:9]]) / 9
                )
        )
    )

好一点,但还是让人困惑。例如,将P定义为struct.pack的别名,并将这两个声明全部放在一行中。如果我们去掉它们,并将lambda定义移到循环之外,我们得到:

^{pr2}$

现在事情开始明朗化了。循环为每个像素写入颜色值,lambda返回一个3元组,表示每个像素的蓝色、绿色和红色值。在

import struct
i = 255
Y = lambda V, B, c: c and Y(V*V + B, B, c-1) if abs(V) < 6 else (
                    (2 + c - 4 * abs(V)**-0.4)/i)
v = 7200
x = 4800
C = range(v*x)
M = '<QIIHHHH'
color = lambda T: (T * 80 + T**9 * i - 950 * T**99,
                   T*70 - 880* T**18 + 701 * T**9,
                   T * i**(1-T**45*2))
f = open('M.bmp', 'wb')
for X in f.write('BM' + struct.pack(M, v*x*3+26, 26, 12, v, x, 1, 24)) or C:
    f.write(struct.pack('BBB',
        *color(sum(
            [Y(0, (A%3/3. + X%v + (X/v + A/3/3. - x/2)/1j) * 2.5/x - 2.7, i)**2
                for A in C[:9]]) / 9))
    )

根据你的评论,the asterisk (the star, *) unpacks a list into an argument list。在

经过几个小时后,Mandelbrot set产生了近100 MB的图像:

Mandelbrot set

相关问题 更多 >