--[[-- Mandulia -- Mandelbrot/Julia explorer Copyright (C) 2010 Claude Heiland-Allen This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . --]]-- require("defaults") require("transition") do --[[-- generate random views and transition between them --]]-- -- randomness math.randomseed(os.time()) -- for time-limited recording local frameLimit = 10 * 60 * 25 local frames = 0 -- magic numbers local phi = (math.sqrt(5) + 1) / 2 local phi1 = (math.sqrt(5) - 1) / 2 -- animation parameters local defaultSpeed = 0.25 local defaultWeight = 25 -- view bounds local minimum = { x = -1.5, y = -1.1, z = 1 } local maximum = { x = 0.5, y = 1.1, z = 32 } -- default view local function zero() return { x = 0, y = 0, z = minimum.z } end -- animation variables local source = zero() local target = zero() local t = 0 local s = 0 local f = function(t) return zero() end local dz = minimum.z local speed = defaultSpeed local weight = defaultWeight -- keyboard bindings local keys = { Escape = function() mandulia.quit() end , F11 = function() mandulia.fullscreen = not mandulia.fullscreen end , Home = function() source = f(t) ; target = zero() ; t = 0 s, f = transition(source, target, weight, phi) end , PageUp = function() weight = weight * 0.95 end , PageDown = function() weight = weight / 0.95 end , End = function() weight = defaultWeight end , ["["] = function() speed = speed * 0.95 end , ["]"] = function() speed = speed / 0.95 end , ["#"] = function() speed = defaultSpeed end } function mandulia.keyboard(key) if type(keys[key]) == "function" then keys[key]() end end -- every frame function mandulia.render() if mandulia.record then if frames == frameLimit then mandulia.quit() else frames = frames + 1 end end t = t + speed * (phi1 ^ dz) if t > s then -- we reached the target, new target needed t = t - s source.x = target.x source.y = target.y source.z = target.z target.x = math.random() * (maximum.x - minimum.x) + minimum.x target.y = math.random() * (maximum.y - minimum.y) + minimum.y target.z = math.random() * (maximum.z - minimum.z) + minimum.z s, f = transition(source, target, weight, phi) end mandulia.view = f(t) mandulia.view.z = math.max(mandulia.view.z, minimum.z) dz = mandulia.view.z end end