Dear list,
> Am 01.09.2021 um 09:54 schrieb Jacob Kauffmann via ntg-context
> :
> - 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.0 +0200
+++ mlib-cnt.lmt2022-06-20 18:26:22.0 +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 : ntg-context@ntg.nl / 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
___