TikZ 路径内有条件吗?

TikZ 路径内有条件吗?

我正在尝试制作一个宏,用于在 TikZ 中绘制方形拼图。每条边应该有三种可能性,要么向内突出,要么向外突出,要么笔直。

以下是我目前所得到的。如图所示,我可以根据每个参数是 0 还是 1 来决定每条边是向内突出还是向外突出。我的目标是当参数为 2 时使边变直。

问题是我不知道如何在 TikZ 路径中放置条件。也就是说,如果输入是某个数字,我想跳过路径的某些部分。我尝试使用 ifthen 包,但似乎 tikz 无法将结果解释为\ifthenelse有效坐标。有没有办法有条件地跳过 TikZ 路径的某些部分?或者有没有更好的方法来完成我想做的事情?

\documentclass{article}
\usepackage{tikz}
\begin{document}

\def \puzzlepiece(#1,#2,#3,#4)
{
\filldraw[very thick,fill=orange] 
      (0,0) --
      (0,1) arc (270:{90+360*#1}:1) -- %want to skip this line if #1 = 2
      (0,4) --
      (1,4) arc (180:{0+360*#2}:1)  -- %want to skip this line if #2 = 2
      (4,4) --
      (4,3) arc (90:{-90+360*#3}:1) -- %want to skip this line if #3 = 2
      (4,0) --
      (3,0) arc (0:{-180+360*#4}:1) -- %want to skip this line if #4 = 2
      cycle;
}
\tikz{\puzzlepiece(0,1,0,1) }
\tikz{\puzzlepiece(1,0,1,0) }

\end{document}

在此处输入图片描述

答案1

有点复杂(请注意最后一种情况下的不同行为),但符合您的要求。代码片段已注释并替换为以下几行。

\documentclass{article}
\usepackage{tikz}
\begin{document}


\def \puzzlepiece(#1,#2,#3,#4)
{
\filldraw[very thick,fill=orange] 
      (0,0) --
     %(0,1) arc (270:{90+360*#1}:1) -- %want to skip this line if #1 = 2
\ifnum#1=2 (0,0)--\else (0,1) arc (270:{90+360*#1}:1)-- \fi
      (0,4) --
%      (1,4) arc (180:{0+360*#2}:1)  -- %want to skip this line if #2 = 2
\ifnum#2=2 (0,4)-- \else(1,4) arc (180:{0+360*#2}:1)  -- \fi
      (4,4) --
%      (4,3) arc (90:{-90+360*#3}:1) -- %want to skip this line if #3 = 2
\ifnum#3=2 (4,4)-- \else (4,3) arc (90:{-90+360*#3}:1) --\fi
     (4,0) --
%      (3,0) arc (0:{-180+360*#4}:1) -- %want to skip this line if #4 = 2
\ifnum#4=2   (4,0)-- cycle;\relax \else (3,0) arc (0:{-180+360*#4}:1) --cycle;\relax\fi
%   cycle;
}
\tikz{\puzzlepiece(0,1,0,1) }
\tikz{\puzzlepiece(1,0,1,0) }
\tikz{\puzzlepiece(2,0,1,0) }
\tikz{\puzzlepiece(2,2,0,1) }
\end{document}

在此处输入图片描述

答案2

如果弧 (0:{0}:1),则边为直,因此最简单的解决方案是编写函数 f(0)=1、f(1)=1、f(2)=0 和弧 (f(x)*y:{f(x)*z}:1)

\documentclass{article}
\usepackage{tikz}
\def\myf(#1){(#1+1)*(2-#1)/2}
\def\puzzlepiece(#1,#2,#3,#4)
{
\filldraw[very thick,fill=orange] 
      (0,0) --
      (0,1) arc (\myf(#1)*270:{\myf(#1)*(90+360*#1)}:1)--
      (0,4) --
      (1,4) arc (\myf(#2)*180:{\myf(#2)*(0+360*#2)}:1)--
      (4,4) --
      (4,3) arc (\myf(#3)*90:{\myf(#3)*(-90+360*#3)}:1)--
      (4,0) --
      (3,0) arc (0:{\myf(#4)*(-180+360*#4)}:1)--
      cycle;
}
\begin{document}
\tikz{\puzzlepiece(0,1,0,1) }
\tikz{\puzzlepiece(2,2,2,2) }
\end{document}

答案3

您可以使用以下方式准备路径\edef

\def \puzzlepiece(#1,#2,#3,#4){%
   \edef\onepuzzle{%
      (0,0) --
      \ifnum#1=2 \else (0,1) arc (270:{90+360*#1}:1) -- \fi %skip if #1 = 2
      (0,4) --
      \ifnum#2=2 \else (1,4) arc (180:{0+360*#2}:1)  -- \fi %skip if #2 = 2
      (4,4) --
      \ifnum#3=2 \else (4,3) arc (90:{-90+360*#3}:1) -- \fi %skip if #3 = 2
      (4,0) --
      \ifnum#4=2 \else (3,0) arc (0:{-180+360*#4}:1) -- \fi %skip if #4 = 2
      cycle
   }%
   \filldraw[very thick,fill=orange] \onepuzzle;
}
\tikz{\puzzlepiece(0,1,0,2) }
\tikz{\puzzlepiece(1,0,1,0) }

相关内容