Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- 2009may03 -- (find-LATEX "2009apr29-C1.tex") -- (find-angg "LUA/vectors.tcl") -- (find-es "lua5" "vectors") -- (find-anggfile "DAVINCI/intro.lua") -- (find-LATEX "diaglib.014") -- «.start-gui» (to "start-gui") vector = function (x, y) return Vector.new(x, y) end Vector = { __add = function(v, w) return vector(v[1]+w[1], v[2]+w[2]) end, __sub = function(v, w) return vector(v[1]-w[1], v[2]-w[2]) end, __mul = function(x, v) return vector(x*v[1], x*v[2]) end, __div = function(v, x) return vector(v[1]/x, v[2]/x) end, __unm = function(v) return vector(-v[1], -v[2]) end, __call = function(...) return PP(...) end, __tostring_lua = function(v) return "["..tostring(v[1])..", "..tostring(v[2]).."]" end, __tostring = function(v) return "["..tostring(v[1])..", "..tostring(v[2]).."]" end, __type = "vector", new = function (x, y) return setmetatable({x, y}, Vector) end, -- -- Special methods: __scale = function (v) return Vector(v[1]*150+250, v[2]*-150+175) end, __scale = function (v) return Vector(v[1]*120+250, v[2]*-120+175) end, __scale = function (v) return Vector(v[1]*100+135, v[2]*-100+135) end, __tostring_tcl = function (v) local w = v:__scale(); return w[1].." "..w[2] end, } Vector.__index = Vector setmetatable(Vector, {__call = function(_, x, y) return Vector.new(x, y) end}) gui_now = function (tclcode, noerr) writefile("/tmp/ee.tcmd.tcl", tclcode) local output = getoutput("kill -USR2 $(cat /tmp/ee.tcmd.pid)") if output ~= "" then if noerr then return output else error(output) end end end gui_buffer = {} gui_push = function (tclcode) tinsert(gui_buffer, tclcode) end gui_flush = function (noerr) local err = gui_now(table.concat(gui_buffer, "\n"), noerr) gui_buffer = {} return err end gui = gui_now -- gui = gui_push -- gui_flush() pi = math.pi sqrt = math.sqrt x1 = function (t) return 1 end y1 = function (t) return t end x2 = function (t) return math.cos(t) end y2 = function (t) return math.sin(t) end x3 = function (t) return (t - math.pi)^2 - 1 end y3 = function (t) return -(t - math.pi) end p1 = function (t) return vector(x1(t), y1(t)) end p2 = function (t) return vector(x2(t), y2(t)) end p3 = function (t) return vector(x3(t), y3(t)) end x1_t = function (t) return 0 end y1_t = function (t) return 1 end x2_t = function (t) return -math.sin(t) end y2_t = function (t) return math.cos(t) end x3_t = function (t) return (t - math.pi)*2 end y3_t = function (t) return -1 end p1_t = function (t) return vector(x1_t(t), y1_t(t)) end p2_t = function (t) return vector(x2_t(t), y2_t(t)) end p3_t = function (t) return vector(x3_t(t), y3_t(t)) end tchoose = function (t, f1, f2, f3) if t <= 0 then return f1 end if t < pi then return f2 end return f3 end x123 = function (t) return tchoose(t, x1, x2, x3)(t) end y123 = function (t) return tchoose(t, y1, y2, y3)(t) end p123 = function (t) return tchoose(t, p1, p2, p3)(t) end x123_t = function (t) return tchoose(t, x1_t, x2_t, x3_t)(t) end y123_t = function (t) return tchoose(t, y1_t, y2_t, y3_t)(t) end p123_t = function (t) return tchoose(t, p1_t, p2_t, p3_t)(t) end x = x123 y = y123 p = p123 x_t = x123_t y_t = y123_t p_t = p123_t -- Drawing commands -- (find-man "3tk canvas") -- (find-man "3tk canvas" "\nLINE ITEMS") -- (find-man "3tk canvas" "\nOVAL ITEMS") -- (find-LATEX "diaglib.014" "arrow_objects") clearcommand = ".c delete all" clear = function () gui(clearcommand) end dotradius = Vector(.01, .01) dotoptions = "-fill sienna -outline {}" dotcommand = function (v, opts) return ".c create oval "..tostring(v-dotradius).." "..tostring(v+dotradius).. " "..(opts or dotoptions) end dot = function (v) gui(dotcommand(v)) end lineoptions = "" linecommand = function (vs, opts) return ".c create line "..table.concat(map(tostring, vs), " ").. " "..(opts or lineoptions) end line = function (vs, opts) gui(linecommand(vs, opts)) end arrowoptions = "-arrow last -arrowshape {6 7 2} -width 2 -fill orange" arrowcommand = function (v0, v1, opts) return ".c create line "..tostring(v0).." "..tostring(v1).. " "..(opts or arrowoptions) end arrow = function (v0, v1, opts) gui(arrowcommand(v0, v1, opts)) end arrowv = function (p, v, opts) gui(arrowcommand(p, p+v, opts)) end -- (find-man "3tk canvas") -- (find-LATEX "diaglib.014" "postscript") -- (find-man "3tk canvas") -- (find-man "3tk canvas" "pathName postscript") postscriptcommand = function (v, w, fname) local sv, sw = v:__scale(), w:__scale() local x1, y1 = sv[1], sv[2] local x2, y2 = sw[1], sw[2] local xl, xwid = min(x1, x2), max(x1, x2) - min(x1, x2) local yu, yhei = min(y1, y2), max(y1, y2) - min(y1, y2) return ".c postscript ".. " -x "..xl.. " -y "..yu.. " -width "..xwid.. " -height "..yhei.. " -file "..fname.. " -pageanchor nw" end postscript = function (v, w, fname) print(postscriptcommand(v, w, fname)) gui (postscriptcommand(v, w, fname)) end xminxmaxyminymax = function (x0, x1, y0, y1) if type(x0) ~= "number" then local v, w = x0, x1 x0, x1, y0, y1 = v[1], w[1], v[2], w[2] end return min(x0, x1), max(x0, x1), min(y0, y1), max(y0, y1) end BOUNDS = function (x0, x1, y0, y1) local xmin, xmax, ymin, ymax = xminxmaxyminymax(x0, x1, y0, y1) BOUNDS_v = vector(xmin, ymin) BOUNDS_w = vector(xmax, ymax) BOUNDS_xaxis = {vector(xmin, 0), vector(xmax, 0)} BOUNDS_yaxis = {vector(0, ymin), vector(0, ymax)} end SAVE = function (fname) postscript(BOUNDS_v, BOUNDS_w, fname or "/tmp/o.eps") print("# (find-pspage \""..fname.."\")") end -- (find-anggfile "LUA/lua50init.lua" "seq = function (a, b, c)") append = function (...) local B = {} for _,A in ipairs({...}) do for _,a in ipairs(A) do tinsert(B, a) end end return B end reverse = function (A) local B = {} for i=#A,1,-1 do tinsert(B, A[i]) end return B end ab_as_x0xn = function (a, b, n) local A = {} for i=0,n do tinsert(A, a + (i/n)*(b-a)) end return A end withx = function (f) return function (x) return vector(x, f(x)) end end BOUNDS(-1.5, 3, -2, 1.5) TCL = function () Vector.__tostring = Vector.__tostring_tcl end LUA = function () Vector.__tostring = Vector.__tostring_lua end CLEAR = function () clear() end IMMED = function () gui_flush(); gui = gui_now end BUFFER = function () gui = gui_push end FLUSH = function () gui_flush() end function AXES () -- line({vector(-1.5, 0), vector(3, 0)}) -- line({vector(0, -2), vector(0, 1.5)}) line(BOUNDS_xaxis) line(BOUNDS_yaxis) end function CURVE () for t=-2,0,.05 do dot(p1(t)) end for t=0,pi,pi/60 do dot(p2(t)) end for t=pi,pi+2,.05 do dot(p3(t)) end end function BASE () BUFFER() AXES() CURVE() IMMED() end -- tcmd("setfile fib.lua") -- tcmd('setvars "n = 4\nN = 1"') -- tcmd("setline 5") -- tcmd("setline 6") --[[ * ;; «start-gui» (to ".start-gui") * (eepitch-tcl) * (eepitch-kill) * (find-sh0 "killall tclsh") * (find-sh0 "kill $(cat /tmp/ee.tcmd.pid)") * (eepitch-tcl) * (fvwm-sloppy-focus) source ~/LUA/vectors.tcl * (fvwm-click-to-focus) canvas .c -width 500 -height 350 -relief sunken -borderwidth 2 pack .c -expand yes -fill both -side top .c create line 10 20 30 40 * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) ee_dofile "~/LUA/vectors.lua" TCL() CLEAR() BASE() arrowptt = function (t0, t1) arrow(p(t0), p(t1)) end arrowpt_t = function (t0, t1) arrowv(p(t0), (p(t1)-p(t0))/(t1-t0)) end arrowpt_ = function (t0) arrowv(p(t0), p_t(t0)) end arrowptt(0, 3*pi/6) arrowptt(0, 2*pi/6) arrowptt(0, 1*pi/6) arrowpt_t(0, 3*pi/6) arrowpt_t(0, 2*pi/6) arrowpt_t(0, 1*pi/6) arrowpt_ (0) arrowpt_ (-2) arrowpt_(1*pi/6) arrowpt_(2*pi/6) arrowpt_(3*pi/6) arrowpt_(4*pi/6) arrowpt_(5*pi/6) arrowpt_t(pi, pi+1) arrowpt_t(pi, pi+1/2) arrowpt_ (pi) arrowpt_t(pi+1/2, pi+2) arrowpt_t(pi+1/2, pi+1) arrowpt_ (pi+1/2) arrowpt_ (pi+1) witht = function (f) return function (t) return vector(t, f(t)) end end CLEAR() AXES() BUFFER() for t=-2,0,.05 do dot(witht(x1)(t)) end for t=0,pi,pi/60 do dot(witht(x2)(t)) end for t=pi,pi+2,.05 do dot(witht(x3)(t)) end IMMED() function dots (vs) for _,v in ipairs(vs) do dot(v) end end BUFFER() dots(map(p, seq(-2, pi+2, .05))) IMMED() line(map(p, seq(-2, pi+2, .05))) line(map(p1, seq(-2, pi+2, .05))) line(map(p2, seq(-2, pi+2, .05))) line(map(p3, seq(-2, pi+2, .05))) line(map(witht(x1), seq(-2, pi+2, .05))) line(map(witht(x2), seq(-2, pi+2, .05))) line(map(witht(x3), seq(-2, pi+2, .05))) line(map(p2, seq(-2, pi+2, .05))) line(map(p3, seq(-2, pi+2, .05))) postscript(vector(-1.5, -2), vector(3, 1.5), "/tmp/o.ps") -- (find-pspage "/tmp/o.ps") -- (find-fline "/tmp/o.ps") -- Garbage: LUA() t0, t1 = 0, pi/2 = (p(t1)-p(t0))/(t1-t0) TCL() arrow(p(0), p(3*pi/6)) arrow(p(0), p(2*pi/6)) arrow(p(0), p(1*pi/6)) arrowv(p(0), p_t(0)) arrowv(p(0), (p(3*pi/6)-p(0))) arrowv(p(0), (p(2*pi/6)-p(0))/(pi/6)) arrowv(p(0), (p(1*pi/6)-p(0))) -- Garbage: = pi/60 = Vector(99, 200) = p1(-1) = p1(0) -- gui "canvas .c -width 500 -height 350 -relief sunken -borderwidth 2" -- gui "pack .c -expand yes -fill both -side top" ts = seq(-2, 0, .2) PP(map(p1, ts)) PP(ts) gui ".c create oval 10 20 30 40" gui ".c create oval 10 20 30 40 -fill sienna" gui ".c create oval 10 20 30 40 -fill sienna -outline {}" gui ".c create oval 110.1 120.1 130.1 140.1 -fill sienna -outline {}" dotoptions = "-fill sienna" = dotcommand(p1(0)) dc = dotcommand(p1(0)) = dc gui(dc) for t=-2,0,.1 do print(t) end for t=-2,0,.1 do print(p1(t)) end gui ".c delete all" gui ".c create line 10 20 30 40" dotoptions = "-fill sienna" = vector(2, 3) + vector(4, 5) = vector(2, 3) + 45 = 23 + vector(4, 5) = - vector(4, 5) = vector(2, 3).__type Vector(99, 200) --]] -- Local variables: -- coding: raw-text-unix -- End: