TransWikia.com

How to do logarithmic shading with TikZ?

TeX - LaTeX Asked by Tobard on January 5, 2021

Using TikZ, the shade option is very convenient to produce color shadings, but it produces only linear color gradients. Is it possible to obtain other transitions, and especially a logarithmic one?

Thanks!

Edit:

Here is an example for the linear case:

documentclass[border=5mm]{standalone}
usepackage{tikz}
begin{document}


begin{tikzpicture}
shade[left color=black, right color=white] (0,0) rectangle (10,1);
end{tikzpicture}

end{document}

linear shading

One Answer

Here are some examples.

  • R=G=B=x (your MWE)
  • R=G=B=x
  • R=G=B=x²
  • R=G=B=√x
  • R=G=B=log(1+x)
  • R=G=B=log(1+9x)
  • R=G=B= ... well ...

documentclass{article}
usepackage[a3paper]{geometry}
usepackage{tikz}
begin{document}

begin{tikzpicture}
    fill(-11,0)|-(0,-2)|-(11,2)|-cycle;
    shade[left color=black,right color=white](-10,-1)rectangle(10,1);
end{tikzpicture}

pgfdeclarefunctionalshading{LBRW}{pgfpoint{0bp}{0bp}}{pgfpoint{100bp}{100bp}}{}{
    pop 50 div .5 sub % u
    dup dup % u u u
}
begin{tikzpicture}
    fill(-11,0)|-(0,-2)|-(11,2)|-cycle;
    shade[shading=LBRW](-10,-1)rectangle(10,1);
end{tikzpicture}

pgfdeclarefunctionalshading{dup mul LBRW}{pgfpoint{0bp}{0bp}}{pgfpoint{100bp}{100bp}}{}{
    pop 50 div .5 sub % u
    dup mul % u²
    dup dup % u² u² u²
}
begin{tikzpicture}
    fill(-11,0)|-(0,-2)|-(11,2)|-cycle;
    shade[shading=dup mul LBRW](-10,-1)rectangle(10,1);
end{tikzpicture}

pgfdeclarefunctionalshading{sqrt LBRW}{pgfpoint{0bp}{0bp}}{pgfpoint{100bp}{100bp}}{}{
    pop 50 div .5 sub % u
    sqrt % √u
    dup dup % √u √u √u
}
begin{tikzpicture}
    fill(-11,0)|-(0,-2)|-(11,2)|-cycle;
    shade[shading=sqrt LBRW](-10,-1)rectangle(10,1);
end{tikzpicture}

pgfdeclarefunctionalshading{1 add log LBRW}{pgfpoint{0bp}{0bp}}{pgfpoint{100bp}{100bp}}{}{
    pop 50 div .5 sub % u
    1 add log % ㏒(1+u)
    dup dup % ㏒(1+u) ㏒(1+u) ㏒(1+u)
}
begin{tikzpicture}
    fill(-11,0)|-(0,-2)|-(11,2)|-cycle;
    shade[shading=1 add log LBRW](-10,-1)rectangle(10,1);
end{tikzpicture}

pgfdeclarefunctionalshading{9 mul 1 add log LBRW}{pgfpoint{0bp}{0bp}}{pgfpoint{100bp}{100bp}}{}{
    pop 50 div .5 sub % u
    9 mul 1 add log % ㏒(1+9u)
    dup dup % ㏒(1+9u) ㏒(1+9u) ㏒(1+9u)
}
begin{tikzpicture}
    fill(-11,0)|-(0,-2)|-(11,2)|-cycle;
    shade[shading=9 mul 1 add log LBRW](-10,-1)rectangle(10,1);
end{tikzpicture}

pgfdeclarefunctionalshading{logistic}{pgfpoint{0bp}{0bp}}{pgfpoint{100bp}{100bp}}{}{
    50 div .5 sub exch % v U
    50 div .5 sub 4 mul exch % 4u v
    dup 1 exch sub % 4u v 1-v
    2 index % 4u v (1-v) 4u
    mul mul % u 4uv(1-v)
    dup 1 exch sub 2 index mul mul
    dup 1 exch sub 2 index mul mul
    dup 1 exch sub 2 index mul mul
    dup 1 exch sub 2 index mul mul
    dup 1 exch sub 2 index mul mul
    exch pop dup dup
}
begin{tikzpicture}
    fill(-11,0)|-(0,-2)|-(11,2)|-cycle;
    shade[shading=logistic](-10,-1)rectangle(10,1);
end{tikzpicture}

end{document}

Remarks

  • dup duplicates the topmost element.
  • The dup dup at every very end is actually unnecessary.
  • If you leave only a single number in the stack, PDF-renderer will treat it as the grayscale.
  • If there are three, they are R, G, B respectively.
  • If there are 0 or 2 or 4, 5, 6, ... I do not know.
  • pop discards the topmost element.
  • The pop at every very beginning throws away the y-coordinate, which is useless except the last case.
  • Replacing pop by swap, you can leave the y-coordinate at the bottom alone. But then dup dup becomes necessary.
  • For more information, see TikZ manual IX.110.2.3 General (Functional) Shadings.
  • For ever more information, see PDF manual 8.7.4.5.2 Type 1 (Function-Based) Shadings.
  • See also Annex B (normative) Operators in Type 4 Functions.

Correct answer by Symbol 1 on January 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP