使用 TikZ 绘制 3D 晶格

使用 TikZ 绘制 3D 晶格

我需要使用 Tikz 绘制带有节点的 3D 网格。此外,是否可以通过 3 个嵌套循环简单地构造它?这样我就可以用空心圆标记一些节点,用实心圆标记一些节点……视点对于视觉清晰度也很重要。

链接的副本有很多新命令和设置很多宏。它不应该那么复杂。我想用基本的指令集来做,这样代码就很容易理解;也很容易记住……

另一个区别是,只有选定的节点才会用实心圆圈标记,而不是所有节点。上面链接的答案在这方面也没有帮助……

在此处输入图片描述

答案1

正如 @cfr 在评论部分所建议的那样,tikz-3dplot这是 3D 的正确方法。建议的解决方案tikz-3dplot

在此处输入图片描述

代码如下

\documentclass[border={10}]{standalone}
\usepackage{tikz}  
\usepackage{tikz-3dplot} 


\tdplotsetmaincoords{70}{120} % set viewpoint 
\tdplotsetrotatedcoords{0}{0}{0} %<- rotate around (z,y,z)
\begin{document}

\begin{tikzpicture}[scale=3,tdplot_rotated_coords,
                    rotated axis/.style={->,purple,ultra thick},
                    blackBall/.style={ball color = black!80},
                    borderBall/.style={ball color = white,opacity=.25}, 
                    very thick]

\foreach \x in {0,1,2}
   \foreach \y in {0,1,2}
      \foreach \z in {0,1,2}{
           %#####################################################
           \ifthenelse{  \lengthtest{\x pt < 2pt}  }{
             \draw (\x,\y,\z) -- (\x+1,\y,\z);
             \shade[rotated axis,blackBall] (\x,\y,\z) circle (0.025cm); 
           }{}
           %#####################################################
           \ifthenelse{  \lengthtest{\y pt < 2pt}  }{
               \draw (\x,\y,\z) -- (\x,\y+1,\z);
               \shade[rotated axis,blackBall] (\x,\y,\z) circle (0.025cm);
           }{}
           %#####################################################
           \ifthenelse{  \lengthtest{\z pt < 2pt}  }{
               \draw (\x,\y,\z) -- (\x,\y,\z+1);
               \shade[rotated axis,blackBall] (\x,\y,\z) circle (0.025cm);
           }{}

}

\shade[rotated axis,blackBall] (1,0,1) circle (0.05cm); 
\shade[rotated axis,blackBall] (1,2,1) circle (0.05cm); 
\shade[rotated axis,blackBall] (0,1,1) circle (0.05cm); 
\shade[rotated axis,blackBall] (2,1,1) circle (0.05cm);
\shade[rotated axis,blackBall] (1,1,2) circle (0.05cm);
\shade[rotated axis,blackBall] (1,1,0) circle (0.05cm);

\shade[rotated axis,borderBall] (1,0,1) circle (0.1cm);
\shade[rotated axis,borderBall] (1,2,1) circle (0.1cm);
\shade[rotated axis,borderBall] (0,1,1) circle (0.1cm);
\shade[rotated axis,borderBall] (2,1,1) circle (0.1cm);
\shade[rotated axis,borderBall] (1,1,2) circle (0.1cm);
\shade[rotated axis,borderBall] (1,1,0) circle (0.1cm); 
\draw (1.1,1.15,1.05) node[scale=1.2, below] {\textbf{p}};   
\end{tikzpicture}
\end{document}

相关内容