Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--     http://angg.twu.net/LUA/Pict2e1-1.lua.html
--     http://angg.twu.net/LUA/Pict2e1-1.lua
--             (find-angg "LUA/Pict2e1-1.lua")
--    See: http://angg.twu.net/pict2e-lua.html
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2022apr21
--
-- Tests for Pict2e1.lua that use functions that don't need to be in
-- the core.
--
-- (defun a  () (interactive) (find-angg "LUA/Pict2e1.lua"))
-- (defun b  () (interactive) (find-angg "LUA/Pict2e1-1.lua"))
-- (defun ab () (interactive) (find-2b '(a) '(b)))
-- (defun et () (interactive) (find-angg "LATEX/2022pict2e.tex"))
-- (defun eb () (interactive) (find-angg "LATEX/2022pict2e-body.tex"))
-- (defun ao () (interactive) (find-angg "LATEX/2022pict2e.lua"))
-- (defun v  () (interactive) (find-pdftools-page "~/LATEX/2022pict2e.pdf"))
-- (defun tb () (interactive) (find-ebuffer (eepitch-target-buffer)))
-- (defun etv () (interactive) (find-wset "13o2_o_o" '(tb) '(v)))
-- (setenv "PICT2ELUADIR" "~/LATEX/")
--
-- (code-c-d "pict2elua" "/tmp/pict2e-lua/" :anchor)
-- (defun a  () (interactive) (find-pict2elua "Pict2e1.lua"))
-- (defun b  () (interactive) (find-pict2elua "Pict2e1-1.lua"))
-- (defun ab () (interactive) (find-2b '(a) '(b)))
-- (defun et () (interactive) (find-pict2elua "2022pict2e.tex"))
-- (defun eb () (interactive) (find-pict2elua "2022pict2e-body.tex"))
-- (defun v  () (interactive) (find-pdftools-page "/tmp/pict2e-lua/2022pict2e.pdf"))
-- (defun tb () (interactive) (find-ebuffer (eepitch-target-buffer)))
-- (defun etv () (interactive) (find-wset "13o2_o_o" '(tb) '(v)))
-- (setenv "PICT2ELUADIR" "/tmp/pict2e-lua/")
--
-- Superseded by:
--   (find-angg "LUA/Tracinhos1.lua")

-- «.Plot2D»			(to "Plot2D")
-- «.Plot2D-test1»		(to "Plot2D-test1")
-- «.Plot2D-test2»		(to "Plot2D-test2")
-- «.Node»			(to "Node")
-- «.Nodes»			(to "Nodes")
-- «.Nodes-test1»		(to "Nodes-test1")
-- «.Nodes-test2»		(to "Nodes-test2")
-- «.Nodes-test3»		(to "Nodes-test3")
-- «.Nodes-test4»		(to "Nodes-test4")
-- «.Nodes-test5»		(to "Nodes-test5")
-- «.Nodes-test6»		(to "Nodes-test6")
-- «.Nodes-test6-pdf»		(to "Nodes-test6-pdf")
-- «.Numerozinhos»		(to "Numerozinhos")
-- «.Numerozinhos-test1»	(to "Numerozinhos-test1")
-- «.Numerozinhos-test2»	(to "Numerozinhos-test2")
-- «.Numerozinhos-test3»	(to "Numerozinhos-test3")
-- «.Numerozinhos-test4»	(to "Numerozinhos-test4")
-- «.Numerozinhos-test5»	(to "Numerozinhos-test5")
-- «.Numerozinhos-test6»	(to "Numerozinhos-test6")
-- «.Tracinhos»			(to "Tracinhos")
-- «.Tracinhos-test»		(to "Tracinhos-test")
-- «.FromYs»			(to "FromYs")
-- «.FromYs-tests»		(to "FromYs-tests")

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

pi, sin, cos = math.pi, math.sin, math.cos

-- seqn = function (a, b, n)
--     local f = function (k) return a + (b-a)*(k/n) end
--     return map(f, seq(0, n))
--   end




--  ____  _       _   ____  ____  
-- |  _ \| | ___ | |_|___ \|  _ \ 
-- | |_) | |/ _ \| __| __) | | | |
-- |  __/| | (_) | |_ / __/| |_| |
-- |_|   |_|\___/ \__|_____|____/ 
--                                
-- «Plot2D»  (to ".Plot2D")

Plot2D = Class {
  type  = "Plot2D",
  new   = function (tbl)
      if type(tbl.P)  == "string" then tbl.P  = Code.ve(tbl.P)  end
      if type(tbl.Pt) == "string" then tbl.Pt = Code.ve(tbl.Pt) end
      if tbl.ts then tbl.ts = HTable(tbl.ts) end
      return Plot2D(tbl)
    end,
  from  = function (P, ts)
      return Plot2D.new({P=P, ts=ts})
    end,
  __tostring = function (p) return p:tostring() end,
  __index = {
    tostring = function (p)
        return pformat("P:  %s\nPt: %s\nts: %s", p.P, p.Pt, p:tstostring())
      end,
    tstostring = function (p)
        if not p.ts then return "nil" end
        local f = function (t) return pformat("%s", t) end
        local pts = "{"..mapconcat(f, p.ts, ", ").."}"
        return pts
      end,
    topts = function (p)
        return myunpack(map(p.P, p.ts))
      end,
    toline = function (p)
        return Pict2e.line(p:topts())
      end,
    tovector = function (p, t)
        return Pict2eVector.fromwalk(p.P(t), p.Pt(t))
      end,
    tovectors = function (p, ts)
        local f = function (t) return p:tovector(t) end
        return PictList(map(f, ts))
      end,
  },
}

-- «Plot2D-test1»  (to ".Plot2D-test1")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
= Plot2D.from("x =>     sin(x) ")
= Plot2D.from("x =>     sin(x) ", seq(0, pi, pi/4))
= Plot2D.from("x =>     sin(x) ", seq(0, pi, pi/4)).ts
= Plot2D.from("x =>     sin(x) ", seq(0, pi, pi/4)):tstostring()
= Plot2D.from("x =>     sin(x) ", seq(0, pi, pi/4))
= Plot2D.from("x =>     sin(x) ", seq(0, pi, pi/4)):topts()
= Plot2D.from("x => v(x,sin(x))", seq(0, pi, pi/4)):topts()
= Plot2D.from("x => v(x,sin(x))", seq(0, pi, pi/4)):toline()
= Plot2D.from("x => v(x,sin(x))", seqn(0, pi,   4)):toline():Color("Red")

xs = seqn(0, 2*pi, 128)
fx = function (expr) return "x => v(x,"..expr..")" end
plotf = function (expr) return Plot2D.from(fx(expr), xs):toline() end
= plotf("sin(x)")

Pict2e.bounds = PictBounds.new(v(0,-1), v(7,1))
Show.preamble = [[ \unitlength=35pt ]]
PradClass.__index.bshow0 = function (p)
    return p:pgat("pgat"):d():tostringp()
  end

r = PictList {
    plotf("sin(x)")  :Color("Red"),
    plotf("sin(2*x)"):Color("Orange"),
    plotf("sin(3*x)"):Color("Green"),
    plotf("sin(4*x)"):Color("Violet"),
  }:prethickness("2pt")
= r
= r:bshow()
* (etv)

--]==]



-- «Plot2D-test2»  (to ".Plot2D-test2")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
PradClass.__index.bshow0 = function (p)
    return p:pgat("pgat"):d():tostringp()
  end
Pict2e.bounds = PictBounds.new(v(-3,-3), v(3,3))
Show.preamble = [[
  \unitlength=25pt
]]

_P  = function (t) return v(   cos(t),       sin(t)) end
_Pt = function (t) return v(  -sin(t),       cos(t)) end
_Q  = function (t) return v(   cos(4*t)/2,   sin(4*t)/2) end
_Qt = function (t) return v(-2*sin(4*t),   2*cos(4*t)  ) end
_R  = function (t) return _P(t)+_Q(t) end
_Rt = function (t) return _Pt(t)+_Qt(t) end

ts   = seqn(0, 2*pi, 64)
r = Plot2D.new {
      P  = "t => _R (t)",
      Pt = "t => _Rt(t)",
      ts = ts
  }

ts_v = seqn(0, 2*pi, 6)
= r:tovectors(ts_v)

p = PictList {
      r:toline():Color("Orange"),
      r:tovectors(ts_v):Color("Red")
    }:prethickness("2pt")
= p
= p:bshow()
* (etv)

--]==]





-- «Node»  (to ".Node")
--
Node = Class {
  type  = "Node",
  from  = function (x, y, tag, linkto, tex)
      return Node {x=x, y=y, tag=tag, linkto=linkto, tex=tex}
    end,
  __tostring = function (nd) return mytostringpv(nd) end,
  __index = {
    xy = function (nd) return v(nd.x, nd.y) end,
    totex = function (nd)
        return pformat("\\putnode%s{%s}", nd:xy(), nd.tex or nd.tag)
      end,
  },
}

-- «Nodes»  (to ".Nodes")
--
Nodes = Class {
  type  = "Nodes",
  new   = function () return Nodes {_={}} end,
  snode = function (xy)
      return pformat("\\put%s{\\snode}", xy)
    end,
  __tostring = function (nds)
      return mapconcat(mytostringp, nds._, "\n")
    end,
  __index = {
    add0 = function (nds, x, y, tag, tex, linkto)
        local n = #(nds._)+1
        local node = Node {x=x, y=y, n=n, tag=tag, tex=tex, linkto=linkto}
        nds._[n]   = node
        nds._[tag] = node
        return nds
      end,
    --
    addnode = function(nds, y, xtaglinkto)
        local x,tag,linkto = xtaglinkto:match("^(.-):(.-):(.-)$")
        x = x+0
        if linkto == "" then linkto = nil end
        nds:add0(x, y, tag, nil, linkto)
      end,
    addnodes = function(nds, y, line)
        for _,xtaglinkto in ipairs(split(line)) do
          nds:addnode(y, xtaglinkto)
        end
      end,
    addtex = function(nds, tag, tex)
        local node = nds._[tag]
        if node then node.tex = tex end
      end,
    addtexs = function (nds, bigstr)
        local A = split(bigstr)
        for i=1,#A,2 do nds:addtex(A[i], A[i+1]) end
      end,
    --
    nodestotex = function (nds)
        local f = function (nd) return nd:totex() end
        return PictList(map(f, nds._))
      end,
    linkstotex = function (nds)
        local p = PictList {}
        for i,nd1 in ipairs(nds._) do
          if nd1.linkto then
            local nd2 = nds._[nd1.linkto]
            if not nd2 then error(format("Bad linkto: %s -> %s", nd1.tag, nd1.linkto)) end
            p:addline(nd1:xy(), nd2:xy())
          end
        end
        return p
      end,
    totex = function (nds)
        return PictList {nds:linkstotex(), nds:nodestotex(), nds:snodestotex()}
      end,
    --
    midpoint = function (nds, tag1, tag2)
        return (nds._[tag1]:xy() + nds._[tag2]:xy()) * 0.5
      end,
    midabove = function (nds, tag1)
        local tag2 = nds._[tag1].linkto
        return nds:midpoint(tag1, tag2)
      end,
    snodes = function (nds, tags)
        tags = split(tags)
        local f = function (tag) return Nodes.snode(nds:midabove(tag)) end    
        return PictList(map(f, tags))
      end,
    withsnodetags = function (nds, snodetags)
        local nds2 = copy(nds)
        nds2.snodetags = snodetags
        return nds2
      end,
    snodestotex = function (nds)
        return nds:snodes(nds.snodetags or "")
      end,
    totexwithsnodes = function (nds, tags)
        return PictList { nds:totex(), nds:snodes(tags) }
      end,
    --
    show0 = function (nds, pgat, scale)
        return nds:totex():pgat(pgat):scalebox(scale):d()
      end,
    show = function (nds, ...)
        return Show.try(nds:show0(...):tostringp())
      end,
  },
}






-- «Nodes-test1»  (to ".Nodes-test1")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
nds = Nodes.new()
nds:add0(0, 0, "a", nil, "+")
nds:add0(1, 1, "+", nil, nil)
nds:add0(2, 0, "b", nil, "+")
= nds
PPP(nds)
= nds:nodestotex()
= nds:linkstotex()

= nds._[1]
= nds._[1]:totex()
= nds:totex()

--]]


-- «Nodes-test2»  (to ".Nodes-test2")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"

Show.preamble = [[
  \unitlength=25pt
  \def\Sone{[\mathrm{S1}]}
  \def\Stwo{[\mathrm{S2}]}
]]

Pict2e.bounds = PictBounds.new(v(-1,-1), v(4,4))

p = PictList {
  [[ \Line(0,0)(3,3) ]],
  [[ \Line(2,2)(3,1) ]],
  [[ \putnode(0,0){a} ]],
  [[ \putnode(1,1){\Stwo} ]],
  [[ \putnode(2,2){+} ]],
  [[ \putnode(3,3){\Stwo} ]],
  [[ \putnode(3,1){b} ]],
}
= p:bshow()
* (etv)
= p:bshow("p")
* (etv)

nds = Nodes.new()
nds:add0(0, 0, "a", nil, "+")
nds:add0(1, 1, "+", nil, nil)
nds:add0(2, 0, "b", nil, "+")
= nds
= nds:totex()
= nds:totex():bshow()
* (etv)

Pict2e.bounds = PictBounds.new(v(0,0), v(2,1), 0.5)

Show.preamble = [[
  \unitlength=35pt
  \def\nodesize{0.7}
]]
= nds:totex():bshow()
* (etv)

--]==]



-- «Nodes-test3»  (to ".Nodes-test3")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
Pict2e.bounds = PictBounds.new(v(-1,0), v(10,4), 0.5)

Show.preamble = [[
  \unitlength=35pt
  \def\nodesize{0.9}
]]

PradClass.__index.bshow0 = function (p, str, scale)
    return p:pgat(str or "pgat"):d():scalebox(scale):tostringp()
  end

nds = Nodes.new()
nds:add0(-1,2, "x0", "x",               "dd")
nds:add0(0, 3, "dd", [[\frac{d}{d\_}]], "=")
nds:add0(1, 2, "f",  [[f(\_)]],         "dd")
nds:add0(2, 1, "g1", [[g(\_)]],         "f")
nds:add0(3, 0, "x1", "x",               "g1")
nds:add0(4, 4, "=",  nil,               nil)
nds:add0(8, 3, "*",  "·",               "=")
nds:add0(5, 2, "f'", [[f'(\_)]],        "*")
nds:add0(6, 1, "g2", [[g(\_)]],         "f'")
nds:add0(7, 0, "x2", "x",               "g2")
nds:add0(9, 2, "g'", [[g'(\_)]],        "*")
nds:add0(10,1, "x3", "x",               "g'")
= nds
= nds:totex()
= nds:totex():bshow(nil, "0.7")
* (etv)
= nds:totex():bshow("p", "0.7")
* (etv)

= nds:midpoint("dd", "=")
= nds:midabove("dd")

= nds:snodes("x1 x2")
= nds:totexwithsnodes("x1 x2")
= nds:totexwithsnodes("x1 x2"):bshow("p", "0.7")
* (etv)

--]==]


-- «Nodes-test4»  (to ".Nodes-test4")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
Pict2e.bounds = PictBounds.new(v(-1,0), v(10,4), 0.5)
Show.preamble = [[
  \unitlength=35pt
  \def\nodesize{0.9}
]]
PradClass.__index.bshow0 = function (p, str, scale)
    return p:pgat(str or "pgat"):d():scalebox(scale):tostringp()
  end

mknds_43 = function ()
    nds = Nodes.new()
    nds:add0( 0, 3, "dd", [[\frac{d}{d\_}]], "=")
    nds:add0(11, 3, "*",  [[·]],             "=")
    nds:add0( 6, 4, "=",  nil,               nil)
  end
mknds_210_a = function ()
    nds:add0(-1, 2, "x0", [[x]],             "dd")
    nds:add0( 1, 2, "f",  [[f(\_)]],         "dd")
    nds:add0( 7, 2, "f'", [[f'(\_)]],        "*")
    nds:add0(12, 2, "g'", [[g'(\_)]],        "*")
    nds:add0( 3, 1, "g1", [[g(\_)]],         "f")
    nds:add0( 4, 0, "x1", [[x]],             "g1")
    nds:add0( 9, 1, "g2", [[g(\_)]],         "f'")
    nds:add0(10, 0, "x2", [[x]],             "g2")
    nds:add0(13, 1, "x3", [[x]],             "g'")
  end

mknds_43()
mknds_210_a()
= nds
= nds:totexwithsnodes("x1 x2")
= nds:totexwithsnodes("x1 x2"):bshow("p", "0.7")
= nds:totexwithsnodes("x1 x2"):bshow("pgat", "0.7")
* (etv)

--]==]



-- «Nodes-test5»  (to ".Nodes-test5")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
Pict2e.bounds = PictBounds.new(v(0,0), v(13,4), 0.5)
Show.preamble = [[
  \unitlength=35pt
  \def\nodesize{0.9}
]]

nds_addtexs = function ()
    nds:addtexs [[ * ·  dd \frac{d}{d\_}  x1 x  x2 x  x3 x  x4 x  g1 g  g2 g  ]]
    nds:addtexs [[ t1 t   t2 t   t3 t  sin \sin   cos \cos                    ]]
    nds:addtexs [[ *1 ·   *2 ·     42a 42   42b 42  42c 42                    ]]
  end

nds = Nodes.new()
nds:addnodes(4, "                          6:=:                           ")
nds:addnodes(3, "       1:dd:=                           11:*:=           ")
nds:addnodes(2, " 0:x1:dd    2:f:dd             7:f':*         12:g':*    ")
nds:addnodes(1, "                 4:g1:f          9:g2:f'        13:x4:g' ")
nds:addnodes(0, "                    5:x2:g1         10:x3:g2             ")
nds_addtexs()
nds_initial = nds
= nds
= nds:totex()
= nds:totexwithsnodes(""):bshow("pgat", "0.7")
* (etv)

nds = Nodes.new()
nds:addnodes(4, "                          6:=:                                  ")
nds:addnodes(3, "       1:dd:=                                       11:*:=      ")
nds:addnodes(2, " 0:t1:dd   2:sin:dd             7:cos:*                12:42c:* ")
nds:addnodes(1, "                 4:*1:sin              9:*2:cos                 ")
nds:addnodes(0, "             3:42a:*1   5:t2:*1    8:42b:*2  10:t3:*2           ")
nds_addtexs()
nds_final = nds
= nds
= nds:totex()
= nds:totexwithsnodes(""):bshow("pgat", "0.7")
* (etv)

= nds:totexwithsnodes("x1 x2")
= nds:totexwithsnodes("x1 x2"):bshow("p", "0.7")
* (etv)

= nds_initial:totex()
= nds_initial:totex():pgat("pgat")
= nds_initial:totex():pgat("pgat"):scalebox("0.7")
= nds_initial:totex():pgat("pgat"):scalebox("0.7"):d()

Nodes.__index.topage0 = function (nds)
    return nds:totex():pgat("pgat"):scalebox("0.7"):d()
  end

all = PictList {
  nds_initial:topage0(),
  "\\newpage",
  nds_final:topage0(),
}
= all
= all:tostring()
= all:tostringp()

= Show.try(all:tostringp())
* (etv)

--]==]


-- «Nodes-test6»  (to ".Nodes-test6")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
Pict2e.bounds = PictBounds.new(v(0,0), v(13,4), 0.5)
Show.preamble = [[
  \unitlength=35pt
  \def\nodesize{0.9}
]]
nds_addtexs = function ()
    nds:addtexs [[ dd \frac{d}{d\_}  sin \sin   cos \cos ]]
    nds:addtexs [[ *   ·   *1 ·    *2 ·                  ]]
    nds:addtexs [[ x1  x   x2 x    x3 x  x4 x            ]]
    nds:addtexs [[ t1  t   t2 t    t3 t                  ]]
    nds:addtexs [[ g1  g   g2 g                          ]]
    nds:addtexs [[ 42a 42  42b 42  42c 42                ]]
  end

nds = Nodes.new()
nds:addnodes(4, "                          6:=:                           ")
nds:addnodes(3, "       1:dd:=                           11:*:=           ")
nds:addnodes(2, " 0:x1:dd    2:f:dd             7:f':*         12:g':*    ")
nds:addnodes(1, "                 4:g1:f          9:g2:f'        13:x4:g' ")
nds:addnodes(0, "                    5:x2:g1         10:x3:g2             ")
nds_addtexs()
nds_0 = nds
= nds
= nds:totex()
= nds:withsnodetags("dd"):show0("pgat", "0.7")
= nds:withsnodetags("dd"):show("pgat", "0.7")
* (etv)

nds = Nodes.new()
nds:addnodes(4, "                          6:=:                           ")
nds:addnodes(3, "       1:dd:=                           11:*:=           ")
nds:addnodes(2, " 0:t1:dd   2:sin:dd           7:cos:*         12:42c:*   ")
nds:addnodes(1, "               4:g1:sin          9:g2:cos                ")
nds:addnodes(0, "                    5:x2:g1         10:x3:g2             ")
nds_addtexs()
nds_1 = nds

nds = Nodes.new()
nds:addnodes(4, "                          6:=:                           ")
nds:addnodes(3, "       1:dd:=                           11:*:=           ")
nds:addnodes(2, " 0:t1:dd   2:sin:dd           7:cos:*         12:42c:*   ")
nds:addnodes(1, "               4:*1:sin            9:*2:cos              ")
nds:addnodes(0, "          3:42a:*1  5:x2:*1     8:42b:*2  10:x3:*2       ")
nds_addtexs()
nds_2 = nds

nds = Nodes.new()
nds:addnodes(4, "                          6:=:                                  ")
nds:addnodes(3, "       1:dd:=                                       11:*:=      ")
nds:addnodes(2, " 0:t1:dd   2:sin:dd             7:cos:*                12:42c:* ")
nds:addnodes(1, "                 4:*1:sin              9:*2:cos                 ")
nds:addnodes(0, "             3:42a:*1   5:t2:*1    8:42b:*2  10:t3:*2           ")
nds_addtexs()
nds_3 = nds

pgat = "pgat"
pgat = ""
all = PictList {
  nds_0:withsnodetags("dd *      "):show0(pgat, "0.7"),
  "\\newpage",
  nds_0:withsnodetags("x1 f f' g'"):show0(pgat, "0.7"),
  "\\newpage",
  nds_1:withsnodetags("g1 g2     "):show0(pgat, "0.7"),
  "\\newpage",
  nds_2:withsnodetags("x2 x3     "):show0(pgat, "0.7"),
  "\\newpage",
  nds_3:withsnodetags("          "):show0(pgat, "0.7"),
}
= Show.try(all:tostringp())
* (etv)


= nds:show0("pgat", "0.7")
= nds:show("pgat", "0.7")
= nds:show("p", "0.7")

-- «Nodes-test6-pdf»  (to ".Nodes-test6-pdf")
-- (find-pdf-page "~/LATEX/2022pict2e-nodes-test6.pdf")
-- (find-fline "cd ~/LATEX/; xpdf  2022pict2e.pdf")
-- (find-fline "cd ~/LATEX/; cp -v 2022pict2e.pdf 2022pict2e-nodes-test6.pdf")
-- (find-cp-angg-links "2022pict2e-nodes-test6.pdf" "~/LATEX/" "LATEX/")
-- http://angg.twu.net/LATEX/2022pict2e-nodes-test6.pdf


--]==]




--  _   _                                   _       _               
-- | \ | |_   _ _ __ ___   ___ _ __ ___ ___(_)_ __ | |__   ___  ___ 
-- |  \| | | | | '_ ` _ \ / _ \ '__/ _ \_  / | '_ \| '_ \ / _ \/ __|
-- | |\  | |_| | | | | | |  __/ | | (_) / /| | | | | | | | (_) \__ \
-- |_| \_|\__,_|_| |_| |_|\___|_|  \___/___|_|_| |_|_| |_|\___/|___/
--                                                                  
-- «Numerozinhos»  (to ".Numerozinhos")
-- Superseded by: (find-angg "LUA/Numerozinhos1.lua")
--
Numerozinhos = Class {
  type = "Numerozinhos",
  xyn  = function (x, y, n)
      return pformat("\\put(%s,%s){\\cell{\\text{%s}}}", x, y, n)
    end,
  xyns = function (x, y, str)
      local p = PictList {}
      for i,n in ipairs(split(str)) do
        table.insert(p, Numerozinhos.xyn(x+i-1, y, n))
      end
      return p
    end,
  xynss = function (x, y, bigstr)
      local p = PictList {}
      local lines = splitlines((bigstr:gsub("|", "\n")))
      local topy = y + #lines - 1
      for nline,line in ipairs(lines) do
        table.insert(p, Numerozinhos.xyns(x, topy-nline+1, line))
      end
      return p
    end,
  fromf = function (xy_sw, xy_ne, f)
      local xmin,xmax,ymin,ymax = xy_sw[1], xy_ne[1], xy_sw[2], xy_ne[2]
      -- print("xmin,xmax,ymin,ymax", xmin,xmax,ymin,ymax)
      local p = PictList {}
      for y=ymax,ymin,-1 do
        for x=xmin,xmax do
          local n = f(x,y)
          table.insert(p, Numerozinhos.xyn(x, y, n))
        end
      end
      return p
    end,
  --
  from = function (x, y, bigstr)
      return Numerozinhos {x=x, y=y, bigstr=bigstr}
    end,
  spectolines = function (spec)
      return PwSpec.from(spec):topict():prethickness("2pt"):Color("Orange")
    end,
  --
  __index = {
    toputs = function (ns)
        return Numerozinhos.xynss(ns.x, ns.y, ns.bigstr)
      end,
    topictbody = function (ns, spec, etc)
        local lines = spec and Numerozinhos.spectolines(spec)
        local puts  = ns:toputs()
        local body  = PictList {}
        table.insert(body, lines)   -- lines first, below
        table.insert(body, puts)    -- numbers over the lines
        table.insert(body, etc)
        return body
      end,
    topict = function (ns, ...)
        return ns:topictbody(...):pgat("Npc"):preunitlength("11pt")
      end,
    topictu = function (ns, u, ...)
        return ns:topictbody(...):pgat("Npc"):preunitlength(u)
      end,
  },
}

-- A quick hack to add dots and (gradient) vectors
PradClass.__index.adddv = function (p, ...)
    local tio = function (o) table.insert(p, o) end
    local dot = function (x,y) tio(pformat("\\put(%s,%s){\\closeddot}", x, y)) end
    local vec = function (x,y,Dx,Dy) tio(Pict2eVector.fromwalk(v(x,y),v(Dx,Dy))) end
    for i,item in ipairs({...}) do
      if type(item) == "string" then table.insert(p, item)
      elseif type(item) == "table" then
        if #item >= 2 then dot(item[1],item[2]) end
        if #item == 4 then vec(unpack(item)) end
      end
    end
    return p
  end

-- «Numerozinhos-test1»  (to ".Numerozinhos-test1")
-- (c2m221isp 7 "exercicio-2-dica")
-- (c2m221isa   "exercicio-2-dica")
-- (find-LATEX "2022pict2e.tex" "grid-axes-ticks")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"

= Numerozinhos.xyns (2, 4, "24 34 44")
= Numerozinhos.xynss(2, 4, "24 34 44")
= Numerozinhos.xynss(2, 4, "25 35 45 | 24 34")
= Numerozinhos.xynss(2, 4, "25 35 45 | 24 34"):pgat("pN")

Pict2e.bounds = PictBounds.new(v(0,0), v(4,3))
o = Numerozinhos.xynss(2, 1, 
      [[ a b c 
         d e f
         g h i ]])
= o:bshow("pN")
= o
= DGetInfo.fromfunction(o.bshow)
= DGetInfo.fromfunction(Show.try)
= DGetInfo.fromfunction(o.bshow):tostring()

* (etv)

* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
require "Piecewise1"
p = Numerozinhos.from(2, 1,
    [[ a b c 
       d e f
       g h i ]])
= p:topict()
= p:topict("(2,1)--(2,2)")
= p:topict(              ):bshow("")
* (etv)
= p:topict("(2,1)--(2,2)"):bshow("")
* (etv)

--]==]



-- «Numerozinhos-test2»  (to ".Numerozinhos-test2")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"

-- (find-angg "LUA/lua50init.lua" "minus-0")
truncn = function (n) return trunc0(string.format("%.3f", fix0(n))) end

Pict2e.bounds = PictBounds.new(v(0,0), v(6,5))
x0,y0 = 4,3
p = Numerozinhos.fromf(v(x0-2,y0-2),v(x0+2,y0+2), function (x1,y1)
        local Dx,Dy = x1-x0,y1-y0
        print(Dx, Dy, Dx*Dy)
        return Dx*Dy
      end)

= p:bshow("pN")
= p:pgat("pN"):bshow("")
= p:pgat("pN"):preunitlength("12pt"):bshow("")
* (etv)

--]==]


-- «Numerozinhos-test3»  (to ".Numerozinhos-test3")
-- (c3m221nfp 19 "piramide")
-- (c3m221nfa    "piramide")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"

Pict2e.bounds = PictBounds.new(v(-1,-1), v(9,9))
p = Numerozinhos.xynss(0, 0, 
    [[ 0 0 0 0 0 0 0 0 0
       0 0 0 0 0 0 0 0 0
       0 0 1 1 1 1 1 0 0
       0 0 1 2 2 2 1 0 0
       0 0 1 2 3 2 1 0 0
       0 0 1 2 2 2 1 0 0
       0 0 1 1 1 1 1 0 0
       0 0 0 0 0 0 0 0 0
       0 0 0 0 0 0 0 0 0]])
= p:pgat("pN"):preunitlength("11pt"):bshow("")
* (etv)

--]==]


-- «Numerozinhos-test4»  (to ".Numerozinhos-test4")
-- (c3m221fhp 5 "exercicio-2-fig")
-- (c3m221fha   "exercicio-2-fig")
--[==[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"

Numerozinhos.xyn = function (x, y, n)
    if n == "." then return nil end
    if n == "?" then n = "\\ColorRed{?}" end
    return pformat("\\put(%s,%s){\\cell{\\text{%s}}}", x, y, n)
  end

Pict2e.bounds = PictBounds.new(v(-5,-5), v(5,5))
p = Numerozinhos.xynss(-4, -4, 
    [[ . . ? . . . . . .
       . . . . ? . . ? .
       . . . ? ? . ? . ?
       . . . . 3 2 5 . .
       . . ? ? ? 8 ? ? .
       . . ? ? ? . . . .
       ? . ? . ? 4 . . .
       . . . . . . . . .
       . . . . . . ? . .]])
= p:pgat("pN"):preunitlength("11pt"):bshow("")
* (etv)

--]==]


-- «Numerozinhos-test5»  (to ".Numerozinhos-test5")
-- (c3m221fhp 7 "exercicio-5")
-- (c3m221fha   "exercicio-5")
-- (c3m221fha   "exercicio-5" "nff \"Dx*Dy\"")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"

Pict2e.bounds = PictBounds.new(v(0,0), v(6,5))
x0,y0 = 4,3
nff = function (str)
    return Code.vc("x,y => local Dx,Dy = x-x0,y-y0; return "..str)
  end
p = Numerozinhos.fromf(v(x0-2,y0-2),v(x0+2,y0+2), nff "Dx*Dy")
= p:pgat("pN"):preunitlength("11pt"):bshow("")
* (etv)

-- (find-pdftoolsr-page "~/LATEX/2022-1-C3-VR.pdf" 2)
F = nff "Dy               "
G = nff "     Dx * (Dx+Dy)"
H = nff "Dy + Dx * (Dx+Dy)"
pF = Numerozinhos.fromf(v(x0-2,y0-2),v(x0+2,y0+2), F):pgat("pN")
pG = Numerozinhos.fromf(v(x0-2,y0-2),v(x0+2,y0+2), G):pgat("pN")
pH = Numerozinhos.fromf(v(x0-2,y0-2),v(x0+2,y0+2), H):pgat("pN")
= pH
sp = "\\quad"
p3 = PictList({ pF, sp, pG, sp, pH }):preunitlength("11pt")
= p3:bshow("")
* (etv)

= pH:preunitlength("25pt"):bshow("")
* (etv)

* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
[x0,y0] : [4,3];
[Dx,Dy] : [x-x0,y-y0];
G : Dy + Dx * (Dx+Dy);
subst([x=4,y=1], G);

--]]

-- «Numerozinhos-test6»  (to ".Numerozinhos-test6")
-- (find-angg "LUA/Pict2e1.lua" "Pict2eVector-tests")
-- (find-angg "LUA/lua50init.lua" "minus-0")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
truncn = function (n) return trunc0(string.format("%.3f", fix0(n))) end
nff = function (str)
    return Code.vc("x,y => local Dx,Dy = x-x0,y-y0; return "..str)
  end

Pict2e.bounds = PictBounds.new(v(0,0), v(6,5))
x0,y0 = 4,3
p = Numerozinhos.fromf(v(x0-2,y0-2),v(x0+2,y0+2), nff "Dx*Dy")
p:adddv("\\color{Red2}", "\\linethickness{1.0pt}")
p:adddv({4,1}, {4,2,2,1})
PPPV(p)
= p
= p:pgat("pN"):preunitlength("12.5pt"):bshow("")
* (etv)

--]]





--  _____               _       _               
-- |_   _| __ __ _  ___(_)_ __ | |__   ___  ___ 
--   | || '__/ _` |/ __| | '_ \| '_ \ / _ \/ __|
--   | || | | (_| | (__| | | | | | | | (_) \__ \
--   |_||_|  \__,_|\___|_|_| |_|_| |_|\___/|___/
--                                              
-- «Tracinhos»  (to ".Tracinhos")
Tracinhos = Class {
  type = "Tracinhos",
  new = function (r)
      r = r or 0.2
      return Tracinhos { r=r, p=PictList({}) }
    end,
  __index = {
    v = function (tr, Dy, Dx)
        Dx = Dx or 1
        if Dx == 0 then
          if Dy == 0 then return nil end
          return v(0, tr.r)
        end
        local v0 = v(Dx, Dy)
        local v1 = v0 * (1 / v0:norm())
        local v2 = v1 * tr.r
        return v2
      end,
    tracinho = function (tr, xy, Dy, Dx)
        local vv = tr:v(Dy, Dx)
        if not vv then return tr end
        tr.p:addline(xy-vv, xy+vv)

      end,
  },
}

-- «Tracinhos-test»  (to ".Tracinhos-test")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
tr = Tracinhos {r=0.2, p=PictList{}}
V.__index.norm = function (v) return (v[1]^2 + v[2]^2)^0.5 end

Pict2e.bounds = PictBounds.new(v(-2,-2), v(2,2))
tr = Tracinhos.new()
for y=2,-2,-1 do
  for x=-2,2 do
    tr:tracinho(v(x,y), -y, x)
  end
end
= tr.p:pgat("pN"):bshow("")
* (etv)

Pict2e.bounds = PictBounds.new(v(-2,-2), v(2,2))
tr = Tracinhos.new()
for y=2,-2,-1 do
  for x=-2,2 do
    tr:tracinho(v(x,y), 1, x)
  end
end
= tr.p:pgat("pN"):bshow("")
* (etv)

Pict2e.bounds = PictBounds.new(v(-2,-2), v(2,2))
tr = Tracinhos.new()
for y=2,-2,-1 do
  for x=-2,2 do
    tr:tracinho(v(x,y), x+y, 2)
  end
end
= tr.p:pgat("pN"):bshow("")
* (etv)




--]]


--  _____                 __   __   
-- |  ___| __ ___  _ __ __\ \ / /__ 
-- | |_ | '__/ _ \| '_ ` _ \ V / __|
-- |  _|| | | (_) | | | | | | |\__ \
-- |_|  |_|  \___/|_| |_| |_|_||___/
--                                  
-- «FromYs»  (to ".FromYs")
-- Based on: (c2m221p1p 7 "escadas-defs")
--           (c2m221p1a   "escadas-defs")
--           (c2m221p1p 8 "escadas-gab")
--           (c2m221p1a   "escadas-gab")
--
FromYs = Class {
  type   = "FromYs",
  fromys = function (ys) return FromYs {ys=ys} end,
  __tostring = function (fry) return mytostringv(fry) end,
  __index = {
    getYs = function (fry, Y0)
        fry.Ys = {Y0}
        for i,y in ipairs(fry.ys) do
          local lastY = fry.Ys[#fry.Ys]
          table.insert(fry.Ys, lastY+y)
        end
        fry.ymax = foldl1(max, fry.ys)
        fry.ymin = foldl1(min, fry.ys)
        fry.Ymax = foldl1(max, fry.Ys)
        fry.Ymin = foldl1(min, fry.Ys)
        local hx = function (x, y)
            return format(" (%s,%s)c--(%s,%s)o", x-1,y, x,y)
          end
        fry.yspec = ""
        for x,y in ipairs(fry.ys) do fry.yspec = fry.yspec .. hx(x, y) end
        local xY = function (x) return format("(%s,%s)", x, fry.Ys[x+1]) end
        PP(fry.ys)
        PP(fry.Ys)
        PP(xY(0), xY(1), xY(2))
        fry.Yspec = mapconcat(xY, seq(0, #fry.Ys-1), "--")
        return fry
      end,
    getypict = function (fry, ymin, ymax)
        ymin = ymin or fry.ymin
        ymax = ymax or fry.ymax
        local pws  = PwSpec.from(fry.yspec)
        local pict = pws:topict():setbounds(v(0, ymin), v(#fry.ys, ymax))
        return pict
      end,
    getYpict = function (fry, Ymin, Ymax)
        Ymin = Ymin or fry.Ymin
        Ymax = Ymax or fry.Ymax
        local pws  = PwSpec.from(fry.Yspec)
        local pict = pws:topict():setbounds(v(0, Ymin), v(#fry.Ys-1, Ymax))
        return pict
      end,
    getYgrid = function (fry, Ymin, Ymax)
        Ymin = Ymin or fry.Ymin
        Ymax = Ymax or fry.Ymax
        local pws  = PwSpec.from("")
        local pict = pws:topict():setbounds(v(0, Ymin), v(#fry.Ys-1, Ymax))
        return pict
      end,
  },
}

-- «FromYs-tests»  (to ".FromYs-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict2e1-1.lua"
require "Piecewise1"
fryy = FromYs.fromys {0,1,2,3}
fryy:getYs(10)
= fryy
= fryy:getypict()
= fryy:getYpict()
= fryy:getYpict():pgat("pgatc")
= fryy:getYpict():pgat("pgatc"):sa("fig Foo")

--]]








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