60 lines
1.2 KiB
Lua
60 lines
1.2 KiB
Lua
-- mandelbrot by rnd,2022 , made in 30 mins
|
|
if not init then init = true
|
|
|
|
n=100
|
|
local itermin = 10; -- check quicker if diverge!
|
|
local itermax = 250; -- max iterations
|
|
local delta = 0.00001^2; -- convergence difference
|
|
|
|
nodes = {
|
|
"white","yellow","orange","red",
|
|
"magenta","purple","blue","cyan",
|
|
"green","dark_green","brown","tan",
|
|
"light_grey","medium_grey","dark_grey","black"
|
|
}
|
|
for i = 1,#nodes do nodes[i] = "basic_robot:button"..nodes[i] end
|
|
|
|
get_pixel = function()
|
|
local iter = 0
|
|
local zr=0 ; local zi=0 ;
|
|
for i = 1, itermin do
|
|
local zrn=zr^2-zi^2+cr;
|
|
local zin=2*zr*zi+ci
|
|
zr=zrn
|
|
zi=zin
|
|
end
|
|
if zr^2+zi^2>1 then return -1 end
|
|
|
|
local zrn=zr^2-zi^2+cr;
|
|
local zin=2*zr*zi+ci
|
|
if (zrn-zr)^2+(zin-zi)^2< delta then return 1 end
|
|
|
|
for i = 1, itermax do
|
|
local zrn=zr^2-zi^2+cr;
|
|
local zin=2*zr*zi+ci
|
|
if (zrn-zr)^2+(zin-zi)^2< delta then return i-1 end
|
|
zr=zrn
|
|
zi=zin
|
|
end
|
|
return itermax-1
|
|
end
|
|
|
|
pos = self.pos()
|
|
local nnodes = #nodes
|
|
for x=1,n do
|
|
for y=1,n do
|
|
cr=2*x/n-1; ci=2*y/n-1
|
|
local col = get_pixel()
|
|
if col>0 then
|
|
col = math.floor(nnodes*col/itermax)
|
|
minetest.swap_node({x=pos.x+x,y=pos.y,z=pos.z+y},{name = nodes[col+1]})
|
|
end
|
|
end
|
|
end
|
|
|
|
self.remove()
|
|
|
|
end
|
|
|
|
|