POV-Ray : Newsgroups : povray.general : #switch #case in function? : Using splines to map arbitrary value (was Re: #switch #case in function?) Server Time18 Jul 2024 08:07:00 EDT (-0400)
 Using splines to map arbitrary value (was Re: #switch #case in function?)
 From: Ilya Razmanov Date: 17 Jun 2024 23:27:05 Message: <6670fe89\$1@news.povray.org>
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#6670fe89%241%40news.povray.org",
"headline": "Using splines to map arbitrary value (was Re: #switch #case in function?)",
"dateCreated": "2024-06-18T03:27:05+00:00",
"datePublished": "2024-06-18T03:27:05+00:00",
"author": {
"@type": "Person",
"name": "Ilya Razmanov"
}
}
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 :-)

--