填充一定比例的正多边形

填充一定比例的正多边形

我想用颜色填充一个多边形。首先,应该将 n 个多边形分成 n 个相等的部分。我发现了一个类似的问题: 绘制多边形 @Yori 的解决方案几乎就是我想要的。所以我希望例如 8 多边形中的 1、3、5 部分是彩色的,或者 13 多边形中的 2、3、4、5、9 部分是彩色的。

要调整的代码(不是我的)可能是:

 \documentclass{standalone}
 \usepackage{tikz}
  \newcommand\polygon[2][]{
  \pgfmathsetmacro{\angle}{360/#2}
\pgfmathsetmacro{\startangle}{-90 + \angle/2}
\pgfmathsetmacro{\y}{cos(\angle/2)}
\begin{scope}[#1]
 \foreach \i in {1,2,...,#2} {
  \pgfmathsetmacro{\x}{\startangle + \angle*\i}
  \draw[fill=blue!35] (0, 0) -- (\x:1 cm) -- (\x + \angle/2:\y cm) -- cycle;
  \draw[fill=blue!50] (0, 0) -- (\x + \angle/2:\y cm) -- (\x + \angle:1 cm) -- cycle;
}
\end{scope}
}

\begin{document}
\begin{tikzpicture}
\polygon{5}
\polygon[xshift=2.2cm]{6}
 \polygon[xshift=4.4cm]{7}
 \polygon[xshift=6.6cm]{8}
 \end{tikzpicture}
  \end{document}

(学生必须按百分比计算出哪部分是彩色的)

答案1

我迟到了(问题已经回答了),但我采用了不同的方法,这在其他场景中也许有用(对于这个,汤姆的回答更简单,更好)。

我的方法是定义一组名为color1color2等的颜色,其数量最多colorNN多边形角数的两倍。这些颜色代表应用于每个三角形的颜色。最初所有颜色都定义为相同,但随后其中一些颜色(要以不同方式填充的颜色)被重新定义。这允许在一个简单的循环中绘制整个多边形,一次绘制一个三角形,使用fill=colorX,作为X该三角形的编号。

代码:

\documentclass{standalone}
\usepackage{tikz}
\usepackage{xcolor}

\globalcolorstrue

\newcommand\polygon[5][]{
\pgfmathtruncatemacro{\x}{2*#2}
\foreach \c in {0,1,...,\x}{
  \colorlet{color\c}{#3}
 }
 \foreach \c in {#4} {
    \colorlet{color\c}{#5}
 }
\pgfmathsetmacro{\angle}{360/#2}
\pgfmathsetmacro{\startangle}{-90 + \angle/2}
\pgfmathsetmacro{\y}{cos(\angle/2)}
\begin{scope}[#1]
 \foreach \i in {1,2,...,#2} {
  \pgfmathsetmacro{\x}{\startangle + \angle*\i}
  \pgfmathtruncatemacro{\colorA}{\i*2}
  \pgfmathtruncatemacro{\colorB}{\i*2-1}
  \draw[fill=color\colorB] (0, 0) -- (\x:1 cm) -- (\x + \angle/2:\y cm) -- cycle;
  \draw[fill=color\colorA] (0, 0) -- (\x + \angle/2:\y cm) -- (\x + \angle:1 cm) -- cycle;
}
\end{scope}
}

\begin{document}
\begin{tikzpicture}
\polygon{5}{blue!20}{1,...,5}{blue!60}
\polygon[xshift=2.2cm]{6}{red!20}{7,8,9}{red}
\polygon[xshift=4.4cm]{7}{green!20}{5,6,...,12}{green}
\polygon[xshift=6.6cm]{8}{yellow!30}{1,2,5,7}{orange!70}
\end{tikzpicture}
\end{document}

结果:

结果

答案2

只需添加一些用于填充颜色和要填充的图块的参数:

代码

\documentclass[tikz, border=2mm]{standalone}

\newcommand\polygon[5][]%
% 1: options for scope
% 2: num corners
% 3: size
% 4: colored tiles
% 5: fill color
{   \pgfmathsetmacro{\angle}{360/#2}
    \pgfmathsetmacro{\startangle}{-90 + \angle/2}
    \pgfmathsetmacro{\y}{cos(\angle/2)}
    \begin{scope}[#1]
        \foreach \i in {#4}
        {   \pgfmathsetmacro{\x}{\startangle + \angle*\i}
          \fill[#5] (0, 0) -- (\x:#3) --  (\x + \angle:#3) -- cycle;
        }
        \foreach \i in {1,2,...,#2}
        {
          \pgfmathsetmacro{\x}{\startangle + \angle*\i}
          \draw (0, 0) -- (\x:#3) --  (\x + \angle:#3) -- cycle;
        }
    \end{scope}
}

\begin{document}
\begin{tikzpicture}
    \polygon{6}{1}{1,4}{cyan}
    \polygon[xshift=3cm]{7}{2}{1,2,4,7}{magenta}
    \polygon[xshift=8cm]{8}{3}{5,6,1,4}{yellow}
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案3

另一个版本允许您单独指定颜色:

\documentclass{standalone}
\usepackage{tikz}

\newcommand\polygon[2][]{
  % Count input length.
  \pgfmathsetmacro{\n}{0}
  \foreach \color in {#2} {
    \pgfmathsetmacro{\n}{\n+1}
    \global\let\n=\n
  }

  % Draw polygon.
  \pgfmathsetmacro{\angle}{360/\n}
  \pgfmathsetmacro{\startangle}{-90 + \angle/2}
  \begin{scope}[#1]
    \pgfmathsetmacro{\x}{\startangle}
    \foreach[count=\i] \color in {#2} {
      \pgfmathsetmacro{\x}{\startangle + \angle*\i}
      \draw[fill=\color] (0, 0) -- (\x:1 cm) -- (\x + \angle:1 cm) -- cycle;
    }
  \end{scope}
}

\begin{document}
\begin{tikzpicture}
  \polygon{blue!50, red!50, green!50, blue!50, red!50, green!50, blue!50, red!50, green!50}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

另一个使用regular polygonspics

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{shapes.geometric}

\begin{document}

\tikzset{
    pics/polygon/.style n args = {3}{
        code = {
        \node[regular polygon, regular polygon sides=#1,
        minimum size=4cm, draw, 
        outer sep=0pt] at (0,0) (-node){};
        \foreach \i [evaluate=\i as \next using {ifthenelse(\i+1>#1,1,int(\i+1))}] in {#2}{
%               \typeout{\i,\next}
             \draw[fill=#3] (-node.corner \i)
                 --(-node.corner \next)--(-node.center)--cycle;}
        }
    }       
}

\begin{tikzpicture}

    \draw pic (a) {polygon={5}{1,3,2}{red}};
    \draw (4,0) pic (a) {polygon={7}{1,3,2}{green}};
    \draw (0,4) pic (a) {polygon={10}{1,3,2}{cyan}};
    \draw (4,4) pic (a) {polygon={4}{1,3,2}{orange}};

\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容