我需要绘制一个正方形内刻的前三个三角数字的图像。
现在,构建这个图像时我遇到两个问题。
- 构造完美居中的圆圈
- 阴影
只回答我的第一个问题是可以接受的(为了符合一个问题、一个帖子的政策),尽管如果有人能回答两个问题我会很高兴。
现在我没有最小的例子,但是为了构建这个图像,任何包都足够了,尽管我更喜欢 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
,但我的初始尝试失败了,因此手动用scope
s 进行移位。
有一些shift
y 的东西在发生。我通过+\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
中。y
pos
+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 => 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}