|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://anggtwu.net/LUA/Pict3.lua.html
-- http://anggtwu.net/LUA/Pict3.lua
-- (find-angg "LUA/Pict3.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- This file defines the middle-level methods of the Pict class.
--
-- The Pict class has low-level methods, defined in this other file,
-- (find-angg "LUA/Indent2.lua" "Pict")
-- and medium-level methods, defined below, in these sections:
-- (to "Points2-methods")
-- (to "PictBounds-methods")
-- (to "Pict-show")
--
-- (defun p2 () (interactive) (find-angg "LUA/Pict2e2.lua"))
-- (defun p3 () (interactive) (find-angg "LUA/Pict3.lua"))
-- (defun i2 () (interactive) (find-angg "LUA/Indent2.lua"))
-- (defun ps1 () (interactive) (find-angg "LUA/PictShow1.lua"))
-- (defun pw2 () (interactive) (find-angg "LUA/Piecewise2.lua"))
--
-- Used by:
-- (find-angg "LUA/Piecewise2.lua")
-- (find-angg "LUA/Numerozinhos1.lua")
-- (find-angg "LUA/Surface1.lua")
-- (find-angg "LUA/ExprDxDy1.lua")
-- «.Points2» (to "Points2")
-- «.Points2-tests» (to "Points2-tests")
-- «.Points2-methods» (to "Points2-methods")
-- «.Points2-methods-tests» (to "Points2-methods-tests")
-- «.PictBounds» (to "PictBounds")
-- «.PictBounds-tests» (to "PictBounds-tests")
-- «.usepackages» (to "usepackages")
-- «.PictBounds-methods» (to "PictBounds-methods")
-- «.Pict-show» (to "Pict-show")
-- «.PictBounds-methods-tests» (to "PictBounds-methods-tests")
-- «.Pict-show-tests» (to "Pict-show-tests")
require "Indent2" -- (find-angg "LUA/Indent2.lua")
-- (find-angg "LUA/Indent2.lua" "Pict")
require "MiniV1" -- (find-angg "LUA/MiniV1.lua" "MiniV-tests")
require "Show2" -- (find-angg "LUA/Show2.lua")
V = MiniV
v = V.fromab
-- ____ _ _
-- | _ \ ___ (_)_ __ | |_ ___
-- | |_) / _ \| | '_ \| __/ __|
-- | __/ (_) | | | | | |_\__ \
-- |_| \___/|_|_| |_|\__|___/
--
-- «Points2» (to ".Points2")
--
Points2 = Class {
type = "Points2",
new = function () return Points2 {} end,
from = function (...) return Points2 {...} end,
__tostring = function (pts) return pts:tostring() end,
__index = {
add = function (pts, pt) table.insert(pts, pt); return pts end,
adds = function (pts, pts2)
for _,pt in ipairs(pts2) do pts:add(pt) end
return pts
end,
--
tostring = function (pts, sep) return mapconcat(tostring, pts, sep or "") end,
pict2e = function (pts, prefix) return prefix..tostring(pts) end,
Line = function (pts) return pts:pict2e("\\Line") end,
polygon = function (pts,s) return pts:pict2e("\\polygon"..(s or "")) end,
region0 = function (pts) return pts:polygon("*") end,
rev = function (pts) return table.reverse(pts) end,
-- region0 = function (pts) return pts:pict2e("\\polygon*") end,
-- region = function (pts, color) return pts:region0():color(color) end,
-- region = function (pts, color) return pts:region0() end,
},
}
-- «Points2-tests» (to ".Points2-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict3.lua"
a = VTable {20, 30, 40}
= a
= table.reverse(a)
pts = Points2 {v(1,2), v(3,4), v(3,1)}
= pts
= pts:Line()
= pts:Line()
= pts:rev()
= pts:add(pts:rev())
pts = Points2 {v(1,2), v(3,4), v(3,1)}
PPP(pts:Line())
= pts:Line()
= pts:polygon()
= pts:region0()
= pts:Line():bshow()
* (etv)
= pts:polygon():bshow()
* (etv)
= pts:region0():bshow()
* (etv)
--]]
-- «Points2-methods» (to ".Points2-methods")
-- Based on: (find-angg "LUA/Pict2e2.lua" "Pict")
--
table.addentries(Pict.__index,
{ addline = function (p, ...) return p:add(Points2.from(...):Line()) end,
addpolygon = function (p, ...) return p:add(Points2.from(...):polygon()) end,
addregion0 = function (p, ...) return p:add(Points2.from(...):region0()) end,
--
addfmt = function (p, ...) return p:add(pformat(...)) end,
putstrat = function (p, xy, str) return p:addfmt("\\put%s{%s}", xy, str) end,
putfmtat = function (p, xy, ...) return p:putstrat(xy, pformat(...)) end,
putcellat = function (p, xy, str) return p:putfmtat(xy, "\\cell{%s}", str) end,
puttcellat = function (p, xy, str) return p:putfmtat(xy, "\\cell{\\text{%s}}", str) end,
--
addopendotat = function (p, xy) return p:putstrat(xy, "\\opendot") end,
addcloseddotat = function (p, xy) return p:putstrat(xy, "\\closeddot") end,
predotdims = function (p, c, o)
local fmt1 = "\\def\\closeddot{\\circle*{%s}}"
local fmt2 = "\\def\\opendot {\\circle*{%s}\\color{white}\\circle*{%s}}"
return Pict { pformat(fmt1,c), pformat(fmt2,c,o), p }
end,
predotdims1 = function (p, co)
local c, o = unpack(split(co))
return p:predotdims(c, o)
end,
})
-- «Points2-methods-tests» (to ".Points2-methods-tests")
--[[
* (show2-use "/tmp/")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict3.lua"
p = Pict {}
= p:addline (v(1,2), v(3,4), v(3,1))
= p:addpolygon(v(1,2), v(3,4), v(3,1))
= p:addregion0(v(1,2), v(3,4), v(3,1))
q = p:color"Orange1"
q = p:color"Orange1":addopendotat(v(1,1))
= q
= q:pgat("pgat")
= q:show("pgat")
= Show.log
= outertexbody
* (etv)
--]]
-- ____ _ _ ____ _
-- | _ \(_) ___| |_| __ ) ___ _ _ _ __ __| |___
-- | |_) | |/ __| __| _ \ / _ \| | | | '_ \ / _` / __|
-- | __/| | (__| |_| |_) | (_) | |_| | | | | (_| \__ \
-- |_| |_|\___|\__|____/ \___/ \__,_|_| |_|\__,_|___/
--
-- «PictBounds» (to ".PictBounds")
-- (find-LATEX "edrxpict.lua" "pictp0-pictp3")
-- (find-es "pict2e" "picture-mode")
-- (find-kopkadaly4page (+ 12 288) "\\begin{picture}(x dimen,y dimen)")
-- (find-kopkadaly4text (+ 12 288) "\\begin{picture}(x dimen,y dimen)")
-- (find-kopkadaly4page (+ 12 301) "13.1.6 Shifting a picture environment")
-- (find-kopkadaly4text (+ 12 301) "13.1.6 Shifting a picture environment")
-- (find-kopkadaly4page (+ 12 302) "\\begin{picture}(x dimen,y dimen)(x offset,y offset)")
-- (find-kopkadaly4text (+ 12 302) "\\begin{picture}(x dimen,y dimen)(x offset,y offset)")
PictBounds = Class {
type = "PictBounds",
new = function (ab, cd, e)
local a,b = ab[1], ab[2]
local c,d = cd[1], cd[2]
local x1,x2 = min(a,c), max(a,c)
local y1,y2 = min(b,d), max(b,d)
return PictBounds {x1=x1, y1=y1, x2=x2, y2=y2, e=e or .2}
end,
--
-- (find-angg "LUA/Pict2e1.lua" "Pict2e" "getbounds =")
getbounds = function ()
return PictBounds.bounds or PictBounds.new(v(0,0), v(3, 2))
end,
setbounds = function (...)
PictBounds.bounds = PictBounds.new(...)
end,
--
__tostring = function (pb) return pb:tostring() end,
__index = {
x0 = function (pb) return pb.x1 - pb.e end,
x3 = function (pb) return pb.x2 + pb.e end,
y0 = function (pb) return pb.y1 - pb.e end,
y3 = function (pb) return pb.y2 + pb.e end,
p0 = function (pb) return v(pb.x1 - pb.e, pb.y1 - pb.e) end,
p1 = function (pb) return v(pb.x1, pb.y1 ) end,
p2 = function (pb) return v(pb.x2, pb.y2 ) end,
p3 = function (pb) return v(pb.x2 + pb.e, pb.y2 + pb.e) end,
tostring = function (pb)
return pformat("LL=(%s,%s) UR=(%s,%s) e=%s",
pb.x1, pb.y1, pb.x2, pb.y2, pb.e)
end,
--
beginpicture = function (pb)
local dimen = pb:p3() - pb:p0()
local center = (pb:p3() + pb:p0()) * 0.5
local offset = pb:p0()
return pformat("\\begin{picture}%s%s", dimen, offset)
end,
--
grid = function (pb)
local p = Pict({"% Grid", "% Horizontal lines:"})
for y=pb.y1,pb.y2 do p:addline(v(pb:x0(), y), v(pb:x3(), y)) end
p:add("% Vertical lines:")
for x=pb.x1,pb.x2 do p:addline(v(x, pb:y0()), v(x, pb:y3())) end
return p
end,
ticks = function (pb, e)
e = e or .2
local p = Pict({"% Ticks", "% On the vertical axis:"})
for y=pb.y1,pb.y2 do p:addline(v(-e, y), v(e, y)) end
p:add("% On the horizontal axis:")
for x=pb.x1,pb.x2 do p:addline(v(x, -e), v(x, e)) end
return p
end,
axes = function (pb)
local p = Pict({"% Axes"})
return p:addline(v(pb:x0(), 0), v(pb:x3(), 0))
:addline(v(0, pb:y0()), v(0, pb:y3()))
end,
axesandticks = function (pb)
return Pict { pb:axes(), pb:ticks() }
end,
--
-- 2023jun08:
hticks = function (pb, e)
e = e or .2
local p = Pict {"% On the horizontal axis:"}
for x=pb.x1,pb.x2 do p:addline(v(x, -e), v(x, e)) end
return p
end,
vticks = function (pb, e)
e = e or .2
local p = Pict {"% On the vertical axis:"}
for y=pb.y1,pb.y2 do p:addline(v(-e, y), v(e, y)) end
return p
end,
haxis = function (pb)
return Pict({}):addline(v(pb:x0(), 0), v(pb:x3(), 0))
end,
vaxis = function (pb)
return Pict({}):addline(v(0, pb:y0()), v(0, pb:y3()))
end,
haxisandticks = function (pb)
return Pict { "% Horizontal axis and ticks:", pb:haxis(), pb:hticks() }
end,
},
}
-- «PictBounds-tests» (to ".PictBounds-tests")
-- (find-LATEX "edrxpict.lua" "pictp0-pictp3")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict3.lua"
= PictBounds.new(v(-1,-2), v( 3, 5))
= PictBounds.new(v( 3, 5), v(-1,-2))
= PictBounds.new(v( 3, 5), v(-1,-2), 0.5)
pb = PictBounds.new(v(-1,-2), v( 3, 5))
= pb:p0()
= pb:p1()
= pb:p2()
= pb:p3()
= pb:grid()
= pb:ticks()
= pb:axes()
= pb:axesandticks()
= pb:grid():prethickness("0.5pt")
= pb:grid():prethickness("0.5pt"):color("gray")
= pb
= pb:beginpicture()
= pb:p0()
= (pb:p0() + pb:p3())
= (pb:p0() + pb:p3()) * 0.5
--]]
-- _
-- _ _ ___ ___ _ __ __ _ ___| | ____ _ __ _ ___ ___
-- | | | / __|/ _ \ '_ \ / _` |/ __| |/ / _` |/ _` |/ _ \/ __|
-- | |_| \__ \ __/ |_) | (_| | (__| < (_| | (_| | __/\__ \
-- \__,_|___/\___| .__/ \__,_|\___|_|\_\__,_|\__, |\___||___/
-- |_| |___/
--
-- «usepackages» (to ".usepackages")
-- For ":show".
-- See: (find-angg "LUA/Show2.lua" "texbody")
-- (find-angg "LUA/Show2.lua" "usepackages")
-- (find-angg "LUA/Show2.lua" "usepackages" "usepackages_pict2e")
usepackages.pict2e = true
-- ____ _ _ ____ _
-- | _ \(_) ___| |_| __ ) ___ _ _ _ __ __| |___ _ __ ___
-- | |_) | |/ __| __| _ \ / _ \| | | | '_ \ / _` / __| | '_ ` _ \
-- | __/| | (__| |_| |_) | (_) | |_| | | | | (_| \__ \ | | | | | |
-- |_| |_|\___|\__|____/ \___/ \__,_|_| |_|\__,_|___/ |_| |_| |_|
--
-- This block "adds PictBounds methods to the class Pict".
-- More precisely, it adds to Pict.__index, that is the table of methods
-- for the class Pict, a bunch of new methods that call things from the
-- class PictBounds.
-- Based on: (find-angg "LUA/Pict2e1.lua" "PictBounds-methods")
--
-- «PictBounds-methods» (to ".PictBounds-methods")
--
table.addentries(Pict.__index,
{ gb = function (p) return PictBounds.getbounds() end,
getbounds = function (p) return PictBounds.getbounds() end,
setbounds = function (p,...) PictBounds.setbounds(...); return p end,
--
bep0 = function (p) return p:gb():beginpicture(), "\\end{picture}" end,
bep = function (p) return p:wrapbe(p:bep0()) end,
--
grid0 = function (p) return p:gb():grid() end,
axes0 = function (p) return p:gb():axes() end,
axesandticks0 = function (p) return p:gb():axesandticks() end,
haxisandticks0 = function (p) return p:gb():haxisandticks() end,
--
gridstyle = function (p) return p:pre0("\\pictgridstyle"):wrap1() end,
axesstyle = function (p) return p:pre0("\\pictaxesstyle"):wrap1() end,
naxesstyle = function (p) return p:pre0("\\pictnaxesstyle"):wrap1() end,
--
pregrid = function (p) return p:pre0(p:grid0():gridstyle()) end,
preaxes = function (p) return p:pre0(p:axes0():axesstyle()) end,
preaxesandticks = function (p) return p:pre0(p:axesandticks0():axesstyle()) end,
prehaxisandticks = function (p) return p:pre0(p:haxisandticks0():axesstyle()) end,
prenaxesandticks = function (p) return p:pre0(p:axesandticks0():naxesstyle()) end,
--
-- "PGAT" means "Picture, Grid, Axes, Ticks".
-- This method adds begin/end picture, grid, axes, and ticks to a
-- Pict2e object, in the right order, and with a very compact syntax
-- to select what will be added. It can also add a bhbox and a def.
pgat = function (p, str, opts)
opts = opts or {}
if str:match("a") then p = p:preaxesandticks() end
if str:match("A") then p = p:preaxes() end
if str:match("N") then p = p:prenaxesandticks() end -- for numerozinhos
if str:match("h") then p = p:prehaxisandticks() end -- for estatistica
if str:match("g") then p = p:pregrid() end
if str:match("p") then p = p:bep() end
if str:match("c") then p = p:myvcenter() end
if str:match("B") then p = p:bhbox() end
if opts.dotdims then p = p:predotdims1(opts.dotdims) end
if opts.ul then p = p:preunitlength(opts.ul) end
if opts.scale then p = p:scalebox(opts.scale) end
if opts.def then p = p:def(opts.def) end
if opts.sa then p = p:sa(opts.sa) end
return p
end,
--
-- «Pict-show» (to ".Pict-show")
-- The method ":show" for strings is described here,
-- (find-angg "LUA/Show2.lua" "StringShow")
-- and it works like this:
--
-- body,opts --:show00--> texbody --> tostring(outertexbody) --> status
-- \ \--:show0----------------^ ^
-- \---:show-------------------------------------------/
--
-- The methods ":show" and ":show0" for pict objects work like this:
--
-- p,str,opts --:show0--> p2 --> texbody --> status
-- \--:show-----------------------^
--
-- the method ":show0" converts a first pict object, p, to another
-- pict object, p2, by calling ":pgat" with the arguments "str"
-- and "opts" (see above); ":show" does that and also converts p2
-- to a string, sets the global variable "texbody", and calls
-- Show.try.
--
-- Note that the conversion "p2 --> texbody" converts a pict
-- object to an indent obejct as an intermediate step. The details
-- are here:
-- (find-angg "LUA/Indent2.lua" "Pict")
--
show0 = function (p,str,opts)
local p2 = p:pgat(str or "pgat", opts)
return p2
end,
show = function (p,str,opts)
texbody = p:show0(str,opts):tostring("%")
return Show.try(tostring(outertexbody))
end,
})
-- «PictBounds-methods-tests» (to ".PictBounds-methods-tests")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict3.lua"
ab = Pict {"a", "b"}
= ab:bep0()
= ab:bep()
= ab:bep():wrap1()
= ab: grid0()
= ab: gridstyle()
= ab:pregrid()
= ab: axes0()
= ab: axesandticks0()
= ab: axesstyle()
= ab: naxesstyle()
= ab: preaxes()
= ab: preaxesandticks()
= ab:prenaxesandticks()
= ab:pgat("a")
= ab:pgat("A")
= ab:pgat("N")
= ab:pgat("g")
= ab:pgat("p")
= ab:pgat("c")
= ab:pgat("B")
= ab:pgat(" ", {def="foo"})
= ab:pgat(" ", {def="foo"}):tostring("%")
= ab:pgat(" ", {sa="a long name"})
= ab:pgat(" ", {sa="a long name", scale=0.5})
= ab:pgat("pgat")
= ab:pgat("pgat"):wrap1()
--]]
-- «Pict-show-tests» (to ".Pict-show-tests")
--[[
* (show2-use "/tmp/")
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "Pict3.lua"
p = Pict{}:addline(v(1,1), v(2,2), v(3,1)):prethickness"2pt"
= p
= p:show0()
= p:show0("pg")
= p:show0("pg", {scale=2})
= p:show ("pg", {scale=2})
* (etv)
= Show.log
= Show.bigstr
--]]
-- Local Variables:
-- coding: utf-8-unix
-- End: