![TikZ 路径内有条件吗?](https://linux22.com/image/325239/TikZ%20%E8%B7%AF%E5%BE%84%E5%86%85%E6%9C%89%E6%9D%A1%E4%BB%B6%E5%90%97%EF%BC%9F.png)
我正在尝试制作一个宏,用于在 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) }