|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- This file:
-- http://angg.twu.net/LATEX/edrxtikz.lua
-- http://angg.twu.net/LATEX/edrxtikz.lua.html
-- (find-angg "LATEX/edrxtikz.lua")
--
-- This is a mess.
-- Version: 2021feb08
-- «.Line» (to "Line")
-- «.Line-test» (to "Line-test")
-- «.Ellipse» (to "Ellipse")
-- «.Ellipse-test» (to "Ellipse-test")
-- «.Hyperbole» (to "Hyperbole")
-- «.Hyperbole-test» (to "Hyperbole-test")
-- «.Hyperbole.fromOxe» (to "Hyperbole.fromOxe")
-- «.Parabola» (to "Parabola")
-- «.Parabola-test» (to "Parabola-test")
-- «.drawdots0» (to "drawdots0")
loaddednat6("dednat6/") -- (find-angg "LUA/lua50init.lua" "loaddednat6")
seqndraw = function (a, b, n, f, sep)
local A = {}
for i=0,n do table.insert(A, tostring(f(a + (b-a)*(i/n)))) end
return table.concat(A, sep or " -- ")
end
-- (find-dn6 "picture.lua" "V")
-- Add several methods for Analytic Geometry to the class V.
V.__div = function (v, k) return v*(1/k) end
V.__index.proj = function (u, v) return ((u*v)/(u*u))*u end
V.__index.tow = function (A, B, t) return A+(B-A)*t end -- towards
V.__index.mid = function (A, B) return A+(B-A)*0.5 end -- midpoint
V.__index.norm = function (v) return math.sqrt(v[1]*v[1] + v[2]*v[2]) end
V.__index.rotleft = function (vv) return v(-vv[2], vv[1]) end -- 90 degrees
V.__index.rotright = function (vv) return v(vv[2], -vv[1]) end -- 90 degrees
V.__index.unit = function (v, len) -- unitarize (and multiply by len)
return v*((len or 1)/v:norm())
end
V.__index.rot = function (v, angle) -- rotate left angle degrees
local c, s = math.cos(math.rad(angle)), math.sin(math.rad(angle))
return v*c + v:rotleft()*s
end
-- (find-dn6 "output.lua" "formatt")
-- _ _
-- | | (_)_ __ ___
-- | | | | '_ \ / _ \
-- | |___| | | | | __/
-- |_____|_|_| |_|\___|
--
-- «Line» (to ".Line")
-- Parametrized lines.
Line = Class {
new = function (A, v, mint, maxt)
return Line {A=A, v=v, mint=mint, maxt=maxt}
end,
newAB = function (A, B, mint, maxt) return Line.new(A, B-A, mint, maxt) end,
type = "Line",
__tostring = function (li) return li:tostring() end,
__index = {
t = function (li, t) return li.A + t * li.v end,
draw = function (li) return formatt("%s -- %s", li:t(li.mint), li:t(li.maxt)) end,
tostring = function (li) return formatt("%s + t%s", li.A, li.v) end,
proj = function (li, P) return li.A + li.v:proj(P - li.A) end,
sym = function (li, P) return P + 2*(li:proj(P) - P) end,
--
pict = function (li) return formatt("\\Line%s%s", li:t(li.mint), li:t(li.maxt)) end,
--
-- (find-dn6 "picture.lua" "pict2e" "pict2evector =")
pictv = function (li)
local x0,y0 = li:t(li.mint):to_x_y()
local x1,y1 = li:t(li.maxt):to_x_y()
return pict2evector(x0, y0, x1, y1)
end,
},
}
-- «Line-test» (to ".Line-test")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxtikz.lua"
r = Line.new(v(0, 1), v(3, 2), -1, 2)
= r
= r:t(0)
= r:t(0.1)
= r:t(1)
= r:draw()
= r:pict()
= r:proj(v(0, 1))
= r:proj(v(-2, 4))
= r:sym(v(0, 1))
= r:sym(v(-2, 4))
--]]
-- _____ _ _ _
-- | ____| | (_)_ __ ___ ___
-- | _| | | | | '_ \/ __|/ _ \
-- | |___| | | | |_) \__ \ __/
-- |_____|_|_|_| .__/|___/\___|
-- |_|
--
-- «Ellipse» (to ".Ellipse")
Ellipse = Class {
type = "Ellipse",
new = function (C0, u, v) return Ellipse {C0=C0, u=u, v=v} end,
newcircle = function (C0, R) return Ellipse {C0=C0, u=v(R, 0), v=v(0, R), R=R} end,
__tostring = function (e) return e:tostring() end,
__index = {
tostring = function (e)
return format("%s + c%s + s%s", tostring(e.C0), tostring(e.u), tostring(e.v))
end,
rad = function (e, rads)
local c, s = math.cos(rads), math.sin(rads)
return e.C0 + c*e.u + s*e.v
end,
deg = function (e, degs) return e:rad(math.rad(degs)) end,
draw = function (e, n)
return seqndraw(0, 2*math.pi, n or 40, function (rads) return e:rad(rads) end)
end,
--
points = function (e, n, a, b)
local F = function (t) return e:deg(t) end
return Points.fromFt(a or 0, b or 360, n or 24, F)
end,
pict = function (e, n, a, b) return e:points(n, a, b):line() end,
},
}
-- «Ellipse-test» (to ".Ellipse-test")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxtikz.lua"
e = Ellipse.new(v(2,3), v(4,0), v(0,5))
PP(e)
= e
= e:deg(0)
= e:deg(90)
= e:deg(180)
= e:draw(4)
= e:draw()
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxpict.lua"
e = Ellipse.new(v(2,3), v(4,0), v(0,5))
= e:points()
= e:pict()
--]]
-- _ _ _ _
-- | | | |_ _ _ __ ___ _ __| |__ ___ | | ___
-- | |_| | | | | '_ \ / _ \ '__| '_ \ / _ \| |/ _ \
-- | _ | |_| | |_) | __/ | | |_) | (_) | | __/
-- |_| |_|\__, | .__/ \___|_| |_.__/ \___/|_|\___|
-- |___/|_|
--
-- «Hyperbole» (to ".Hyperbole")
Hyperbole = Class {
type = "Hyperbole",
new = function (H0, u, v, maxt) return Hyperbole {H0=H0, u=u, v=v, maxt=maxt} end,
__tostring = function (h) return h:tostring() end,
__index = {
tostring = function (h)
return formatt("%s + t%s + (1/t)%s", h.H0, h.u, h.v)
end,
t = function (h, t)
return h.H0 + t*h.u + (1/t)*h.v
end,
draw = function (h, n)
n = n or 5
local f = function (t) return h:t(t) end
local g = function (t) return h:t(1/t) end
local part1 = seqndraw(-h.maxt, -1, n, f)
local part2 = seqndraw(-h.maxt, -1, n, g)
local part3 = seqndraw(1, h.maxt, n, g)
local part4 = seqndraw(1, h.maxt, n, f)
PP(part1, part2, part3, part4)
return format("%s %s %s %s", part1, part2, part3, part4)
end,
drawau = function (h, a, b)
return formatt("%s -- %s", h.H0 + a*h.u, h.H0 + b*h.u)
end,
drawav = function (h, a, b)
return formatt("%s -- %s", h.H0 + a*h.v, h.H0 + b*h.v)
end,
--
points = function (h, n, t1, t2)
local F = function (ti) return h:t(ti) end
return Points.fromFt(t1, t2, n, F)
end,
pict = function (h, n, t1, t2, t3, t4)
return h:points(n, t1, t2):line().."\n"..h:points(n, t3, t4):line()
end,
},
}
-- «Hyperbole-test» (to ".Hyperbole-test")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxtikz.lua"
h = Hyperbole.new(v(0,0), v(1,0), v(0,1), 4)
= h:t(1)
= h:t(2)
= h:draw(3)
= h
= h:drawau(-2, 2)
= h:drawav(-2, 2)
--]]
-- «Hyperbole.fromOxe» (to ".Hyperbole.fromOxe")
Hyperbole.fromOxe = function (O, xx, e, maxt)
local yy = xx:rotleft()
local ee = e*e - 1
local es = math.sqrt(e*e - 1)
local a = xx:norm()/2
local b = es * a
local c = e * a
local u = a*xx - b*yy
local v = a*xx + b*yy
local P1, P2 = O - xx, O + xx
local F1, F2 = O - e*xx, O + e*xx
local D1, D2 = O - xx/e, O + xx/e
local P3, P4 = F1 + ee*yy, F2 + ee*yy
local P5, P6 = F1 - ee*yy, F2 - ee*yy
local D0 = O
local d0 = Line.new(D0, yy, -maxt, maxt)
local d1 = Line.new(D1, yy, -maxt, maxt)
local d2 = Line.new(D2, yy, -maxt, maxt)
local au = Line.new( O, u, -maxt, maxt)
local av = Line.new( O, v, -maxt, maxt)
local data = {O=O, xx=xx, yy=yy, e=e, a=a, b=b, c=c, u=u, v=v,
F1=F1, F2=F2, P1=P1, P2=P2, P3=P3, P4=P4, P5=P5, P6=P6,
D0=D0, D1=D1, D2=D2, d0=d0, d1=d1, d2=d2, au=au, av=av,
H0=O, maxt=maxt}
return Hyperbole(data)
end
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxtikz.lua"
H = Hyperbole.fromOxe(v(0,0), v(1,0), 2, 4)
H = Hyperbole.fromOxe(v(0,0), v(1,0), 3, 6)
PP(H)
--]]
-- ____ _ _
-- | _ \ __ _ _ __ __ _| |__ ___ | | __ _
-- | |_) / _` | '__/ _` | '_ \ / _ \| |/ _` |
-- | __/ (_| | | | (_| | |_) | (_) | | (_| |
-- |_| \__,_|_| \__,_|_.__/ \___/|_|\__,_|
--
-- «Parabola» (to ".Parabola")
Parabola = Class {
type = "Parabola",
new = function (P0, u, v, maxt) return Parabola {P0=P0, u=u, v=v, maxt=maxt} end,
__tostring = function (p) return p:tostring() end,
__index = {
tostring = function (p)
return formatt("%s + t%s + t^2%s", p.P0, p.u, p.v)
end,
t = function (p, t)
return p.P0 + t*p.u + t*t*p.v
end,
draw = function (p, n)
return seqndraw(-p.maxt, p.maxt, n or 10, function (t) return p:t(t) end)
end,
--
points = function (p, n, t1, t2)
local F = function (ti) return p:t(ti) end
return Points.fromFt(t1, t2, n, F)
end,
pict = function (p, n, t1, t2)
return p:points(n, t1, t2):line()
end,
},
}
-- «Parabola-test» (to ".Parabola-test")
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxtikz.lua"
p = Parabola.new(v(0,0), v(1,0), v(0,1), 3)
= p:t(0)
= p:t(1)
= p:t(2)
= p:draw(6)
= p
--]]
-- _ _ _ ___
-- __| |_ __ __ ___ ____| | ___ | |_ ___ / _ \
-- / _` | '__/ _` \ \ /\ / / _` |/ _ \| __/ __| | | |
-- | (_| | | | (_| |\ V V / (_| | (_) | |_\__ \ |_| |
-- \__,_|_| \__,_| \_/\_/ \__,_|\___/ \__|___/\___/
--
-- «drawdots0» (to ".drawdots0")
-- (find-LATEXfile "2015-2-C2-material.tex" "drawdots")
drawdots0 = function (str)
local str0 = str:gsub("(%b())[oc]", "%1")
local str1 = "\\draw[mycurve] "..str0..";\n"
local str2 = ""
for a,b in str:gmatch("(%b())([oc])") do
str2 = str2 .. format("\\node at %s [%s] {};\n", a, b=="o" and "opdot" or "cldot")
end
return str1..str2
end
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxtikz.lua"
= drawdots0 " (1,2)o -- (2,3)c -- (3,3) "
--]]
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "edrxtikz.lua"
--]]
-- Local Variables:
-- coding: raw-text-unix
-- End: