使用 TikZ 绘制切线圆

使用 TikZ 绘制切线圆

我正在尝试使用 TikZ 绘制矩形内的相切圆,但遇到了一些困难。我还在征求有关更好地使用 TikZ 的一般反馈,因此我在这里详细介绍了我的方法。

我首先使用 制作外矩形\draw (0,0) -- ++(0,-6) -- ++(10,0) -- ++(0,6) -- cycle;。然后我使用 制作第一行圆圈\tikz\foreach \x in {0,2,4,6} \draw (\x,0) circle (1);。我注意到圆圈位于矩形的顶线上,所以我假设坐标(\x,0)底部每个圆圈,而不是中心正如我所料(尽管即使它们是中心,我仍然需要将它们向下移动)。我将矩形的第一个坐标更改为,(0,3)因为我还想在圆圈前插入一个插图。但是这样绘图就侵占了它上面的文本。我将第一个坐标改回为(0,0),并将圆圈的坐标调整为(\x,-3)。但是圆圈又位于矩形上方,整个绘图在页面上大幅上移。为什么会这样?

我将圆的坐标改回为(\x,0),将矩形改回为(0,3)。然后我尝试制作第二排圆。因为我想把它们塞进六边形格子里,foreach \x in {1,3,5,7 \draw (\x,{-sqrt(3)}) circle (1);所以我写了,我想法会产生另外四个圆圈,在第一行的右侧一个单位处,在第一行的下方√3个单位处。相反,它们与第一行水平对齐,并且比我想要的要靠下很多。我将坐标重写为 (\x+1,{-sqrt(3)+1}),这有效,但为什么呢?我猜这意味着\x坐标中的相对的到其在系列中的位置{1,3,5,7},所以我期望将系列与交换{0,2,4,6}会产生相同的结果,但事实并非如此。垂直位置由坐标中的固定值给出,我知道第二行圆应该比第一行低 √3 个单位,而不是 (√3 - 1) 个单位。我做错了什么?

最后,我想画第三排圆,标记每个圆的中心,让矩形的边缘夹住悬垂的半圆,并为半径和其他东西添加一些注释,所以我也在想如果我把圆做成节点或其他东西,这些步骤是否会更短。我已经花了很多时间浏览 TikZ 手册。我看到了一些可能的解决方案,比如使用库intersectionstangentcalc库中获取,但我不确定如何我会使用它们。由于手册超过 1,300 页,对于 TikZ 新手来说,查找特定问题的答案可能很困难。我也在 Stack Exchange 上查看了答案,但仍然不知道该怎么做。


我的代码

\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{amsmath,amsfonts,amsthm,amssymb}
\usepackage{pgf,tikz}
\usetikzlibrary{calc,intersections}

\begin{document}
    \begin{flushleft}   

        \begin{figure}[h]
            \begin{tikzpicture}
                \draw (0,3) -- ++(0,-6) -- ++(10,0) -- ++(0,6) -- cycle;
                \tikz\foreach \x in {0,2,4,6}
                    \draw (\x,0) circle (1);
                \foreach \x in {1,3,5,7}
                    \draw (\x+1,{-sqrt(3)+1}) circle (1);
            \end{tikzpicture}
        \end{figure}

    \end{flushleft}
\end{document}

输出

输出

答案1

你的数学是正确的,但是通过使用\tikz\foreach嵌套tikzpicture,这解释了不一致之处。

这将绘制第三行并固定其他圆的位置。对于矩形,您只需使用rectangle路径构造即可。

\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{tikz}

\begin{document}
\begin{figure}[h]
    \begin{tikzpicture}
        \draw (0,3) rectangle ++(10,-6);
        \draw foreach \x in {0,2,4,6}
             {(1+\x,2) circle[radius=1]
             (1+\x,{2-2*sqrt(3)}) circle[radius=1]};
        \draw foreach \x in {1,3,5,7}
            {(\x+1,{-sqrt(3)+2}) circle[radius=1]};
    \end{tikzpicture}
\end{figure}
\end{document}

在此处输入图片描述

这会添加更多圆圈、标记中心并将圆圈剪切到矩形上。

\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{tikz}

\begin{document}
\begin{figure}[h]
    \begin{tikzpicture}[bullet/.style={fill,circle,inner sep=1.2pt}]
        \draw[clip] (0,3) rectangle ++(10,-6);
        \draw foreach \X in {-1,0,...,9}
         {\ifodd\X
           (\X+1,{-sqrt(3)+2})  node[bullet]{} circle[radius=1]
            (\X+1,{-3*sqrt(3)+2})  node[bullet]{} circle[radius=1]
         \else 
             (\X+1,2) node[bullet]{} circle[radius=1]
             (\X+1,{2-2*sqrt(3)})  node[bullet]{} circle[radius=1]
         \fi};
    \end{tikzpicture}
\end{figure}
\end{document}

在此处输入图片描述

答案2

这是你想要的?

在此处输入图片描述

您可以使用\clip[draw]绘制一个矩形并裁剪到矩形。除此之外,我还使用了两个\foreach循环,并且像薛定谔的猫一样,删除了多余的内部\tikz

\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{amsmath,amsfonts,amsthm,amssymb}
\usepackage{pgf,tikz}
\usetikzlibrary{calc,intersections}

\begin{document}
    \begin{flushleft}

        \begin{figure}[h]
            \begin{tikzpicture}
                \pgfmathsetmacro\top{2+2*sqrt(3)}
                \clip[draw](0,0) rectangle (10,\top);
                \foreach \x in {1,3,5,7,9} {
                  \foreach \row [
                      evaluate=\row as \yrow using {1+sqrt(3)*\row},
                      evaluate=\row as \xrow using {isodd(\row) ? \x+1: \x}
                    ] in {0,1,2} {
                        \draw (\xrow,\yrow) circle (1);
                  }
                }
            \end{tikzpicture}
        \end{figure}

    \end{flushleft}
\end{document}

我还曾经\pgfmathsetmarco将矩形的高度设置为2+2\sqrt(3)

相关内容