-
Notifications
You must be signed in to change notification settings - Fork 30
Expand file tree
/
Copy pathjulia_zoom.py
More file actions
54 lines (43 loc) · 1.28 KB
/
julia_zoom.py
File metadata and controls
54 lines (43 loc) · 1.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import taichi as ti
from taichi.math import cmul, dot, log2, vec2, vec3
ti.init(arch=ti.gpu)
MAXITERS = 100
width, height = 800, 640
pixels = ti.Vector.field(3, ti.f32, shape=(width, height))
@ti.func
def setcolor(z, i):
v = log2(i + 1 - log2(log2(z.norm()))) / 5
col = vec3(0.)
if v < 1.0:
col = vec3(v**4, v**2.5, v)
else:
v = ti.max(0., 2 - v)
col = vec3(v, v**1.5, v**3)
return col
@ti.kernel
def render(time: ti.f32):
zoo = 0.64 + 0.36 * ti.cos(0.02 * time)
zoo = ti.pow(zoo, 8.0)
ca = ti.cos(0.15 * (1.0 - zoo) * time)
sa = ti.sin(0.15 * (1.0 - zoo) * time)
c = vec2(0.8 * ti.cos(0.1 * time), 0.8 * ti.sin(0.1 * time))
for i, j in pixels:
z = 2.0 * vec2(i, j) / height - vec2(1)
xy = vec2(z.x * ca - z.y * sa, z.x * sa + z.y * ca)
z = xy * zoo
count = 0.
while count < MAXITERS and dot(z, z) < 50:
z = cmul(z, z) + c
count += 1.
if count == MAXITERS:
pixels[i, j] = [0, 0, 0]
else:
pixels[i, j] = setcolor(z, count)
def main():
gui = ti.GUI("Julia set zoom", res=(width, height))
for i in range(100000):
render(i * 0.1)
gui.set_image(pixels)
gui.show()
if __name__ == '__main__':
main()