Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LUA/Cabos3.lua.html
--   http://anggtwu.net/LUA/Cabos3.lua
--          (find-angg "LUA/Cabos3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e  () (interactive) (find-angg "LUA/Cabos3.lua"))
-- (defun c1 () (interactive) (find-angg "LUA/Cabos1.lua"))
-- (defun c2 () (interactive) (find-angg "LUA/Cabos2.lua"))
-- (defun p1 () (interactive) (find-angg "GNUPLOT/2022-2-C3-P1.dem"))
-- (defun sg () (interactive) (find-angg "LUA/StrGrid1.lua"))
-- See: (find-angg "LUA/Cabos1.lua" "CabosNaDiagonal")
--      (find-angg "LUA/Cabos1.lua" "XyGrid" "expandg =")
--      (find-angg "LUA/Cabos1.lua" "XyGrid" "altget =")
--      (find-angg "GNUPLOT/2023-2-C3-P1.dem")

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

require "StrGrid1"   -- (find-angg "LUA/StrGrid1.lua")

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



--  _____                            _ 
-- | ____|_  ___ __   __ _ _ __   __| |
-- |  _| \ \/ / '_ \ / _` | '_ \ / _` |
-- | |___ >  <| |_) | (_| | | | | (_| |
-- |_____/_/\_\ .__/ \__,_|_| |_|\__,_|
--            |_|                      
--
-- «Expand»  (to ".Expand")

Expand = Class {
  type = "Expand",
  from = function (bigstr)
      local strgrid = StrGrid.from(bigstr, 0, 0, 1)
      return Expand { bigstr=bigstr, strgrid=strgrid }
    end,
  __index = {
    get = function (ex, x, y) return ex.strgrid:get(x,y) end,
    z   = function (ex, x, y) return tonumber(ex:get(x,y)) end,
    xs  = function (ex, step) return HTable(seq(0, ex.strgrid.xmax, step)) end,
    ys  = function (ex, step) return VTable(seq(ex.strgrid.ymax, 0, -step)) end,
    zs  = function (ex) 
        local ytozs = function (y)
            return HTable(map(function (x) return ex:z(x,y) end, ex:xs(1)))
          end
        return VTable(map(ytozs, ex:ys(1)))
      end,
    --
    -- Based on: (find-angg "LUA/Cabos1.lua" "XyGrid" "altget =")
    altget = function (ex, x, y)
        if isint(x)  and isint (y) then return ex: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 = ex:z(x-0.5, y+0.5), ex:z(x+0.5, y+0.5)
        local sw,se = ex:z(x-0.5, y-0.5), ex:z(x+0.5, y-0.5)
        if ne-nw == se-sw then return "." else return "?" end
      end,
    alttostring = function (ex, prefix)
        local xs,ys = ex:xs(0.5), ex:ys(0.5)
        local altytostring = function (y)
            return (prefix or "")
                .. mapconcat(function (x) return ex:altget(x, y) end, xs, " ")
          end
        return mapconcat(altytostring, ys, "\n")
      end,
    --
    -- Based on: (find-angg "LUA/Cabos1.lua" "XyGrid" "expandg =")
    expand0 = function (ex, prefix)
        return ex:alttostring((prefix or "").."  ")
      end,
    expand = function (ex, prefix)
        prefix = prefix or ""
        local body = ex:expand0(prefix)
        return prefix.."= CabosNaDiagonal.from [[\n"..body.."\n"..prefix.."]]"
      end,
    expandg = function (ex, prefix)
        return ex:expand(prefix or "#: ")
      end,
  },
}

-- «Expand-tests»  (to ".Expand-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Cabos3.lua"
bigstr = [[
  6 6 6 6 4 2 0 0 0 0
  6 6 6 6 4 2 0 0 0 0
  6 6 6 6 4 2 0 0 0 0
  5 5 5 5 4 2 0 0 0 0
  4 4 4 4 3 2 0 0 0 0
  3 3 3 3 2 1 0 0 0 0
  2 2 2 2 1 0 0 0 0 0
  1 1 1 1 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0
  0 0 0 0 0 0 0 0 0 0
]]
ex = Expand.from(bigstr)
= ex
= ex:zs()
= ex:expand0()
= ex:expandg()
= ex:expandg("")

--]==]







--   ____      _                           
--  / ___|__ _| |__   ___  ___             
-- | |   / _` | '_ \ / _ \/ __|            
-- | |__| (_| | |_) | (_) \__ \  _   _   _ 
--  \____\__,_|_.__/ \___/|___/ (_) (_) (_)
--                                         
-- Based on: (find-angg "LUA/Cabos1.lua" "CabosNaDiagonal")
-- «CabosNaDiagonal»  (to ".CabosNaDiagonal")
--
CabosNaDiagonal = Class {
  type = "CabosNaDiagonal",
  from = function (bigstr)
      -- local xygrid = XyGrid.from(bigstr, 0.5)
      local strgrid = StrGrid.from(bigstr, 0, 0, 2)
      return CabosNaDiagonal { bigstr=bigstr, strgrid=strgrid }
    end,
  __tostring = function (c) return c:gnuplotbody() end,
  __index = {
    xmin = function (c) return c.strgrid.xmin end,
    ymin = function (c) return c.strgrid.ymin end,
    xmax = function (c) return c.strgrid.xmax end,
    ymax = function (c) return c.strgrid.ymax end,
    get  = function (c, x, y) return c.strgrid:get(x, y) end,
    z    = function (c, x, y) return tonumber(c:get(x,y)) end,
    --
    -- Generate gnuplot code
    zmax = function (c, x, y)
        local mz = 0
        for y=c:ymax(),c:ymin(),-1 do
          for x=c:xmin(),c:xmax() do
            mz = max(mz, c:z(x,y))
          end
        end
        return mz
      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 = VTable {}
        for y=c:ymax()-1,0,-1 do
          for x=0,c:xmax()-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 xmax,ymax,zmax = c:xmax(),c:ymax(),c:zmax()
        local fmt = "set xrange [0:%d]; set yrange [0:%d]; set zrange [0:%d]"
        return c:sots2().."\n"..format(fmt, xmax, ymax, zmax)
      end,
    gnuplotbody = function (c)
        return c:sots3()
      end,
  },
}


-- «CabosNaDiagonal-tests»  (to ".CabosNaDiagonal-tests")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Cabos3.lua"
  run_repl3_now()
  ptb = nil

bigstr2 = [[
  10 - 11 - 12
  |  . |  \  |
  13 - 14 - 15
]]
c = CabosNaDiagonal.from(bigstr2)
= c.strgrid:get(0,0)
= c.strgrid:get(0,1)
= c:get(0,0)
= c:ymin()
= c:zmax()
=             c:vertices(0,0)
= c:square   (c:vertices(0,0))
=             c:vertices(1,0)
= c:triangles(c:vertices(1,0))
= c:sots0(0,0)
= c:sots0(1,0)
= c:sots1()
= c:sots2()
= c:sots3()
= c:gnuplotbody()

c = CabosNaDiagonal.from [[
  6 - 6 - 6 - 6 - 4 - 2 - 0 - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  6 - 6 - 6 - 6 - 4 - 2 - 0 - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  6 - 6 - 6 - 6 - 4 - 2 - 0 - 0 - 0 - 0
  | . | . | . | \ | . | . | . | . | . |
  5 - 5 - 5 - 5 - 4 - 2 - 0 - 0 - 0 - 0
  | . | . | . | . | \ | . | . | . | . |
  4 - 4 - 4 - 4 - 3 - 2 - 0 - 0 - 0 - 0
  | . | . | . | . | . | \ | . | . | . |
  3 - 3 - 3 - 3 - 2 - 1 - 0 - 0 - 0 - 0
  | . | . | . | . | . | / | . | . | . |
  2 - 2 - 2 - 2 - 1 - 0 - 0 - 0 - 0 - 0
  | . | . | . | . | / | . | . | . | . |
  1 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0
  | . | . | . | / | . | . | . | . | . |
  0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0
]]
= c

clabels = CabosNaDiagonal.from [[
  6 - 6 - 6 - A - 4 - 2 - B - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  6 - 6 - 6 - 6 - 4 - 2 - 0 - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  C - 6 - 6 - D - 4 - 2 - 0 - 0 - 0 - 0
  | . | . | . | \ | . | . | . | . | . |
  5 - 5 - 5 - 5 - 4 - 2 - 0 - 0 - 0 - 0
  | . | . | . | . | \ | . | . | . | . |
  4 - 4 - 4 - 4 - 3 - 2 - 0 - 0 - 0 - 0
  | . | . | . | . | . | \ | . | . | . |
  3 - 3 - 3 - 3 - 2 - 1 - E - 0 - 0 - 0
  | . | . | . | . | . | / | . | . | . |
  2 - 2 - 2 - 2 - 1 - 0 - 0 - 0 - 0 - 0
  | . | . | . | . | / | . | . | . | . |
  1 - 1 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0
  | . | . | . | / | . | . | . | . | . |
  F - 0 - 0 - G - 0 - 0 - 0 - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0
  | . | . | . | . | . | . | . | . | . |
  0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0
]]
  lbls = clabels.strgrid:labels()
= lbls
= lbls:subst("A--B--C B--E--G--F D--E")

--]==]







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