如何改进我的 PSTricks 代码来构建三角形图?

如何改进我的 PSTricks 代码来构建三角形图?

这个问题类似于如何改进我的 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]。)

建造:

  1. 在中\tile我们编写了 pstricks 代码来说明如何创建图块(例如三角形)。为了简单起见,我们使用三角形边长2。因此,边长的一半是1
  2. 为了创建整个图形,我们\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}

相关内容