这个问题类似于如何改进我的 PSTricks 代码来构建三角数图?。
考虑以下示例。
代码
% pdflatex -shell-escape test.tex
\documentclass{article}
\usepackage{
auto-pst-pdf,
pstricks-add
}
\begin{document}
\begin{figure}
\def\laengde{6}
\def\startX{3}
\def\startY{0}
\pstFPdiv\konstA{\laengde}{2}
\pstFPsub\Bmin{\startX}{\konstA}
\pstFPadd\Bmaks{\startX}{\konstA}
\pstFPadd\Hmin{\startY}{0}
\pstFPdiv\konstB{3 sqrt}{2}
\pstFPmul\Hmaks{\konstB}{\laengde}
\centering
\psset{
radius=0.2
}
\begin{pspicture}(\Bmin,\Hmin)(\Bmaks,\Hmaks)
\Cnode*(\startX,\startY){A}
\Cnode*(!\startX\space \laengde\space 8 div sub \startY\space 3 sqrt 8 div \laengde\space mul add){B}
\Cnode*(!\startX\space \laengde\space 8 div add \startY\space 3 sqrt 8 div \laengde\space mul add){C}
\Cnode*(!\startX\space \laengde\space 4 div sub \startY\space 3 sqrt 4 div \laengde\space mul add){D}
\Cnode*(!\startX\space \startY\space 3 sqrt 4 div \laengde\space mul add){E}
\Cnode*(!\startX\space \laengde\space 4 div add \startY\space 3 sqrt 4 div \laengde\space mul add){F}
\Cnode*(!\startX\space \laengde\space 3 8 div mul sub \startY\space 3 3 sqrt mul 8 div \laengde\space mul add){G}
\Cnode*(!\startX\space \laengde\space 8 div sub \startY\space 3 3 sqrt mul 8 div \laengde\space mul add){H}
\Cnode*(!\startX\space \laengde\space 8 div add \startY\space 3 3 sqrt mul 8 div \laengde\space mul add){I}
\Cnode*(!\startX\space \laengde\space 3 8 div mul add \startY\space 3 3 sqrt mul 8 div \laengde\space mul add){J}
\Cnode*(!\startX\space \laengde\space 2 div sub \startY\space 3 sqrt 2 div \laengde\space mul add){K}
\Cnode*(!\startX\space \laengde\space 4 div sub \startY\space 3 sqrt 2 div \laengde\space mul add){L}
\Cnode*(!\startX\space \startY\space 3 sqrt 2 div \laengde\space mul add){M}
\Cnode*(!\startX\space \laengde\space 4 div add \startY\space 3 sqrt 2 div \laengde\space mul add){N}
\Cnode*(!\startX\space \laengde\space 2 div add \startY\space 3 sqrt 2 div \laengde\space mul add){O}
\pspolygon(A)(K)(O)
\ncline{B}{N}
\ncline{D}{M}
\ncline{G}{L}
\ncline{B}{C}
\ncline{D}{F}
\ncline{G}{J}
\ncline{C}{L}
\ncline{F}{M}
\ncline{J}{N}
\pnode(!\startX\space \laengde\space 3 8 div mul add \startY\space 3 sqrt 8 div \laengde\space mul add){S}
\rput(S){\footnotesize{$15$~prikker}}
\end{pspicture}
\end{figure}
\end{document}
输出
问题
我得到了想要的输出,但是代码相当混乱;有人能帮我简化一下吗?(代码可能可以比另一篇文章中的更“简单”。)
更新
使用另一篇文章中@Herbert 的第二种方法,我现在得到以下内容:
\documentclass{article}
\usepackage[pdf]{pstricks}
\usepackage{pst-eucl}
\newcounter{No}
\setcounter{No}{0}
\def\trekanttal#1#2{%
\psset{
radius=#2,
yunit=0.8660254
}
\begin{pspicture}(#1,#1)
\pspolygon[
linecolor=black,
linewidth=1.5pt
](0,#1)(#1,#1)(!#1 2 div 0)
\multido{\iRow=0+2,\iStep=1+1}{\numexpr#1/2+1}{%
\multido{\iCol=0+2}{\iStep}{%
\stepcounter{No}%
\pnode(!#1 2 div \iStep\space sub 1 add \iCol\space add \iRow){N\theNo}
\rput(N\theNo){
\pscircle[
fillstyle=solid,
fillcolor=black
]{#2mm}
}
}
}
\end{pspicture}
}
\begin{document}
\begin{figure}[htbp]
\trekanttal{10}{3}
\end{figure}
\end{document}
但所有点之间的连线都消失了。
答案1
如果不需要将点作为节点进行进一步的修改,那么很容易:
\documentclass{article}
%\usepackage[pdf]{pstricks}% for pdflatex --shell-escape
\usepackage{pst-eucl}
\def\trekanttal#1#2{%
\psset{yunit=0.8660254cm}
\begin{pspicture}(\numexpr2*#1-2,\numexpr2*#1-2)
\pstVerb{ /MaxIndex #1 2 mul 2 sub def }
\multido{\iRow=0+2,\iStep=1+1}{#1}{%
\psline(!\iStep\space 1 sub MaxIndex \iRow\space sub)(!MaxIndex \iStep\space sub 1 add MaxIndex \iRow\space sub)
\psline(!\iRow\space MaxIndex)(!#1 \iStep\space add 2 sub \iRow\space)
\psline(!MaxIndex \iRow\space sub MaxIndex)(!#1 \iStep\space sub \iRow\space)
\multido{\iCol=0+2}{\iStep}{%
\pscircle*(!#1 1 sub \iStep\space sub 1 add \iCol\space add \iRow){#2mm}%
}}
\end{pspicture}}
\begin{document}
\trekanttal{3}{3}
\trekanttal{6}{3}
\end{document}
我把参数的含义改了一下:第一个是外排的点数。
递归调用也是一样:
\documentclass{article}
%\usepackage[pdf]{pstricks}% for pdflatex --shell-escape
\usepackage{pst-eucl}
\def\Atom(#1,#2)#3{%
\multido{\iA=0+1}{\numexpr#3-1}{%
\rput(!#1 \iA\space add #2){\pspolygon[showpoints](0,0)(1,0)(.5,-1)}}%
\ifnum#3>1 \edef\No{\the\numexpr#3-1}\Atom(#1 0.5 add ,#2 1 sub ){\No}\fi}
\def\trekanttal#1{%
\psset{yunit=0.8660254cm,dotscale=2.5}
\begin{pspicture}(\numexpr#1-1,\numexpr-#1+1)
\Atom(0,0){#1}
\end{pspicture}}
\begin{document}
\trekanttal{3} \trekanttal{6}
\end{document}
答案2
更新: 展示我的代码的灵活性。
(感谢@Herbert 的提及\pspolygon[showpoints]
。)
建造:
- 在中
\tile
我们编写了 pstricks 代码来说明如何创建图块(例如三角形)。为了简单起见,我们使用三角形边长2
。因此,边长的一半是1
。 - 为了创建整个图形,我们
\tile
使用两个\multido
循环反复打印。也就是说,对于底行,我们只打印一个图块,对于上一行,我们打印两个图块,依此类推。打印多少行可以通过 来控制\br
。——名称中的数字是自动计算的。
下图直观地展示了其工作原理。在这种情况下(使用三角形时),只有节点重叠。
\tile
下面的代码非常灵活,只需改变和调整 中的水平和垂直偏移量,就可以轻松创建类似的图片\rput
。这里我们展示了四张这样的图片,包括“15 prikker”。
\documentclass{article}
\usepackage[pdf]{pstricks}
\usepackage{pst-eucl}
\begin{document}
\psset{radius=0.2, unit=8mm, dotsize=4pt 6}
\newcommand\br{4}%how many tiles in the top row, 4 -> "15 prikker"
\newcommand\tiletriangle{%------ this prints a triangle ------
\pspolygon[showpoints](!0 3 sqrt)(!1 0)(!2 3 sqrt)
}
\begin{pspicture}(\numexpr2*\br,\numexpr2*\br)
\multido{\iRow=0+1}{\br}{%
\multido{\iCol=1+1}{\numexpr\iRow+1}{%
\rput(!\iCol\space 2 mul \iRow\space sub
\iRow\space 3 sqrt mul){\tiletriangle}
}
}
\rput[l](!4 \br\space 3 div add 1.6){$\number\numexpr(\br+1)*(\br+2)/2$~prikker}
\end{pspicture}
%
%
\hfill
\newcommand\tilesquare{%------ this prints a square ------
\pspolygon[showpoints](2,1)(1,2)(0,1)(1,0)
}
\begin{pspicture}(\numexpr2*\br,\numexpr2*\br)
\multido{\iRow=0+1}{\br}{%
\multido{\iCol=1+1}{\numexpr\iRow+1}{%
\rput(!\iCol\space 2 mul \iRow\space sub
\iRow\space){\tilesquare}
}
}
\rput[l](!4 \br\space 3 div add 1){$\number\numexpr\br*(\br+1)/2$~squares}
\end{pspicture}
\bigskip
\newcommand\tilehexagon{%------ this prints a hexagon ------
\pspolygon[showpoints](!3 sqrt 1.5)(!3 sqrt 2 div 2)(!0 1.5)%
(!0 0.5)(!3 sqrt 2 div 0)(!3 sqrt 0.5)
}
\begin{pspicture}(\numexpr2*\br,\numexpr2*\br)
\multido{\iRow=0+1}{\br}{%
\multido{\iCol=1+1}{\numexpr\iRow+1}{%
\rput(!\iCol\space 2 mul \iRow\space sub 3 sqrt mul 2 div
\iRow\space 1.5 mul){\tilehexagon}
}
}
\rput[l](!3.4 \br\space 3 div add 0.9){$\number\numexpr\br*(\br+1)/2$~hexagons}
\end{pspicture}
%
%
\hfill
\newcommand\tilecircle{%------ this prints a circle ------
\pscircle(0,0){1}
}
\begin{pspicture}(\numexpr2*\br,\numexpr2*\br)
\multido{\iRow=0+1}{\br}{%
\multido{\iCol=1+1}{\br}{%
\rput(!\iCol\space 2 mul \iRow\space 2 mod sub
\iRow\space 3 sqrt mul){\tilecircle}
}
}
\rput[l](!\br\space 2 mul 0.5 add 1.5){$\number\numexpr\br*\br$~circles}
\end{pspicture}
\end{document}
答案3
这一次,这是 PSTricks 问题的 TikZ 解决方案:
\documentclass{article}
\usepackage{tikz}
\newcommand{\triangdiag}[1]{%
% the argument corresponds to the number of vertices on the outer row
\begin{tikzpicture}[thick]
\def\a{1} % length of a triangle edge
\def\r{.15} % radius of the dots
\foreach \j in {1,...,#1}{%
% Draw dots
\def\M{\the\numexpr#1-\j+1}
\foreach \i in {1,...,\M}{%
\fill ({(.5*(\j-1)+(\i-1))*\a},{(1-\j)*.5*sqrt(3)*\a}) circle (\r);
}
% Draw lines
\draw ({(.5*(\j-1)},{(1-\j)*.5*sqrt(3)*\a}) --
++({(\M-1)*\a},0);
\draw ({((\j-1))*\a},0) --
({.5*(#1+\j-2)*\a},{(\j-#1)*.5*sqrt(3)*\a});
\draw ({(#1-\j)*\a},0) --
({.5*(#1-\j)*\a},{(\j-#1)*.5*sqrt(3)*\a});
}
\end{tikzpicture}
}
\begin{document}
\triangdiag{5} \qquad \triangdiag{8}
\end{document}
答案4
使用递归方法,但它仅适用于小于 8 的正数。TeX 主内存容量不足以生成超过 7 的正数。请告诉我如何修复它!
单身的:
\documentclass[pstricks,border=2pt]{standalone}
\SpecialCoor
\psset{showpoints=true}
\usepackage{multido}
\usepackage{fp}
\def\Atom#1{%
\ifnum#1=1\relax
\pspolygon(0,0)(!.5 dup 3 sqrt mul neg)(1,0)
\else
\sbox0{\expandafter\Atom\expandafter{\the\numexpr#1-1\relax}}%
\rput(0,0){\usebox0}
\rput{-60}(!2 #1 2 sub exp 0){\usebox0}
\rput(!2 #1 2 sub exp 0){\usebox0}
\rput(!2 #1 3 sub exp dup 3 sqrt mul neg){\usebox0}
\fi
}
\def\Molecule#1{%
\FPeval\Wd{pow(#1-1,2)}
\FPeval\Ht{Wd/2*root(2,3)}
\begin{pspicture}(\Wd,-\Ht)
\Atom{#1}
\end{pspicture}}
\begin{document}
\Molecule{5}
\end{document}
多种的:
\documentclass[border=2pt]{standalone}
\usepackage{pstricks}
\SpecialCoor
\psset{showpoints=true,unit=2.5mm}
\usepackage{multido}
\usepackage{fp}
\def\Atom#1{%
\ifnum#1=1\relax
\pspolygon(0,0)(!.5 dup 3 sqrt mul neg)(1,0)
\else
\sbox0{\expandafter\Atom\expandafter{\the\numexpr#1-1\relax}}%
\rput(0,0){\usebox0}
\rput{-60}(!2 #1 2 sub exp 0){\usebox0}
\rput(!2 #1 2 sub exp 0){\usebox0}
\rput(!2 #1 3 sub exp dup 3 sqrt mul neg){\usebox0}
\fi
}
\def\Molecule#1{%
\FPeval\Wd{pow(#1-1,2)}
\FPeval\Ht{Wd/2*root(2,3)}
\begin{pspicture}(\Wd,-\Ht)
\Atom{#1}
\end{pspicture}}
\begin{document}
\multido{\i=1+1}{6}{\Molecule{\i}\quad}
\end{document}