我的目标

我的目标

我的目标

我正在尝试在 TikZ 中制作如下图所示的形状:

底部为矩形的环,如下段所述,但带有虚线箭头和尺寸文字注释

它是环形和矩形的并集,其中区域用阴影和轮廓表示。环形具有给定的内半径和外半径。矩形位于环形的底部,其左侧与环形的中心对齐,其高度等于环形的宽度,长度等于环形外半径的某个值。

我迄今为止的工作

\documentclass[tikz]{standalone}

% Definitions
\newcommand*{\innerRadius}{3cm}
\newcommand*{\outerRadius}{4cm}
\newcommand*{\footLength}{2.4cm}

\begin{document}
\begin{tikzpicture}

% Draw the ring
\draw[fill=gray!30,even odd rule]  (0,0) circle (\outerRadius)
                                   (0,0) circle (\innerRadius);
% Draw the rectangle
\draw[fill=gray!30] (0,-\outerRadius) rectangle (\footLength,-\innerRadius);

\end{tikzpicture}
\end{document}

这将产生以下内容:

与上图类似,减去箭头和注释,矩形轮廓覆盖环形轮廓

我的代码的问题是矩形的轮廓覆盖了环。

我的问题

如何在 TikZ 中制作所需的图形,使得轮廓围绕整个区域,而不是让矩形的轮廓与环的轮廓分开?

加分项(非必须!)

如果外半径较大,而环的内半径略小,如果矩形足够宽(例如分别为 5 厘米、4 厘米和 3.5 厘米),那么环的外边缘将与矩形的顶部相交,而不是其右侧,如下所示。在这种情况下,我不喜欢脚的右侧没有到达环。在这种特殊情况下,用环和矩形建模预期的图形是不够的。

几乎看起来像字母 Q。请参阅上面对该图的描述。

如果可能的话,我希望有一个解决方案,将矩形的右侧抬高以与环的外边缘相接。在这种情况下,矩形不再足够:矩形不应高于左侧环的内半径,但右侧需要从底部延伸到右侧的外半径。这将使我的图表尺寸更加灵活,并让我更深入地了解 TikZ 的工作原理。但是,我并不认为需要这样做,所以这只是出于好奇。我将不胜感激任何解决方案,无论有没有这个扩展!

答案1

标准案例非常简单。

\documentclass[tikz]{standalone}

% Definitions
\newcommand*{\innerRadius}{3cm}
\newcommand*{\outerRadius}{4cm}
\newcommand*{\footLength}{2.4cm}
\begin{document}
\begin{tikzpicture}
% Draw the thing
\draw[fill=gray!30,even odd rule]  
    (0,-\outerRadius) arc[start angle=270,end angle={-90+asin(\footLength/\outerRadius)},radius=\outerRadius]
    |- cycle                                  
    (0,0) circle[radius=\innerRadius];
% double-check that it works
% \draw[dashed] (0,-\outerRadius) rectangle (\footLength,-\innerRadius);
\end{tikzpicture}
\end{document}

对于一般情况,即包括“奖金”情况,我会使用pic

\documentclass[tikz]{standalone}
\newcommand*{\innerRadius}{3cm}
\newcommand*{\outerRadius}{4cm}
\newcommand*{\footLength}{2.4cm}
\tikzset{pics/my pic/.style={code={
 \pgfmathtruncatemacro{\itest}{\footLength>\outerRadius}
 \ifnum\itest=0
  \pgfmathsetmacro{\myangle}{asin(\footLength/\outerRadius)}
  \pgfmathtruncatemacro{\itest}{(1-cos(\myangle))*\outerRadius>\outerRadius-\innerRadius}
 \fi
 \ifnum\itest=0
   \draw[fill=gray!30,even odd rule]  
    (0,-\outerRadius) arc[start angle=270,end angle={-90+\myangle},radius=\outerRadius]
    |- cycle                                  
    (0,0) circle[radius=\innerRadius];
 \else
  \pgfmathsetmacro{\myangle}{acos(\innerRadius/\outerRadius)}
   \draw[fill=gray!30,even odd rule]  
    (0,-\outerRadius) arc[start angle=270,end angle={-90+\myangle},radius=\outerRadius]
    -- (\footLength,-\innerRadius)
    |- cycle                                  
    (0,0) circle[radius=\innerRadius];
 \fi    
}}}
\begin{document}
\begin{tikzpicture}
 \pic{my pic};
\end{tikzpicture}
\renewcommand*{\footLength}{3.5cm}
\begin{tikzpicture}
 \pic{my pic};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容