diff options
author | Philipp Gesang <pgesang@ix.urz.uni-heidelberg.de> | 2010-08-12 17:07:57 +0200 |
---|---|---|
committer | Philipp Gesang <pgesang@ix.urz.uni-heidelberg.de> | 2010-08-12 17:07:57 +0200 |
commit | 2bf2a6a88958f404171d20030feb98642aae2950 (patch) | |
tree | 2f438fba69b29cebf36840f934ffd9bcf19a60ec /mplife.cld | |
parent | 1092d5cc8e88b3fe88c9ac7678fdfd9c809935e8 (diff) | |
download | automata-backgrounds-2bf2a6a88958f404171d20030feb98642aae2950.tar.gz |
iterating over strings via lpeg
Diffstat (limited to 'mplife.cld')
-rw-r--r-- | mplife.cld | 318 |
1 files changed, 0 insertions, 318 deletions
diff --git a/mplife.cld b/mplife.cld deleted file mode 100644 index eac9bbb..0000000 --- a/mplife.cld +++ /dev/null @@ -1,318 +0,0 @@ --- --------------------------------------------------------------------------------- --- FILE: mplife.cld --- USAGE: ./mplife.cld --- DESCRIPTION: Metapost output for Conway's Game of Life --- OPTIONS: --- --- REQUIREMENTS: --- --- BUGS: --- --- NOTES: --- --- AUTHOR: Philipp Gesang (Phg), <megas.kapaneus@gmail.com> --- COMPANY: --- VERSION: 1.0 --- CREATED: 06/08/10 12:28:35 CEST --- REVISION: --- --------------------------------------------------------------------------------- --- - -require "run" - -local mplife = {} - -gol.setup = gol.setup or {} -gol.setup.current = gol.setup.current or {} - -do - local c = gol.setup.current - - --c.file = c.file or "examples/10x10_glider.gol" - c.file = c.file or "examples/gliders.gol" - --c.file = c.file or "examples/ggun.gol" - c.rule = gol.parse_rule("B3/S23") -- default Conway - c.init = gol.parse_file(c.file) - c.last = c.init -- for successive mode - - c.pensize = .1 - c.color = { r = .6, g = .6, b = .8 } - c.fade = false - c.firstframe = 1 - c.frames = 5 - c.preamble = [[ -\setupcolors[state=start] -\setupbackgrounds[state=start] -\setuppapersize[S6][S6] - -\setuppagenumbering[state=stop,location=] -]] - --c.before_frame = [[ ---\defineoverlay - --[back] - --[\bgroup ---]] - --c.after_frame = [[ ---\egroup] - ---\setupbackgrounds [paper] [background=back] ---\page ---]] - c.before_frame = [[ -\startuseMPgraphic{back} -pickup pencircle xyscaled (.25*]] .. c.pensize .. [[pt, ]] .. c.pensize .. [[pt) rotated 45; -]] - c.after_frame = [[ -currentpicture := currentpicture xysized (\the\paperwidth, \the\paperheight); -\stopuseMPgraphic -\defineoverlay[back][\useMPgraphic{back}] - -\setupbackgrounds [page] [background=back] -]] - - gol.setup.current = c -end - - - -mplife.fade = true - -mplife.format = { - - nl = "\n", space = " ", - - opar = "(", cpar = ")", - - hyphen = "-", comma = ",", - scolon = ";", path = "--", - - filldraw = "fill", -- "draw", - draw = "draw", - cycle = "cycle", - - p = function (x,y) - return string.format("(%s,%s)", x, y) - end, -} - -function mplife.runcode (mpcode) - --context.startMPcode() - context(mpcode) - --context.stopMPcode() - --context.MPdrawing(mpcode) -- comes with next beta! -end - -function mplife.p_square (from, filled, fade_level) - local f = mplife.format - - -- p1 p2 - -- from from + d.x - -- +-------+ - -- | | - -- | | - -- | | - -- | | - -- +-------+ - -- from - d.y from + d.x && - d.y - -- p4 p3 - - local d = { x = 1, y = 1, unit = "" } - local points = { - [1] = { x = from.x, y = from.y }, - [2] = { x = from.x+d.x, y = from.y }, - [3] = { x = from.x+d.x, y = from.y-d.y }, - [4] = { x = from.x, y = from.y-d.y }, - } - - - local buildsqr = function (unit) - local draw - if filled then - draw = f.filldraw - else - draw = f.draw - end - - local tmp = f.nl .. draw - tmp = tmp .. f.p( points[1].x .. unit, points[1].y .. unit ) .. f.path -- automatic type conversion to string - tmp = tmp .. f.p( points[2].x .. unit, points[2].y .. unit ) .. f.path - tmp = tmp .. f.p( points[3].x .. unit, points[3].y .. unit ) .. f.path - tmp = tmp .. f.p( points[4].x .. unit, points[4].y .. unit ) .. f.path - tmp = tmp .. f.cycle - - if filled and fade_level then - --tmp = tmp .. f.space .. "withcolor" .. f.space .. 1/fade_level .. "black" - if fade_level == 0 then - fade_level = 1 - elseif fade_level == 1 then - fade_level = 0 - else - fade_level = .05 * fade_level + .5 - end - tmp = tmp .. f.space .. "scaled 200 " .. "withcolor" .. f.space .. fade_level .. "white" - end - - tmp = tmp .. f.scolon - return tmp - end - - return buildsqr (from.unit) -end - -function mplife.draw_grid(grid) - local h = gol.helpers - local pat = "" - if type(grid) == "string" then - grid = h.split(grid, "\n") -- may leave an empty string as last item - if grid[#grid] == "" then grid[#grid] = nil end - end - - local max = {} - max.x, max.y = grid[1]:len(), #grid - - local n = 0 - local pos -- kept in broader scope for picture border estimation - while grid[#grid-n] ~= nil do - - local row = grid[#grid-n] - pos = 1 - - repeat - local opacity - local cell = row:sub(pos, pos) - local p = { x = pos-1, y = n, unit = "" } - - local fill, fade_level - fill = true - - if fill and mplife.fade then - fade_level = tonumber(cell) - end - - if not fade_level then -- no number --> cell once dead (marked "D") - fade_level = 9.3 - end - - if fade_level ~= 0 then -- don't draw dead cells - if fade_level == 1 then - opacity = .33 - pat = pat .. string.format("%s unitsquare shifted (%s,%s) withcolor transparent(1,%s,\\MPcolor{lifesquare});\n", - "draw", p.x, p.y, opacity*2) - else - opacity = (1/3) - (fade_level / 30) - end - pat = pat .. string.format("%s unitsquare scaled .9 shifted (%s+.05,%s+.05) withcolor transparent(1,%s,\\MPcolor{lifesquare});\n", - "filldraw", p.x, p.y, opacity) - end - pos = pos + 1 - until pos > row:len() - pat = pat .. "\n" - n = n + 1 - end - - pat = pat .. string.format([[ -path border; -border = (0,0)--(%s,0)--(%s,%s)--(0,%s)--cycle; -fill border withcolor transparent (1,.75, white) ; -setbounds currentpicture to boundingbox border ; -]], max.x, max.x, max.y, max.y) - ---fill border withcolor transparent (1,.3,1white) ; - --print("Pic\n", pat) - mplife.runcode(pat) - return true -end - ---- testing section - -function mplife.checker(n) - local squares = "" - local cnt = 0 - for y=1, n, 1 do - for x=1, n, 1 do - local fill - if cnt % 2 == 0 then fill = true end - local p = { x = x, y = y, unit = "" } - squares = squares .. mplife.p_square( p, fill ) - cnt = cnt + 1 - end - if n % 2 == 0 then cnt = cnt + 1 end -- needed for even column numbers - end - --print (squares) - return squares -end - -function mplife.rand_pattern(n, digits) - local pat = "" - for y=1, n, 1 do - for x=1, n, 1 do - pat = pat .. math.random(0,digits) - end - pat = pat .. "\n" - end - return pat -end - ---print(mplife.rand_pattern(10,1)) - ---- interfacing with life.lua - -function mplife.life_frame (frame) - --local c = gol.setup.current - - mplife.draw_grid(frame) - - return true -end - -function mplife.life_movie (frames, next_page) - local c = gol.setup.current - for i, frame in ipairs(frames) do - context(c.before_frame) - mplife.life_frame(frame) - context(c.after_frame) - end -end - -function mplife.life_frames () - local c = gol.setup.current - - - local frames = gol.frames( c.init, c.rule, c.frames, c.firstframe ) - mplife.life_movie( frames, false ) - return true -end - -function mplife.successive () - local c = gol.setup.current - context(c.before_frame) - mplife.draw_grid(c.last) - context(c.after_frame) - gol.setup.current.last = gol.next_frame( c.last, c.rule ) - return true -end - - - - -function mplife.main () - local c = gol.setup.current - - context.definecolor({ "lifesquare" }, c.color) - context(c.preamble) -- only once - context.starttext() - - --mplife.runcode (mplife.checker(20)) - - --mplife.draw_grid(mplife.rand_pattern(10,6)) - - --mplife.life_frames() - - for i=1,10,1 do - mplife.successive() - --context("\\input knuth") - context.page() - end - context.stoptext() - return 0 -end - - -return mplife.main() |