我想在 TikZ 中围绕给定对象绘制一条循环路径(不一定是圆形)。具体来说,我希望它精确包含下图中的黑色部分并忽略红色部分。
我尝试使用拟合库,但无法让它只包含黑色部分,而且总是有多余的空间。我应该注意,我对 TikZ 还很陌生,所以这可能是基本的。这是我的代码。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[scale=0.5]
\draw[red] (0,0) -- (0,2);
\draw (0,2) --(0,3);
\draw[red] plot [smooth] coordinates {(0,0.8) (-1,2) (-2,4)};
\draw plot [smooth] coordinates {(0,2) (1,3) (2,4) (3,6)};
\draw plot [smooth] coordinates {(1,3) (1,4) (1.5,5)};
\draw plot [smooth] coordinates {(2,4) (3,4) (3.5,5)};
\draw plot [smooth] coordinates {(0,3) (0,4) (-1,5)};
\draw plot [smooth] coordinates {(0,4) (0,4.5) (0.3,5)};
\end{tikzpicture}
\end{document}
答案1
恐怕一些手工工作是不可避免的。
我定义了一个命令\mybox
来绘制从一个点到另一个点的循环框。但以下参数仍需要通过您的观察或一些尝试来指定以实现您想要的结果。
dir={<start point> to <target point>}
指定起点和目标点。left=<out angle>:<in angle>:<distance>
指定左曲线的形状。right=<out angle>:<in angle>:<distance>
是相同的left
\documentclass[tikz, border=1cm]{standalone}
\makeatletter
\tikzset{
mybox/.cd,
dir/.code args={(#1) to (#2)}{
\def\mybox@start{#1}
\def\mybox@target{#2}
},
left/.code args={#1:#2:#3}{
\def\mybox@left@out{#1}
\def\mybox@left@in{#2}
\def\mybox@left@dist{#3}
},
right/.code args={#1:#2:#3}{
\def\mybox@right@out{#1}
\def\mybox@right@in{#2}
\def\mybox@right@dist{#3}
},
}
\newcommand\mybox[2][]{
\def\mybox@left@out{45}
\def\mybox@left@in{45}
\def\mybox@right@out{45}
\def\mybox@right@in{45}
\def\mybox@left@dist{1cm}
\def\mybox@right@dist{1cm}
\pgfqkeys{/tikz/mybox}{#2}
\draw[relative, line join=round,#1] (\mybox@start) to[out=\mybox@left@out, in=180+(-1)*(\mybox@left@in), distance=\mybox@left@dist] (\mybox@target)
to[out=\mybox@right@in, in=180+(-1)*(\mybox@right@out), distance=\mybox@right@dist] (\mybox@start) -- cycle;
}
\makeatother
\begin{document}
\begin{tikzpicture}
\draw[red] (0,0) -- (0,2);
\draw (0,2) --(0,3);
\draw[red] plot [smooth] coordinates {(0,0.8) (-1,2) (-2,4)};
\draw plot [smooth] coordinates {(0,2) (1,3) (2,4) (3,6)};
\draw plot [smooth] coordinates {(1,3) (1,4) (1.5,5)};
\draw plot [smooth] coordinates {(2,4) (3,4) (3.5,5)};
\draw plot [smooth] coordinates {(0,3) (0,4) (-1,5)};
\draw plot [smooth] coordinates {(0,4) (0,4.5) (0.3,5)};
\draw[red] (0, 0) to (1, 1);
\mybox[dashed]{dir={(0, 2) to (3, 6)}, left=90:90:4cm, right=60:80:3cm}
\end{tikzpicture}
\end{document}