From: Jacob Kauffmann via ntg-context <ntg-context@ntg.nl>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Cc: Jacob Kauffmann <jacobkauffmann@me.com>
Subject: Re: colors and contours in luametafun
Date: Mon, 20 Jun 2022 18:29:24 +0200 [thread overview]
Message-ID: <56FEA87E-42D4-495D-96E8-4E29C071F5BF@me.com> (raw)
In-Reply-To: <B2D41A73-7355-45DB-AA59-45D7E2326760@me.com>
[-- Attachment #1.1.1: Type: text/plain, Size: 3960 bytes --]
Dear list,
> Am 01.09.2021 um 09:54 schrieb Jacob Kauffmann via ntg-context <ntg-context@ntg.nl>:
> - 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
[-- Attachment #1.1.2: colors_and_surface_in_luametafun.pdf --]
[-- Type: application/pdf, Size: 17337 bytes --]
[-- Attachment #1.1.3: Type: text/plain, Size: 1 bytes --]
[-- Attachment #1.1.4: colors_and_surface_in_luametafun.tex --]
[-- Type: application/octet-stream, Size: 795 bytes --]
\starttext
\setupMPpage[
offset=10pt,
instance=doublefun]
\startluacode
-- function used in the examples
function fun(x,y)
local exp = math.exp
return 1.5*exp(-1.5*((x + 1.1)^2 + (y - 1.1)^2))
+ 0.5*exp(-1.0*((x + 1)^2 + (y + 1)^2))
- 0.5*exp(-0.9*((x - 1)^2 + (y - 0)^2))
end
-- example of a simple blue-gray-red colormap
function colormap(f)
local abs, min = math.abs, math.min
local r, g, b = min(1, 2*f), 1-2*abs(f-.5), min(1,2-2*f)
return .85*r, .85*g, .85*b
end
\stopluacode
\startMPpage
draw lmt_surface [
code = "fun(x,y)",
color = "colormap( 0.5 * z / max(abs(minz),abs(maxz)) + 0.5 )",
% color = "colormap(f)",
xmin = -3,
xmax = 3,
ymin = -3,
ymax = 3,
xstep = .3,
ystep = .3,
xvector = { -0.3, -0.5 },
linecolor = 0
] xsized 10cm;
\stopMPpage
\stoptext
[-- Attachment #1.2: Message signed with OpenPGP --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
[-- Attachment #2: Type: text/plain, Size: 493 bytes --]
___________________________________________________________________________________
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
___________________________________________________________________________________
next prev parent reply other threads:[~2022-06-20 16:29 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-01 7:54 Jacob Kauffmann via ntg-context
2022-06-20 16:29 ` Jacob Kauffmann via ntg-context [this message]
2022-06-23 15:38 ` Hans Hagen via ntg-context
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56FEA87E-42D4-495D-96E8-4E29C071F5BF@me.com \
--to=ntg-context@ntg.nl \
--cc=jacobkauffmann@me.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).