diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua b/Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua new file mode 100644 index 00000000000..28fd6ddd56b --- /dev/null +++ b/Master/texmf-dist/tex/generic/pgfplots/lua/pgfplots/colormap.lua @@ -0,0 +1,98 @@ +-- +-- This file contains parts of pgfplotscolormap.code.tex +-- + +local math=math +local pgfplotsmath = pgfplots.pgfplotsmath +local io=io +local type=type +local tostring=tostring +local error=error +local table=table + +do +-- all globals will be read from/defined in pgfplots: +local _ENV = pgfplots +----------------------------------- + +ColorSpace = newClass() +function ColorSpace:constructor(numComponents) + self.numComponents=numComponents +end + +rgb = ColorSpace.new(3) +cmyk = ColorSpace.new(4) +gray = ColorSpace.new(1) + + +ColorMap = newClass() + +ColorMap.range =1000 + +-- h: mesh width between adjacent values +-- colorspace: an instance of ColorSpace +-- values: an array (1-based table) with color components. Each color component is supposed to be a table with K entries where K is colorspace:numComponents +function ColorMap:constructor( h, colorspace, values) + if not h or not colorspace or not values then error("arguments must not be nil")end + + self.name = name + self.h = h + self.invh = 1/h + self.colorspace = colorspace + self.values = values + + local numComponents = self.colorspace.numComponents + for i = 1,#self.values do + local value = self.values[i] + if #value ~= numComponents then + error("Some value has an unexpected number of color components, expected " .. self.colorspace.numComponents .. " but was ".. #value); + end + end +end + +function ColorMap:findPrecomputed(inMin, inMax, x) + local transformed + if inMin == 0 and inMax == ColorMap.range then + transformed = x + else + local scale = ColorMap.range / (inMax - inMin) + + transformed = (x - inMin) * scale + end + transformed = math.max(0, transformed) + transformed = math.min(ColorMap.range, transformed) + + local divh = transformed * self.invh + local intervalno = math.floor(divh) + local factor = divh - intervalno + local factor_two = 1-factor + + + -- Step 2: interpolate the desired RGB value using vector valued interpolation on the identified interval + if intervalno+1 == #self.values then + -- ah- we are at the right end! + return self.values[#self.values] + end + + local left = self.values[intervalno+1] + local right = self.values[intervalno+2] + if not left or not right then error("Internal error: the color map does not have enough values for interval no " .. intervalno )end + + local result = {} + for i = 1,self.colorspace.numComponents do + local result_i = factor_two * left[i] + factor * right[i] + + result[i] = result_i + end + + return result +end + +----------------------------------- + +-- global registry of all colormaps. +-- Key: colormap name +-- Value: an instance of ColorMap +ColorMaps = {} + +end |