使用 tikz/pstricks 绘制 3D 晶格

使用 tikz/pstricks 绘制 3D 晶格

我需要绘制 DO3 类型的 3D 晶格(Ni-Mn-Al,DO3) 和更复杂的对象。TiKZ 和 PSTricks 包都会在之前绘制的对象之上绘制以下对象,而不考虑“真实”的 3D 位置。例如,在这张图片上,右侧的 2 个红色原子覆盖了白色原子,而它们不应该覆盖白色原子。

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[->]
\draw (0,0) -- (4,0,0);
\draw (0,0) -- (0,4,0);
\draw (0,0) -- (0,0,4);
\foreach \x in {1,2,3}
\foreach \y in {1,2,3}
\foreach \z in {1,2,3}
        \draw (\x,\y,\z) circle (2pt);
\foreach \x in {1.5,2.5}
\foreach \y in {1.5,2.5}
\foreach \z in {1,2,3}
        \draw[gray,very thin] (\x,\y,\z) +(-.5,-.5) rectangle ++(.5,.5);
\foreach \x in {1,2,3}
        \draw (\x,1,1) -- (\x,1,3) (\x,2,1) -- (\x,2,3) (\x,3,1) -- (\x,3,3)  ;

\foreach \x in {1.5,2.5}
\foreach \y in {1.5,2.5}
\foreach \z in {1.5,2.5}
        \filldraw[red] (\x,\y,\z) circle (2pt);
\end{tikzpicture}
\end{document}

有可能通过图层或特定顺序的绘图获得正确的行为。然而,对于复杂的网格来说,这非常困难,并且取决于视角。

答案1

这是一个渐近线解决方案:

\documentclass{standalone}
\usepackage{asymptote}

\begin{document}

\begin{asy}[width=10cm,height=10cm]
import three;

currentprojection=perspective(300,-650,500,center=true);


// define two types of ions
surface iona = scale3(20)*unitsphere;
surface ionb = scale3(25)*unitsphere;

// surface properties and color of the ions
material White = material(diffusepen=gray(0.4),emissivepen=gray(0.6));
material Red = material(diffusepen=red,emissivepen=lightred);

// style of lines connecting ions
pen thick=linewidth(2);

for(int x=-1; x<2; ++x) {
  for(int y=-1; y<2; ++y) {
    for(int z=-1; z<2; ++z) {
      draw(shift(100*(x,y,z))*iona,White);
    }
  }
}

for(int x=-1; x<2; ++x) {
  for(int y=-1; y<2; ++y) {
    for(int z=-1; z<2; ++z) {
      if(x<1) draw(100*(x,y,z)--100*(x+1,y,z),thick);
      if(y<1) draw(100*(x,y,z)--100*(x,y+1,z),thick);
      if(z<1) draw(100*(x,y,z)--100*(x,y,z+1),thick);
    }
  }
}

for(int x=-1; x<2; x+=2) {
  for(int y=-1; y<2; y+=2) {
    for(int z=-1; z<2; z+=2) {
      draw(shift(50*(x,y,z))*ionb,Red);
    }
  }
}
\end{asy}


\end{document}

要编译,首先pdflatex在文件上运行,然后asy在生成的.asy文件上运行,最后pdflatex再运行一次或两次。

水晶格子

相关内容