带点颜色的 Tikz 三角形

带点颜色的 Tikz 三角形

如何在 tikz 中使用“点颜色”绘制三角形,以便三角形中的每个点都根据角的加权(按距离)平均颜色进行着色。

答案1

我觉得其他答案可能有点过于复杂了!如果你想要三角形精确的那么它们可能是最好的选择。但如果你想要看起来差不多的东西,那么有一个更简单的方法,使用普通的衰落。

编辑中添加:我对此进行了一些更新,试图纠正颜色偏差。红色现在是正确的绿色/蓝色是相对正确也就是说,三角形底部的绿色和蓝色是正确的,但当你沿着边向上移动时,一些蓝色会与绿色混合,反之亦然。然而,在它变得太明显之前,红色会淹没整个图片,所以它实际上非常接近真实的东西。)

结果如下:

TikZ 中的 RGB 三角形

代码如下:

\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}

Adobe 中的结果

PGF手册有一个警告:

这些着色是最不便携的,它们给渲染器带来最重的负担。它们很慢,而且可能无法正确打印!

事实上,Evince(可能还有大多数 Linux pdf 查看器)将上述文档呈现为

导致 Evince


我一直在研究这个问题。最可移植的解决方案似乎是 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

相关内容