Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file: -- http://anggtwu.net/LUA/Surface1.lua.html -- http://anggtwu.net/LUA/Surface1.lua -- (find-angg "LUA/Surface1.lua") -- Author: Eduardo Ochs <eduardoochs@gmail.com> -- -- (defun e () (interactive) (find-angg "LUA/Surface1.lua")) -- (defun o () (interactive) (find-LATEX "2021-1-C3-3D.lua")) -- Supersedes: (find-LATEX "2020-2-C3-plano-tang.lua") -- (find-LATEX "2021-1-C3-3D.lua") -- -- «.V3» (to "V3") -- «.V3-tests» (to "V3-tests") -- «.Pgat3» (to "Pgat3") -- «.Pgat3-tests» (to "Pgat3-tests") -- «.Surface» (to "Surface") -- «.Surface-tests» (to "Surface-tests") -- «.test-piramide» (to "test-piramide") -- «.test-cruz» (to "test-cruz") require "Pict3" -- (find-angg "LUA/Pict3.lua") -- «V3» (to ".V3") -- (find-es "dednat" "V3") -- V3 = Class { type = "V3", __tostring = function (v) return v:tostring() end, __add = function (v, w) return V3{v[1]+w[1], v[2]+w[2], v[3]+w[3]} end, __sub = function (v, w) return V3{v[1]-w[1], v[2]-w[2], v[3]-w[3]} end, __unm = function (v) return v*-1 end, __mul = function (v, w) local ktimesv = function (k, v) return V3{k*v[1], k*v[2], k*v[3]} end local innerprod = function (v, w) return v[1]*w[1] + v[2]*w[2] + v[3]*w[3] end if type(v) == "number" and type(w) == "table" then return ktimesv(v, w) elseif type(v) == "table" and type(w) == "number" then return ktimesv(w, v) elseif type(v) == "table" and type(w) == "table" then return innerprod(v, w) else error("Can't multiply "..tostring(v).."*"..tostring(w)) end end, threeD = "3D", __index = { -- tostring = function (v) return v:v3string() end, tostring = function (v) if V3.threeD == "2D" then return v:v2string() end if V3.threeD == "3D" then return v:v3string() end error("V3.threeD is neither '2D' or '3D'") end, v3string = function (v) return pformat("(%s,%s,%s)", v[1], v[2], v[3]) end, v2string = function (v) return tostring(v:tov2()) end, tow = function (A,B,t) return A+(B-A)*t end, -- -- Convert v3 to v2 using a primitive kind of perspective. -- Adjust p1, p2, p3 to change the perspective. tov2 = function (v) return v[1]*v.p1 + v[2]*v.p2 + v[3]*v.p3 end, p1 = V{2,-1}, p2 = V{2,1}, p3 = V{0,2}, -- Line = function (A, v) return pformat("\\Line%s%s", A, A+v) end, Lines = function (A, v, w, i, j) local p = Pict {} for k=i,j do p:add((A+k*w):Line(v)) end return p end, -- xticks = function (_,n,eps) eps = eps or 0.15 return v3(0,-eps,0):Lines(v3(0,2*eps,0), v3(1,0,0), 0, n) end, yticks = function (_,n,eps) eps = eps or 0.15 return v3(-eps,0,0):Lines(v3(2*eps,0,0), v3(0,1,0), 0, n) end, zticks = function (_,n,eps) eps = eps or 0.15 return v3(-eps,0,0):Lines(v3(2*eps,0,0), v3(0,0,1), 0, n) end, axeswithticks = function (_,x,y,z) local p = Pict {} p:add(v3(0,0,0):Line(v3(x+0.5, 0, 0))) p:add(v3(0,0,0):Line(v3(0, y+0.5, 0))) p:add(v3(0,0,0):Line(v3(0, 0, z+0.5))) p:add(_:xticks(x)) p:add(_:yticks(y)) p:add(_:zticks(z)) return p end, xygrid = function (_,x,y) local p = Pict {} p:add(v3(0,0,0):Lines(v3(0,y,0), v3(1,0,0), 0, x)) p:add(v3(0,0,0):Lines(v3(x,0,0), v3(0,1,0), 0, y)) return p end, }, } v3 = function (x,y,z) return V3{x,y,z} end -- Choose one: -- V3.__index.tostring = function (v) return v:v2string() end -- V3.__index.tostring = function (v) return v:v3string() end -- «V3-tests» (to ".V3-tests") --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Surface1.lua" -- (c3m211cnp 15 "figura-piramide") -- (c3m211cna "figura-piramide") fw = function (x) return max(min(x-2, 6-x), 0) end FP = function (x,y) return min(fw(x), fw(y)) end FC = function (x,y) return max(fw(x), fw(y)) end sP = Surface.new(FP, 4, 4) sC = Surface.new(FC, 4, 4) -- \beginpicture(0,-2)(18,12) = v3():xygrid(7,7) = v3():axeswithticks(7,7,2) sP:segment(v(0,2), v(7,2), nil, 7) sP:segment(v(0,3), v(7,3), nil, 7) sP:segment(v(0,4), v(7,4), nil, 7) sP:segment(v(0,5), v(7,5), nil, 7) sP:segment(v(0,6), v(7,6), nil, 7) sP:segment(v(2,0), v(2,7), nil, 7) sP:segment(v(3,0), v(3,7), nil, 7) sP:segment(v(4,0), v(4,7), nil, 7) sP:segment(v(5,0), v(5,7), nil, 7) sP:segment(v(6,0), v(6,7), nil, 7) sP:segment(v(2,2), v(6,6), nil, 4) sP:segment(v(2,6), v(6,2), nil, 4) V3.threeD = "2D" = sP:segment(v(2,6), v(6,2), nil, 4) V3.threeD = "3D" = sP:segment(v(2,6), v(6,2), nil, 4) --]] -- ____ _ _____ -- | _ \ __ _ __ _| |_|___ / -- | |_) / _` |/ _` | __| |_ \ -- | __/ (_| | (_| | |_ ___) | -- |_| \__, |\__,_|\__|____/ -- |___/ -- -- «Pgat3» (to ".Pgat3") -- Pgat3 = Class { type = "Pgat3", setbounds = function (maxx,maxy,maxz) Pgat3.maxx = maxx Pgat3.maxy = maxy Pgat3.maxz = maxz end, gat = function () local maxx,maxy,maxz = Pgat3.maxx,Pgat3.maxy,Pgat3.maxz return Pict { v3():xygrid(maxx, maxy):Color("Gray"), v3():axeswithticks(maxx, maxy, maxz) } end, pgat = function (p) local p2 = Pict { Pgat3.gat(), p } return p2:pgat("pc") end, set772 = function () V3.__index.p1 = V {2.0, -0.2} V3.__index.p2 = V {0.5, 1.5} V3.__index.p3 = V {0, 0.75} Pgat3.setbounds(7,7,2) PictBounds.setbounds(v(0,-2), v(18,12)) end, set433 = function () V3.__index.p1 = V{2, -0.5} V3.__index.p2 = V{0.5, 1.7} V3.__index.p3 = V{0, 0.5} Pgat3.setbounds(4,3,3) PictBounds.setbounds(v(0,-3), v(10,6)) end, set433_2D = function () PictBounds.setbounds(v(0,0), v(5,4)) end, __index = { }, } Pict.__index.pgat3 = function (p) return Pgat3.pgat(p) end -- «Pgat3-tests» (to ".Pgat3-tests") --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Surface1.lua" V3.threeD = "2D" Pgat3.set772() p = Pict{} :pgat3() = p = p:show("", {scale=0.4}) * (etv) = p:show("B", {scale=0.4}) * (etv) Pgat3.set433() p = Pict{} :pgat3() = p = p:show("", {scale=0.7}) * (etv) --]] -- «Surface» (to ".Surface") -- (find-dn6 "picture.lua" "V") -- (find-dn6 "diagforth.lua" "newnode:at:") -- Surface = Class { type = "Surface", new = function (f, x0_, y0_) x0_ = x0_ or x0 y0_ = y0_ or y0 return Surface {f=f, x0=x0_, y0=y0_, xy0=v(x0_, y0_)} end, __tostring = function (s) return mytostringv(s) end, __index = { xyz = function (s, xy, zvalue) return v3(xy[1], xy[2], zvalue or s.f(xy[1], xy[2])) end, xyztow = function (s, xy1, xy2, zvalue, k) return s:xyz(xy1:tow(xy2, k), zvalue) end, segment = function (s, xy1, xy2, zvalue, n) local str = "" for i=0,n do str = str .. s:xyztow(xy1, xy2, zvalue, i/n):tostring() end return "\\Line"..str end, pillar = function (s, xy) return "\\Line" .. s:xyz(xy, 0):tostring() .. s:xyz(xy, nil):tostring() end, pillars = function (s, xy1, xy2, n) local p = Pict {} for i=0,n do p:add(s:pillar(xy1:tow(xy2, i/n))) end return p end, segmentstuff = function (s, xy1, xy2, n, what) local p = Pict {} if what:match"0" then p:add(s:segment(xy1, xy2, 0, 1)) end if what:match"c" then p:add(s:segment(xy1, xy2, nil, n)) end if what:match"p" then p:add(s:pillars(xy1, xy2, n)) end return p end, -- stoxy = function (s, str) return expr(format("MiniV {%s}", str)) end, -- -- The functions that use x0 and y0 start here squarestuff = function (s, dxy0s, dxy1s, n, what) local dxy0 = s:stoxy(dxy0s) local dxy1 = s:stoxy(dxy1s) local xy1 = s.xy0 + dxy0 local xy2 = s.xy0 + dxy1 return s:segmentstuff(xy1, xy2, n, what) end, squarestuffp = function (s, n, what, pair) local dxy0,dxy1 = unpack(split(pair)) return s:squarestuff(dxy0, dxy1, n, what) end, squarestuffps = function (s, n, what, listofpairs) local p = Pict {} for _,pair in ipairs(listofpairs) do p:add(s:squarestuffp(n, what, pair)) end return p end, -- horizontals = function (s, n, what) return s:squarestuffps(n, what, { "-1,-1 1,-1", "-1,0 1,0", "-1,1 1,1" }) end, verticals = function (s, n, what) return s:squarestuffps(n, what, { "-1,-1 -1,1", "0,-1 0,1", "1,-1 1,1" }) end, diagonals = function (s, n, what) return s:squarestuffps(n, what, { "-1,-1 1,1", "-1,1 1,-1" }) end, square = function (s, n, what) return Pict { s:horizontals(n, what), s:verticals (n, what) } end, squareanddiagonals = function (s, n) return Pict { s:square (2, "p"):Color("Gray"), s:square (n, "0"), s:square (n, "c"), s:diagonals(n, "c") } end, }, } -- «Surface-tests» (to ".Surface-tests") --[[ * (show2-use "$SHOW2LATEXDIR/") * (show2-use "/tmp/") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Surface1.lua" F = function (x, y) return 10*x + y end srf = Surface.new(F, 3, 4) = srf:xyz(v(2, 5)) = srf:xyz(v(2, 5), 0) = srf:xyztow (v(2,5), v(22,25), nil, 0.5) = srf:xyztow (v(2,5), v(22,25), 0, 0.5) = srf:segment(v(2,5), v(22,25), 0, 2) = srf:segment(v(2,5), v(22,25), nil, 2) = srf:pillar(v(2,5)) = srf:segmentstuff(v(2,5), v(22,25), 2, "0cp") = srf:stoxy("30,40") = srf:squarestuff("0,0", "2,2", 2, "0") = srf:squarestuff("0,0", "2,2", 2, "c") = srf:squarestuff("0,0", "2,2", 2, "p") = srf:squarestuffp( 2, "p", "0,0 2,2") = srf:squarestuffps( 2, "p", {"0,0 2,2", "0,0 2,2"}) = srf:square (2, "p") = srf:square (4, "p") = srf:square (2, "c") = srf:square (4, "c") = srf:square (8, "c") = srf:diagonals(2, "p") V3.__index.p1 = V {2.0, -0.2} V3.__index.p2 = V {0.5, 1.5} V3.__index.p3 = V {0, 0.75} V3.threeD = "2D" V3.threeD = "3D" = v3():xygrid(7,7) = v3():axeswithticks(7,7,2) -- Broken: = sP:segment(v(0,4), v(6,4), nil, 6) = v3():gat(7,7,2) = v3():gat(7,7,2):show("p", {scale=0.4}) * (etv) --]] -- «test-piramide» (to ".test-piramide") --[[ * (show2-use "$SHOW2LATEXDIR/") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Surface1.lua" usepackages.edrx21 = true V3.threeD = "2D" Pgat3.set772() fw = function (x) return max(min(x-2, 6-x), 0) end FP = function (x,y) return min(fw(x), fw(y)) end FC = function (x,y) return max(fw(x), fw(y)) end sP = Surface.new(FP, 4, 4) sC = Surface.new(FC, 4, 4) p = Pict {} for y=2,6 do p:add(sP:segment(v(0,y), v(7,y), nil, 7)) end for x=2,6 do p:add(sP:segment(v(x,0), v(x,7), nil, 7)) end p:add(sP:segment(v(2,2), v(6,6), nil, 4)) p:add(sP:segment(v(2,6), v(6,2), nil, 4)) = p:pgat3():show("", {scale=0.4}) * (etv) = p:pgat3():show("", {ul="5pt", scale=2}) * (etv) -- «test-cruz» (to ".test-cruz") p = Pict {} for y=0,7 do p:add(sC:segment(v(0,y), v(7,y), nil, 7)) end for x=0,7 do p:add(sC:segment(v(x,0), v(x,7), nil, 7)) end p:add(sC:segment(v(2,2), v(6,6), nil, 4)) p:add(sC:segment(v(2,6), v(6,2), nil, 4)) = p:pgat3():show("", {scale=0.4}) * (etv) = p:pgat3():show("", {ul="5pt", scale=2}) * (etv) -- ^ Compare with -- (c3m211cnp 15 "figura-piramide") -- (c3m211cna "figura-piramide") -- (c3m211cnp 16 "cruz") -- (c3m211cna "cruz") --]] -- «QuadraticFunction-tests» (to ".QuadraticFunction-tests") -- Used by: (c3m211qp 2 "figuras-3D") -- (c3m211qp 9 "figuras-3D") -- (c3m211qa "figuras-3D") -- (c3m211qp 4 "point-of-view") -- (c3m211qa "point-of-view") --[[ * (show2-use "$SHOW2LATEXDIR/") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) dofile "Surface1.lua" usepackages.edrx21 = true V3.threeD = "2D" Pgat3.set433() p = Pict {} = p:pgat3() = p:pgat3():show("", {scale=0.8}) * (etv) * (show2-use "$SHOW2LATEXDIR/") * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) -- dofile "Surface1.lua" dofile "ExprDxDy1.lua" usepackages.edrx21 = true Pgat3.set433() V3.threeD = "2D" x0,y0 = 3,2 edd = ExprDxDy.from("2+Dx^2-Dy^2") srf = Surface.new(edd.f, 3, 2) srf = Surface.new(edd.f) p = srf:squareanddiagonals(8) = p = p:pgat3() = p:pgat3():show("", {scale=0.8}) * (etv) srf = Surface.new(edd.f) for y=3,0,-1 do for x=0,4 do -- printf("%03s", edd.f(x,y)) printf("%03s", srf.f(x,y)) end print() end = srf.f = srf:square (2, "p") = srf:square (8, "0") = srf:square (8, "c") = srf:diagonals(8, "c") p = Pict {} = p:pgat3() = Pict{}:pgat3() p = Pict { srf:square (2, "p"):Color("Gray"), srf:square (8, "0"), srf:square (8, "c"), srf:diagonals(8, "c") } = p:pgat3() = p:pgat3():show("", {scale=0.8}) * (etv) = x0,y0 PPPV(Pgat3) = v3():xygrid(4,3):Color("Gray") = v3():axeswithticks(4,3,3) F = function (x, y) return 10*x + y end = srf:diagonals(8, "p") = srf:square (8, "c") --]] -- Local Variables: -- coding: utf-8-unix -- End: