Dear Hans, Thank you for your new code. Frankly speaking, it is hard to follow your code right now because of my little knowledge about these matter. I need some time to understand your code fully, especially lmtx. I’ll do more exercises using your code. Thank you for your concern. Best regards, Dalyoung
2020. 4. 12. 오후 6:44, Hans Hagen
작성: Hi Dal,
Thank you for your nice code. lua.MP.Whatever is something!
just keep in mind that lua.MP is the user namespace and lua.mp (lowercase) the system one
btw, as you're doing math in mp, in lmtx (which has some extra metafun features) we have some more math functions available:
m_acos m_acosh m_asin m_asinh m_atan m_atantwo m_atanh m_cbrt m_ceil m_copysign m_cos m_cosh m_deg m_erf m_erfc m_exp m_exptwo m_expm m_fabs m_fdim m_floor m_fma m_fmax m_fmin m_fmod m_frexp m_gamma m_hypot m_isfinite m_isinf m_isnan m_isnormal m_jz m_j m_jn m_ldexp m_lgamma m_log m_logten m_logp m_logtwo m_logb m_modf m_nearbyint m_nextafter m_pow m_rad m_remainder m_remquo m_round m_scalbn m_sin m_sinh m_sqrt m_tan m_tanh m_tgamma m_trunc m_yz m_y m_yn
c_sin c_cos c_tan c_sinh c_cosh c_tanh c_asin c_acos c_atan c_asinh c_acosh c_atanh c_sqrt c_abs c_arg c_conj c_exp c_log c_proj c_erf c_erfc c_erfcx c_erfi c_imag c_real c_neg c_pow c_add c_sub c_mul c_div c_voigt c_voigt_hwhm c_imag c_real c_neg
these are using the functions in the xmath and xcomplex namespaces that are provided in the lmtx lua interfaces
there's also an xdecimal namespace for using decimal calculations with high precisions but not yet interfaced to the mp end which actually already has decimal anyway
(if some matrix features are needed at the mp end, as extension to the matrix module, then we can explore that as we have ways to pick up data from mp, process it by lua, and pipe it back, which is also pretty efficient by now - not that mp graphics are much of a bottleneck)
Here is an example of a crude interfacve if you need indeed hundreds such exercises
\unexpanded\def\WhateverShape#1#2#3% {$\displaystyle{#1\choose #2} = #3$}
\startluacode local function fact(n) if n <= 0 then return 1 else return n * fact(n - 1) end end
local function whatever(n,r) return fact(n) / (fact(r) * fact(n-r)) end
function MP.lmt_WhateverShape(n,r) mp.quoted([[\WhateverShape{%.0f}{%.0f}{%.0f}]],n,r,whatever(n,r)) end
-- or in latest lmtx: -- -- function MP.lmt_WhateverShape(n,r) -- mp.inject( -- string.format( -- [[\WhateverShape{%.0f}{%.0f}{%.0f}]], -- n, -- r, -- whatever(n,r) -- ) -- ) -- end \stopluacode
\startMPextensions
presetparameters "WhateverShape" [ options = "labels", angle = 30, unit = 2cm, color = "black", ] ;
def WhateverShape = applyparameters "WhateverShape" "lmt_WhateverShape" enddef ;
vardef lmt_WhateverShape = image (
pushparameters "WhateverShape" ;
save u, a, b, dx, n, r ; save A, B, start, now ; pair A, B, start, now ;
u := getparameter "unit" ; a := getparameter "angle" ; b := a + 180 ;
A := u * dir(a) ; B := u * dir(-b) ; dx := u * 2 * cosd(b) ;
draw image ( for n = 0 upto 4 : start := n * A ; for r = 0 upto n : now := start + r * right * dx ; draw (now + A) -- now -- (now + B) ; endfor ; endfor ; ) withcolor getparameter "color" ;
for n = 0 upto 4 : start := n * A ; for r = 0 upto n : now := start + r * right * dx ; if hasoption "options" "labels" : dotlabel.top(textext(lua.MP.lmt_WhateverShape(n,r)),now) ; fi ; endfor; endfor;
popparameters ; ) enddef ;
\stopMPextensions
\starttext
\startMPcode draw WhateverShape [ angle = 30, unit = 1.8cm, color = "darkgreen", ] ; \stopMPcode
\startMPcode draw WhateverShape [ options = "", angle = 40, color = "darkred", unit = 4*BodyFontSize, ] ; \stopMPcode
\stopMPcode
(parameters can be strings, numerics, booleans, pairs, paths, tables, etc)
Hans
----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------