|
|
Ok, since my previous silly question was about piecewise functions
rather than #switch per se (that is, case was supposed to be used to
make function piecewise), I think I'll publish a solution for initial
problem here, although it's not directly related to #switch.
Initially, I wanted piecewise linear function, as most simple to edit.
Resulting solution looks somewhat like this:
#declare scl = function(c, lin, hin, lout, hout) {
(c-lin)/(hin-lin) * (hout-lout) + lout
} // Linear rescale function from lin..hin to lout..hout range
#declare map_4 = function(c) { // Piecewise rescaling example start
(c <= 0.7) * scl(c, 0, 0.7, 0,1) // rescale 0-0.7 to 0-1
+ (c > 0.7 & c <= 0.9) * scl(c, 0.7, 0.9, 1, 0.5) // rescale 0.7-0.9
to 1-0.5
+ (c > 0.9) * scl(c, 0.9, 1, 0.5, 1) // rescale 0.9-1 to 0.5-1
} // Piecewise example end
yes, I managed to overcome my laziness and pack rescaling into separate
scl function with simplified syntaxis.
But later I realized (yes, good ideas always come to me later) that
piecewise interpolation is somewhere in POVRay already. For example, in
splines. After a long attempts to understand what's written in manual I
came up with the following:
#declare interpol = function {
spline {
linear_spline
0.0, <0.0,0,0>
0.7, <1.0,0,0>
0.9, <0.5,0,0>
1.0, <1.0,0,0>
}
}
#declare map_5 = function(c) {interpol(c).u}
and well, map_5 seem to give the same result as map_4 above, while being
much easier to edit.
Surely, all this is too simple and obvious for people here, but well, at
least next time I need interpolation, I can find it in this NG archives :-)
--
Ilyich the Toad
https://dnyarri.github.io/
Post a reply to this message
|
|