如何在 tikz 中使用“点颜色”绘制三角形,以便三角形中的每个点都根据角的加权(按距离)平均颜色进行着色。
答案1
我觉得其他答案可能有点过于复杂了!如果你想要三角形精确的那么它们可能是最好的选择。但如果你想要看起来差不多的东西,那么有一个更简单的方法,使用普通的衰落。
(编辑中添加:我对此进行了一些更新,试图纠正颜色偏差。红色现在是正确的绿色/蓝色是相对正确也就是说,三角形底部的绿色和蓝色是正确的,但当你沿着边向上移动时,一些蓝色会与绿色混合,反之亦然。然而,在它变得太明显之前,红色会淹没整个图片,所以它实际上非常接近真实的东西。)
结果如下:
代码如下:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fadings}
\begin{document}
\begin{tikzpicture}
\fill[green] (90:4) -- (210:4) -- (-30:4) -- cycle;
\fill[blue,path fading=west] (90:4) -- (210:4) -- (-30:4) -- cycle;
\fill[red,path fading=south] (90:4) -- (210:4) -- (-30:4) -- cycle;
\end{tikzpicture}
\end{document}
答案2
PGF 提供功能性阴影。以下是通过从笛卡尔坐标计算等边三角形的重心坐标(参见维基百科) 并将其用作 RGB 颜色。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shadings}
\begin{document}
\begin{tikzpicture}
\pgfdeclarefunctionalshading{rgbtriangle}
{\pgfpointorigin}{\pgfpoint{100bp}{86.60bp}}{}{
% y coordinate is on top of the stack, x below it
% divide both by 100 to get numbers in [0,1]
100 div exch 100 div exch
% save a copy of the coordinates
2 copy
% calculate red amount
0.5774 mul add neg 1 add
% bring copy of the coordinates to the top
3 1 roll
% calculate green amount
0.5774 mul neg add
% calculate blue as (1-red-green)
2 copy
add 1 sub neg
}
\clip[shift={(-50bp,{-25bp*sqrt(3)})}] (0,0) -- (50bp,{50bp*sqrt(3)}) -- (100bp,0) -- cycle;
\pgfuseshading{rgbtriangle}
\end{tikzpicture}
\end{document}
PGF手册有一个警告:
这些着色是最不便携的,它们给渲染器带来最重的负担。它们很慢,而且可能无法正确打印!
事实上,Evince(可能还有大多数 Linux pdf 查看器)将上述文档呈现为
我一直在研究这个问题。最可移植的解决方案似乎是 Altermundus 的解决方案。这里它被封装成一个宏,并进行了一些优化
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
% arguments:
% number of subdivision (optional)
% side length
\newcommand\colortriangle[2][50]{
\begin{scope}[shift={({-#2/2},{-sqrt(3)/6*#2})}]
\coordinate(A) at (0, 0);
\coordinate(B) at (#2, 0);
\coordinate(C) at (60:#2);
\clip (A) -- (B) -- (C) -- cycle;
\pgfmathsetmacro\delta{1/#1}
\pgfmathsetmacro\r{\delta*1.2*#2}
\edef\r{\r pt}
\foreach \x in {0,\delta,...,1} {
\pgfmathsetmacro\t{1-\x}
\foreach \y in {0,\delta,...,\t} {
\pgfmathsetmacro\z{1-\x-\y}
\definecolor{mycolor}{rgb}{\x, \y, \z}
\coordinate (mypoint) at (barycentric cs:A=\x,B=\y,C=\z);
\path[fill=mycolor] (mypoint) rectangle ($(mypoint)+(\r,\r)$);
}
}
\end{scope}
}
\begin{tikzpicture}
\colortriangle[40]{4cm}
\end{tikzpicture}
\end{document}
对于足够小的多次细分,三角形看起来还算平滑,应该可以在大多数 PDF 查看器中正确呈现。但是,它确实绘制了 O(subdivisions²) 个矩形,并且编译时间也相应地延长。因此,您可能需要使用 TikZ 的外部化库。上述示例在我的计算机上编译大约需要 2.9 秒,并生成
答案3
我完全知道这篇文章已经很老了。
然而,由于列夫·毕晓普如果 TikZ 支持“PDF 类型 4 阴影(自由形式 Gouraud 阴影三角形网格)”,这将非常简单,我想添加一个匹配的示例。
pgfplots
可以生成 4 类阴影,并且自 1.8 版以来,它可以为颜色图和显式颜色生成阴影(后者是在pgfplots:使用任意 RGB 颜色对(3D)曲面进行着色)。
这是具有明确颜色顶点的 4 型着色:
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[title=RGB shading]
\addplot[
patch,
shader=interp,
mesh/color input=explicit,
data cs=polar,
]
coordinates {
(90,4) [color=red]
(210,4) [color=green]
(-30,4) [color=blue]
};
\end{axis}
\end{tikzpicture}
\end{document}
上例是patch
带有插值阴影的绘图。由于 ,坐标以极坐标表示data cs=polar
。
此示例可轻松推广到多个三角形(或其他基本形状,如矩形或贝塞尔形状)。以下是使用不同颜色说明符的示例,结果为三个三角形面片:
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[minor x tick num=1]
\addplot[
patch,
shader=interp,
mesh/color input=explicit,
]
table[meta=c] {
x y c
0 0 color=green
% default color model is rgb:
1 1 1,0,0
2 0 1,1,0
1.5 1 cmyk=1,0,0,0
2.5 0 gray=0.5
3.5 1 color=red!80!black
3 0 1,0,1
4 1 0,0,1
5 0 rgb255=0,128,128
};
\end{axis}
\end{tikzpicture}
\end{document}
最后,这种阴影有时非常有用,如果你有标量映射到的颜色值colormap
。在这种情况下,最小标量值获得颜色图的第一个颜色,最大标量值获得最后一个颜色。其他所有内容都相应地进行插值。颜色图通常有多种参与的颜色。以下是一个例子:
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[title=RGB shading with colormap,colorbar]
\addplot[
patch,
shader=interp,
point meta=explicit,
data cs=polar,
]
coordinates {
(90,4) [0]
(210,4) [1]
(-30,4) [2]
};
\end{axis}
\end{tikzpicture}
\end{document}
最后一个例子非常清楚地表明三角插值是线性的。
答案4
获得 Gouraud 阴影三角形的另一种方法
tri.asy
::
size(400);
pen[] p={red,green,blue};
pair[] z={(0,1),rotate(120)*(0,1),rotate(-120)*(0,1)};
int[] edges={0,1,2};
gouraudshade(z[0]--z[1]--z[2]--cycle,p,z,edges);
要获得独立版本tri.pdf
,请运行asy -f pdf tri.asy
。
编辑(由 Andrew Stacey 建议):这asy
是调用的命令Asymptote
。