Dear list, > Am 01.09.2021 um 09:54 schrieb Jacob Kauffmann via ntg-context > <[email protected]>: > - color by value in lmt_surface > We want to show a surface plot of a function where the color indicates the > function value (instead, or in addition to a light source). > The easiest would be to have variable cf for the brightness factor (as it > is), and in addition variables such as zt, minz, maxz, akin to the color > formatter for lmt_contour. > This becomes handy when colors are to be aligned with function values (e.g. > negative = blue, zero = white, positive = red, see MWE attached).
I managed to achieve this by tweaking f_color and mp.lmt_surface_do in
mlib-cnt.lmt in
ConTeXt ver: 2022.05.11 11:36 LMTX fmt: 2022.6.20
a bit.
Please find the diff and a MWE attached.
Cheers,
Jacob Kauffmann
--- context/tex/texmf-context/tex/context/base/mkxl/mlib-cnt.lmt 2022-06-20
18:11:51.000000000 +0200
+++ mlib-cnt.lmt 2022-06-20 18:26:22.000000000 +0200
@@ -1839,7 +1839,29 @@
local f_color = formatters [ [[
local math = math
- return function(f)
+ local min = math.min
+ local max = math.max
+ local abs = math.abs
+ local minz = %s
+ local maxz = %s
+
+ local color_value = 0
+ local color_step = mp.lmt_color_functions.step
+ local color_shade = mp.lmt_color_functions.shade
+
+ local function step(...)
+ return color_step(color_value,n,...)
+ end
+ local function shade(...)
+ return color_shade(color_value,n,...)
+ end
+ -- local function lin(l)
+ -- return l/n
+ -- end
+ %s
+ return function(z, f)
+ function_value = z
+ brightness_factor = f
return %s
end
]] ]
@@ -1898,7 +1920,7 @@
local dy = (ymax - ymin) / ny
local xt = xmin
--
- local minf, maxf
+ local minf, maxf, minz, maxz
--
-- similar as contours but no data loop here
--
@@ -1908,12 +1930,6 @@
return false -- fatal error
end
--
- local ccode = load(f_color(colorcode))
- local color = type(ccode) == "function" and ccode()
- if type(color) ~= "function" then
- return false -- fatal error
- end
- --
for i=0,nx do
local yt = ymin
for j=0,ny do
@@ -1946,7 +1962,16 @@
maxf = fac
end
--
- data[i][j] = { x, y, fac }
+ if not minz then
+ minz = z
+ maxz = z
+ elseif z < minz then
+ minz = z
+ elseif z > maxz then
+ maxz = z
+ end
+ --
+ data[i][j] = { x, y, fac, z }
--
yt = yt + dy
end
@@ -1957,6 +1982,16 @@
local range = maxf - minf
local cl = linecolor or 1
local enforce = attributes.colors.model == "cmyk"
+ --
+ -- local ccode = load(f_color(colorcode))
+ report("minz, maxz is (%s,%s)",minz,maxz)
+ report("colorcode is %s", colorcode)
+ local ccode = load(f_color(minz, maxz, preamble, colorcode))
+ local color = type(ccode) == "function" and ccode()
+ if type(color) ~= "function" then
+ return false -- fatal error
+ end
+ --
for i=0,nx-1 do
for j=0,ny-1 do
-- points
@@ -1985,12 +2020,13 @@
local z32 = z3[2]
local z41 = z4[1]
local z42 = z4[2]
+ local zout = z1[4]
-- if lines then
-- -- fill first and draw then, previous shapes can be covered
-- else
-- -- fill and draw in one go to prevent artifacts
-- end
- local cr, cg, cb = color(cf)
+ local cr, cg, cb = color(zout, cf)
if not cr then cr = 0 end
if not cg then cg = 0 end
if not cb then cb = 0 end
colors_and_surface_in_luametafun.pdf
Description: Adobe PDF document
colors_and_surface_in_luametafun.tex
Description: Binary data
signature.asc
Description: Message signed with OpenPGP
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : [email protected] / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________
