Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://angg.twu.net/LUA/Cabos1.lua.html
--   http://angg.twu.net/LUA/Cabos1.lua
--           (find-angg "LUA/Cabos1.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LUA/Cabos1.lua"))
-- Supersedes: (find-anggfile "LUA/CabosNaDiagonal.lua")
-- See: (find-angg "GNUPLOT/")
-- See: (find-angg "GNUPLOT/piramide-1.dem")
-- See: (find-angg "GNUPLOT/piramide-2.dem")

-- «.XyGrid»			(to "XyGrid")
-- «.XyGrid-tests»		(to "XyGrid-tests")
-- «.CabosNaDiagonal»		(to "CabosNaDiagonal")
-- «.CabosNaDiagonal-tests»	(to "CabosNaDiagonal-tests")

isint  = function (x) return math.floor(x) == x end
ishalf = function (x) return isint(x + 0.5) end

split2d = function (bigstr)
    local bigarr = VTable {}
    for i,line in ipairs(splitlines(bigstr)) do
      local sline = split(line)
      if #sline > 0 then table.insert(bigarr, HTable(sline)) end
    end
    return bigarr
  end


-- __  __      ____      _     _ 
-- \ \/ /   _ / ___|_ __(_) __| |
--  \  / | | | |  _| '__| |/ _` |
--  /  \ |_| | |_| | |  | | (_| |
-- /_/\_\__, |\____|_|  |_|\__,_|
--      |___/                    
--
-- «XyGrid»  (to ".XyGrid")
--
XyGrid = Class {
  type = "XyGrid",
  from = function (bigstr, step)
      local bigarr = split2d(bigstr)
      if step == 0.5 then
        local maxx = (#bigarr[1]-1)/2
        local maxy = (#bigarr   -1)/2
        return XyGrid {bigarr=bigarr, maxx=maxx, maxy=maxy, step=step}
      else
        local maxx = #bigarr[1]-1
        local maxy = #bigarr   -1
        return XyGrid {bigarr=bigarr, maxx=maxx, maxy=maxy, step=step}
      end
    end,
  expand0 = function (bigstr, prefix)
      return XyGrid.from(bigstr, 1):alttostring((prefix or "").."  ")
    end,
  expand = function (bigstr, prefix)
      prefix = prefix or ""
      local body = XyGrid.expand0(bigstr, prefix)
      return prefix.."= CabosNaDiagonal.from [[\n"..body.."\n"..prefix.."]]"
    end,
  expandg = function (bigstr)
      return XyGrid.expand(bigstr, "#: ")
    end,
  __tostring = function (gr)
      return gr:tostring()
    end,
  __index = {
    xtocol = function (gr, x) return          1 + x/gr.step end,
    ytorow = function (gr, y) return #gr.bigarr - y/gr.step end,
    get  = function (gr, x, y) return gr.bigarr[gr:ytorow(y)][gr:xtocol(x)] end,
    z  = function (gr, x, y) return tonumber(gr:get(x,y)) end,
    xs = function (gr, step) return HTable(seq(0, gr.maxx,   step or gr.step)) end,
    ys = function (gr, step) return VTable(seq(gr.maxy, 0, -(step or gr.step))) end,
    zs = function (c) 
        local ytozs = function (y)
            return HTable(map(function (x) return c:z(x,y) end, c:xs(1)))
          end
        return VTable(map(ytozs, c:ys(1)))
      end,
    maxz = function (c)
        local arrmax = function (arr) return foldl1(max, arr) end
        return arrmax(map(arrmax, c:zs()))
      end,
    --
    ytostring = function (gr, y, step)
        local xtostr = function (x) return gr:get(x,y) end
        return mapconcat(xtostr, gr:xs(step), " ")
      end,
    tostring = function (gr, step)
        local ytos = function (y) return gr:ytostring(y, step) end
        return mapconcat(ytos, gr:ys(step), "\n")
      end,
    --
    altget = function (gr, x, y)
        if isint(x)  and isint (y) then return gr:get(x,y) end
        if isint(x)  and ishalf(y) then return "|" end
        if ishalf(x) and isint(y)  then return "-" end
        local nw,ne = gr:z(x-0.5, y+0.5), gr:z(x+0.5, y+0.5)
        local sw,se = gr:z(x-0.5, y-0.5), gr:z(x+0.5, y-0.5)
        if ne-nw == se-sw then return "." else return "?" end
      end,
    alttostring = function (gr, prefix)
        local xs,ys = gr:xs(0.5), gr:ys(0.5)
        local altytostring = function (y)
            return (prefix or "")
                .. mapconcat(function (x) return gr:altget(x, y) end, xs, " ")
          end
        return mapconcat(altytostring, ys, "\n")
      end,
  },
}

-- «XyGrid-tests»  (to ".XyGrid-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Cabos1.lua"
bigstr = [[
  10 - 11 - 12
  |  . |  \  |
  13 - 14 - 16
]]
= split2d(bigstr)
gr = XyGrid.from(bigstr, 0.5)
= gr:xs()
= gr:ys()
= gr:get(0,0)
= gr:get(1,0)
= gr:zs()
= gr:maxz()
= gr:tostring()
= gr:tostring(1)
= gr
= gr:alttostring()

= XyGrid.expand [[
  0 1 2
  3 4 6
]]
= XyGrid.expandg [[
  0 1 2
  3 4 6
]]

--]==]


--   ____      _                           
--  / ___|__ _| |__   ___  ___             
-- | |   / _` | '_ \ / _ \/ __|            
-- | |__| (_| | |_) | (_) \__ \  _   _   _ 
--  \____\__,_|_.__/ \___/|___/ (_) (_) (_)
--                                         
-- «CabosNaDiagonal»  (to ".CabosNaDiagonal")
--
CabosNaDiagonal = Class {
  type = "CabosNaDiagonal",
  from = function (bigstr)
      local xygrid = XyGrid.from(bigstr, 0.5)
      return CabosNaDiagonal { bigstr=bigstr, xygrid=xygrid }
    end,
  __tostring = function (c) return c:gnuplotbody() end,
  __index = {
    maxx = function (c) return c.xygrid.maxx end,
    maxy = function (c) return c.xygrid.maxy end,
    maxz = function (c) return c.xygrid:maxz() end,
    get = function (c, x, y) return c.xygrid:get(x, y) end,
    z = function (c, x, y)
        return c.xygrid:z(x, y)
      end,
    xyz = function (c, x, y)
        return format("%s,%s,%s", x, y, c:z(x, y))
      end,
    vertices = function (c, x, y)
        local nw, ne = c:xyz(x, y+1), c:xyz(x+1, y+1)
        local sw, se = c:xyz(x, y),   c:xyz(x+1, y) 
        middle = c:get(x+0.5, y+0.5)
        return nw, ne, sw, se, middle
      end,
    square = function (c, nw, ne, sw, se)
        return format("%s to %s to %s to %s to %s", sw, se, ne, nw, sw)
      end,
    triangles = function (c, nw, ne, sw, se, middle)
        if middle == "/" then
          return format("%s to %s to %s to %s", sw, ne, nw, sw),
                 format("%s to %s to %s to %s", sw, se, ne, sw)
        elseif middle == "\\" then
          return format("%s to %s to %s to %s", sw, se, nw, sw),
                 format("%s to %s to %s to %s", se, ne, nw, se)
        else PP("bad middle", middle); error()
        end
      end,
    --
    sots0 = function (c, x, y)
        local nw, ne, sw, se, middle = c:vertices(x, y)
        if middle == "."
        then return c:square(nw, ne, sw, se)
        else return c:triangles(nw, ne, sw, se, middle)
        end
      end, 
    sots1 = function (c)
        local sots = {}
        for y=c:maxy()-1,0,-1 do
          for x=0,c:maxx()-1 do
	    local o1,o2 = c:sots0(x, y)
            table.insert(sots, o1)
            table.insert(sots, o2)
          end
        end
        return sots
      end,
    sots2 = function (c)
        local sots = c:sots1()
        local f = function (n)
            return format("set obj %d polygon from %s", n, sots[n])
          end
        local bigstr = mapconcat(f, seq(1, #sots), "\n")
        return bigstr..format("\n\nn = %d", #sots)
      end,
    sots3 = function (c)
        local maxx,maxy,maxz = c:maxx(),c:maxy(),c:maxz()
        local fmt = "set xrange [0:%d]; set yrange [0:%d]; set zrange [0:%d]"
        return c:sots2().."\n"..format(fmt, maxx, maxy, maxz)
      end,
    gnuplotbody = function (c)
        return c:sots3()
      end,
  },
}


-- «CabosNaDiagonal-tests»  (to ".CabosNaDiagonal-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Cabos1.lua"
c = CabosNaDiagonal.from [[
  10 - 11 - 12
  |  . |  \  |
  13 - 14 - 15
]]
= c:z(0,0)
= c:z(1,0)
= c:z(1,1)
= c:sots0(0,0)
= c:sots0(1,0)
= c:sots2()
= c:sots3()
= c:gnuplotbody()

--]==]




-- Local Variables:
-- coding:  utf-8-unix
-- End: