Homework 0:Mandelbrot Set

MandelbrotSet

纯图形学萌新,因为示例里有Julia set了,就实现了一个自己相对比较熟悉的Mandelbrot Set,其实对分型也不是很了解,直接按照复变函数公式写的代码

画面一直在放大,以展现Mandelbrot的无限细节

import taichi as ti

ti.init(arch=ti.gpu)

n = 320
pixels = ti.var(dt=ti.f32, shape=(n * 2, n))

@ti.func
def Complex_sqr(z):
    return ti.Vector([z[0]**2 - z[1]**2, z[1] * z[0] * 2])


@ti.func
def Complex_quadratic(z,c):
    temp = Complex_sqr(z)
    return ti.Vector([temp[0] + c[0], temp[1] + c[1]])

@ti.func
def test(c,maxi):
    temp = c
    flag = 1
    for i in range(maxi):
        if temp.norm()>2 :
            flag = 0
            break
        else:
            temp = Complex_quadratic(temp,c)

    return flag



@ti.kernel
def draw(a:ti.f32):
    for i,j in pixels:
        if test(ti.Vector([i/(n+a*10)+0.3,j/(n+a*10)-0.0005*a]),10000):
            pixels[i,j] = 0
        else:
            pixels[i,j] = 1


gui = ti.GUI("MandelbrotS Set", res=(n * 2, n))
#result_dir = "./results"
#video_manger = ti.VideoManager(output_dir=result_dir, framerate=24, automatic_build=False)

for a in range(100000):
    draw(a)
    gui.set_image(pixels)
    gui.show()

    #video_manger.write_frame(pixels.to_numpy())
    #print(f'\rFrame {a+1}/100000 is recorded', end='')


#print()
#print('Exporting .mp4 and .gif videos...')
#video_manger.make_video(gif=True, mp4=True)
#print(f'MP4 video is saved to {video_manger.get_output_filename(".mp4")}')
#print(f'GIF video is saved to {video_manger.get_output_filename(".gif")}')

但似乎导出gif或MP4会报错?

2 个赞
pixels = ti.var(dt=ti.f32, shape=(n * 2, n))

好像是这里有点问题,应该是个3维的数组。

pixels = ti.var(dt=ti.f32, shape=(n * 2, n, 3))

但是貌似f32也有点问题。(为啥会这样我还没搞清…)
video

改成u8的类型就没问题了。
video

import taichi as ti

ti.init()

n = 320
pixels = ti.var(ti.u8, shape=(n * 2, n,3))

@ti.func
def Complex_sqr(z):
    return ti.Vector([z[0]**2 - z[1]**2, z[1] * z[0] * 2])


@ti.func
def Complex_quadratic(z,c):
    temp = Complex_sqr(z)
    return ti.Vector([temp[0] + c[0], temp[1] + c[1]])

@ti.func
def test(c,maxi):
    temp = c
    flag = 1
    for i in range(maxi):
        if temp.norm()>2 :
            flag = 0
            break
        else:
            temp = Complex_quadratic(temp,c)

    return flag



@ti.kernel
def draw(a:ti.f32):
    for i,j,k in pixels:
        if test(ti.Vector([i/(n+a*10)+0.3,j/(n+a*10)-0.0005*a]),10000):
            pixels[i,j,k] = 0
        else:
            pixels[i,j,k] = 255

# gui = ti.GUI("MandelbrotS Set", res=(n * 2, n))
result_dir = "./results"
video_manger = ti.VideoManager(output_dir=result_dir, framerate=24, automatic_build=False)

for a in range(50):
    draw(a)
    # gui.set_image(pixels)
    # gui.show()
    pixels_img=pixels.to_numpy()
    video_manger.write_frame(pixels.to_numpy())
    print(f'\rFrame {a+1}/100000 is recorded', end='')

print()
print('Exporting .mp4 and .gif videos...')
video_manger.make_video(gif=True, mp4=True)
print(f'MP4 video is saved to {video_manger.get_output_filename(".mp4")}')
print(f'GIF video is saved to {video_manger.get_output_filename(".gif")}')
pixels = ti.Vector(3, dt=ti.f32, shape=(n * 2, n))

改成这样

感谢您的回复

我也有这个问题,渲染到GUI是正常的,导出到本地就是您图一的效果…

导出视频的功能在0.6.8版本上有一个bug,导致了同学你的这个问题!
该bug目前已经被修复了。我刚才在0.6.11上测试了你的代码,导出视频成功:D
请升级到0.6.11试试看~video

1 个赞

如果还有问题的话,烦请告诉我Taichi版本号、安装方法、操作系统版本,我去复现一下,谢谢!

1 个赞

您好,非常感谢您的回答,请问升级版本有什么建议方法吗?还是说只能卸载重装?

1 个赞

如果用 pip 就直接升级
python -m pip install --upgrade taichi

1 个赞

噢对对,我傻了… 谢谢

试了下 0.6.11 的 CUDA 后端有点问题,目前还是用 0.6.10 比较好
python -m pip install taichi==0.6.10

1 个赞

如强悍的@woclass 同学所说,pip安装的升级方法就是这样了!:smiley:
如果你是开发者安装的话,可以直接从上游更新代码库,然后合并到自己的本地仓库中:

git fetch upstream
git merge upstream/master
cd build
cmake .. & make -j12
...
2 个赞