TikZ 中的三角数

TikZ 中的三角数

我需要绘制一个正方形内刻的前三个三角数字的图像。

前三个三角数

现在,构建这个图像时我遇到两个问题。

  • 构造完美居中的圆圈
  • 阴影

只回答我的第一个问题是可以接受的(为了符合一个问题、一个帖子的政策),尽管如果有人能回答两个问题我会很高兴。

现在我没有最小的例子,但是为了构建这个图像,任何包都足够了,尽管我更喜欢 TikZ。

我正在使用各种各样的包,尽管我怀疑它们中的任何一个都会干扰这个图像的构建。

  • 有人对如何n在正方形内构造第一个三角数(带有“正确”的阴影)有什么提示或建议吗?

答案1

尝试以下方法:

\documentclass{article}
\usepackage{tikz}

\newlength\radius
\pgfmathsetlength{\radius}{0.5cm}
\newcommand\drawballs[2][]{%
    \foreach \y [evaluate=\y as \yy using #2+1-\y] in {1,...,#2} {%
        \foreach \x in {1,...,\yy} {%
            \shade[shading=ball,ball color=white,#1] 
                ({(2*\x-2+\y)*\radius},{sqrt(3)*\y*\radius}) circle (\radius); 
        };
    }%
}

\begin{document}

\begin{tikzpicture}
    \drawballs{1}
    \drawballs[xshift=2cm]{2}
    \drawballs[xshift=5cm]{3}
\end{tikzpicture}

\end{document}

代码输出

答案2

你可以调整帕斯卡三角形示例。下面的并不完美,对齐可以做得更优雅,但这是一个开始。

当然,我们要非常感谢 Paul Gaborit 的辛勤工作。

添加网格是为了更容易看到它们如何相互对齐。我尝试计算xshift并将其包括到中\trianglenumber,但我的初始尝试失败了,因此手动用scopes 进行移位。

有一些shifty 的东西在发生。我通过+\row*0.1在两个地方添加y-coordinate 来删除行之间的小空间(0.1 值只是一个幸运的猜测):

\node[ball,yshift=0.45cm*#1] (p-\row-0) at (-\row/2,-\row+\row*0.1) {};

以及

\coordinate (pos) at (-\row/2+\col,-\row+\row*0.1+0.45*#1);

此外,为了使它们以中心为中心垂直对齐,第二和第三行移动了0.45cm*<number of additional rows>。由于 的参数\trianglenumber仅定义附加行的数量,您可以在上面的两行中看到这一点,在节点的选项中 – –和–的坐标yshift=0.45cm*#1中。ypos+0.45*#1

也许不是很优雅,但它基本上能完成工作。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,shadows,backgrounds,calc}

\newcommand{\trianglenumber}[1]{%
  \node[ball,yshift=0.45cm*#1] (p-0-0) at (0,0) {};
  \foreach \row in {1,...,#1} {
     % col #0 =&gt; value is 1
    \node[ball,yshift=0.45cm*#1] (p-\row-0) at (-\row/2,-\row+\row*0.1) {};
    \pgfmathsetmacro{\value}{1};
    \foreach \col in {1,...,\row} {
      % iterative formula : val = precval * (row-col+1)/col
      % (+ 0.5 to bypass rounding errors)
      \pgfmathtruncatemacro{\value}{\value*((\row-\col+1)/\col)+0.5};
      \global\let\value=\value
      % position of each value
      \coordinate (pos) at (-\row/2+\col,-\row+\row*0.1+0.45*#1);
      \pgfmathtruncatemacro{\rest}{mod(\value,2)}
      \ifnum \rest=0
        \node[ball] (p-\row-\col) at (pos) {};
      \else
        \node[ball] (p-\row-\col) at (pos) {};
      \fi
    }
  }
}


  % some styles
  \tikzset{
    ball/.style={
      minimum size=10mm,
      draw=black,
      circle,
      shade=ball,
      ball color=gray!20,
    },
  }

\begin{document}
\centering

\begin{tikzpicture}
\begin{scope}
  \node [ball] {};
\end{scope}
\begin{scope}[xshift=2.5cm]
  \trianglenumber{1}
\end{scope}
\begin{scope}[xshift=6cm]
 \trianglenumber{2}
\end{scope}
\draw (current bounding box.south west) grid (current bounding box.north east);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

您可以直接在 TikZ 中执行此操作。这是一个相当完整的示例,其中有一些任意的默认选项来控制外观。您也可以制作任意大小的三角形:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shadings,calc}

\newcommand\shadedball[1]{% #1 = (coordinates)
 \shadedraw [shading = ball] #1 circle [radius = 1]
}

\newcommand\triangleloweredge[1]{% #1 = length
 \foreach \n [evaluate = \n using \n - 1] in {1,...,#1} {
  \shadedball{(2*\n,0)};
 }
}

\newcommand\triangleofballs[1]{% #1 = side length
 \foreach \m [count = \c from 0] in {#1,...,1} {
  \tikzset{shift = {(60:2*\c)}}
  \triangleloweredge{\m}
 }
}

\newcommand\squaredtriangleofballs[2][]{% #1 = global options, #2 = side length
 \begin{scope}[#1]
  \path[square border] (0,0) rectangle (${2*(#2)}*(1,1)$);
  \node[anchor = south west, inner sep = 0] {\tikz[shaded ball, #1] \triangleofballs{#2};};
 \end{scope}
}

\tikzset{
 square border/.style = {
  draw, ultra thick, red, fill = gray
 },
 shaded ball/.style = {
  color = violet, ball color = green
 }
}

\begin{document}
 \begin{tikzpicture}
  \squaredtriangleofballs[scale = 0.75]{3}
 \end{tikzpicture}
\end{document}

在此处输入图片描述

有点像 Martin Heller 的回应,我在测试时看到了。它在编程方面可能有一些轻微的优势:它使用极坐标系而不是坐标计算,对操作的每个部分使用“引理”,并且使用 TikZ 选项而不是 TeX 宏/维度来完成所有操作。我还提供了一种绘制框的可能方法;在这个新版本中,它绘制了一个实际的正方形,而不是合适的矩形。

答案4

我忘了我创建了tkz-berge

\documentclass[11pt]{scrartcl}
\usepackage{tkz-berge}

\newcommand{\ballgolf}[1]{%
\SetVertexNoLabel
\foreach \i [evaluate=\i as \j using #1-\i] in {0,...,\number\numexpr#1 - 1\relax}{% 
     \pgfmathsetmacro\k{\i*sqrt(3)/2}
      \begin{scope}[shift={(\i*.5 cm,\k cm)}]
         \grEmptyPath[RA=1]{\j}   
       \end{scope}}}     

\begin{document}
\tikzset{VertexStyle/.style ={circle,ball color= gray!80!yellow,minimum size = 1cm}}      
\tikz{\ballgolf{4}}
\end{document} 

在此处输入图片描述

相同,但只tikz

\documentclass[11pt]{scrartcl}
\usepackage{tikz}

\newcommand{\ballgolftikz}[1]{%
\foreach \i  in {0,...,\number\numexpr#1 - 1\relax}{% 
   \pgfmathsetmacro\k{\i*sqrt(3)/2}
   \begin{scope}[shift={(\i*.5 cm,\k cm)}]
     \foreach \t in {1,...,\number\numexpr #1-\i\relax}{
        \shade[ball color= gray] (\t,0) circle (.5cm);}
   \end{scope}}
   }    
\begin{document}
\tikz{\ballgolftikz{3}}
\end{document}

相关内容