Homework 0: Fractal demo热爱者

感谢胡老师提供的taichi编程语言,fractal的demo让我很有兴趣去做点小修改。

先简单解释下fractal demo中的图像含义。它是 z_{t+1} = z_t^n + c 中z的收敛范围,其中z和c都是复数。
例如 z_{t+1} = z_t^2 - 0.8


假如 z_0 = 0z_1 = -0.8z_2 = -0.16, z_3 = -0.7744, 由此可见,z = 0 会收敛,因此会显示在图中。

对demo做了简单的修改使得它可以用任意整数做z的幂。

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_power(z, power: ti.i32):
    r = ti.sqrt(z[0]**2 + z[1]**2)
    theta = ti.atan2(z[1], z[0])
    return ti.Vector([r**power * ti.cos(power*theta), r**power * ti.sin(power*theta)])

@ti.kernel
def paint(t: ti.f32, power: ti.i32):
    for i, j in pixels:  # Parallized over all pixels
        freq = 1.0 / power
        c = ti.Vector([0.7885 * ti.cos(freq*t), 0.7885 * ti.sin(freq*t)])
        z = ti.Vector([i / n - 1, j / n - 0.5]) * 2

        iterations = 0
        while z.norm() < 20 and iterations < 50:
            z = complex_power(z, power) + c
            iterations += 1
        pixels[i, j] = 1 - iterations * 0.02

power = eval(input("Power of z -> "))
gui = ti.GUI("Julia Set", res=(n * 2, n))

for i in range(1000000):
    paint(i * 0.03, power)
    gui.set_image(pixels)
    gui.show()

比如当 n = 3 的时候:

n = 5 的时候:

由于c的实数部分也写成了关于t的函数,所以会出现式子不收敛的情况,对应的就是没有黑色pixel的情况。同样也会有一些奇怪的图形产生:

大家也可以随意对c进行修改,会有不一样的效果 :grin:

再次感谢胡老师带来的欢乐。重新回到了小学二年级 :grin:

关于fractal以及一些拓展,可以看看 这个方程会改变你的世界观_哔哩哔哩_bilibili

2 个赞

原谅我不懂怎么在这个帖子里输入数学表达式,将就一下吧 :joy:

顺便一提,能否根据鼠标位置来控制c的数值?你可以使用gui.get_cursor_pos()获取当前鼠标指针坐标(区间0到1)。

2 个赞

可以让管理员给论坛装个插件

1 个赞

好主意,循环里换

re, im = gui.get_cursor_pos()
paint(i * 0.03, power, re, im)

然后paint kernel换

paint(t: ti.f32, power: ti.i32, re: ti.f32, im: ti.f32):

c = ti.Vector([0.7885 * ti.cos(freq*t)*re, 0.7885 * ti.sin(freq*t)*im])

可行。

但是应该还是需要对get_cursor_pos进行一次normalisation(我不确定)

3 个赞

我这里也有一些有趣的尝试,分享一下
c = 0.8i
JuliaSet

3 个赞

c = -0.4+0.6i
JuliaSet2

3 个赞

c=-0.7269+0.1889i
JuliaSet4

1 个赞


power=-3的某个值

5 个赞