Tikz 현실적인 3D 그리드

Tikz 현실적인 3D 그리드

시각적으로 혼란스럽지 않은 tikz를 사용하여 3D 아이소메트릭 그리드/격자를 그려야 합니다. 최소한 6x6x6이어야 하지만 더 커질 수도 있습니다. 나는 그것이 화면에 들어갈 때 배경으로 페이드되거나 크기가 줄어들기를 원합니다. 각 좌표에 작은 텍스트 노드를 배치하겠습니다. 어떤 예에서는 점으로 충분합니다.

이는 다음과 유사하다http://www.texample.net/tikz/examples/lattice-points/3D를 제외하고. 가장 큰 문제는 3D에서 쉽게 볼 수 있도록 하는 방법을 찾는 것입니다.

답변1

이 같은? 그리고 당신은 아이소메트릭(각도 30/150/90)을 원하지 않습니다. 저를 믿으세요 ;)

암호

\documentclass[tikz]{standalone}
\usetikzlibrary{3d}

\begin{document}

\newcommand{\xangle}{15}
\newcommand{\yangle}{153}
\newcommand{\zangle}{90}

\newcommand{\xlength}{1}
\newcommand{\ylength}{1}
\newcommand{\zlength}{1}

\newcommand{\dimension}{5}% actually dimension-1

\pgfmathsetmacro{\xx}{\xlength*cos(\xangle)}
\pgfmathsetmacro{\xy}{\xlength*sin(\xangle)}
\pgfmathsetmacro{\yx}{\ylength*cos(\yangle)}
\pgfmathsetmacro{\yy}{\ylength*sin(\yangle)}
\pgfmathsetmacro{\zx}{\zlength*cos(\zangle)}
\pgfmathsetmacro{\zy}{\zlength*sin(\zangle)}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
    y={(\yx cm,\yy cm)},
    z={(\zx cm,\zy cm)},
]
\foreach \a in {0,...,\dimension}
{   \foreach \b in {0,...,\dimension}
    {   \pgfmathsetmacro{\c}{100-\a*7-\b*7}
        \draw[canvas is xy plane at z=\a, black!\c] (\b,0) -- (\b,\dimension) (0,\b) -- (\dimension,\b);
        \draw[canvas is xz plane at y=\a, black!\c] (\b,0) -- (\b,\dimension) (0,\b) -- (\dimension,\b);
        \draw[canvas is yz plane at x=\a, black!\c] (\b,0) -- (\b,\dimension) (0,\b) -- (\dimension,\b);
    }
}

\foreach \a in {0,...,\dimension}
{   \foreach \b in {0,...,\dimension}
    {   \foreach \c in {0,...,\dimension}
        {   \fill (\a,\b,\c) circle (0.05cm);
        }
    }
}   
\end{tikzpicture}

\end{document}

결과

여기에 이미지 설명을 입력하세요


편집 1:몇 가지 개선 사항: 페이딩 계산이 더 향상되었으며 직육면체가 뒤에서 앞으로 구성됩니다(if zangle≈270, yangle≈150, xangle≈30). 큐브여야 할까요, 아니면 직육면체면 충분할까요?

암호

\documentclass[tikz]{standalone}
\usetikzlibrary{3d}
\usepackage{xifthen}

\begin{document}

\newcommand{\xangle}{11}
\newcommand{\yangle}{133}
\newcommand{\zangle}{270}

\newcommand{\xlength}{1}
\newcommand{\ylength}{1}
\newcommand{\zlength}{1}

% nice result for 30 150 270 1 1.414 1.732
% nice result for 11 133 270 1 1 1

\newcommand{\dimension}{6}% actually dimension-1

\pgfmathsetmacro{\xx}{\xlength*cos(\xangle)}
\pgfmathsetmacro{\xy}{\xlength*sin(\xangle)}
\pgfmathsetmacro{\yx}{\ylength*cos(\yangle)}
\pgfmathsetmacro{\yy}{\ylength*sin(\yangle)}
\pgfmathsetmacro{\zx}{\zlength*cos(\zangle)}
\pgfmathsetmacro{\zy}{\zlength*sin(\zangle)}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
    y={(\yx cm,\yy cm)},
    z={(\zx cm,\zy cm)},
]

\foreach \x in {\dimension,...,0}
{   \foreach \y in {\dimension,...,0}
    {   \foreach \z in {\dimension,...,0}
        {   \pgfmathsetmacro{\c}{100-(\x*\y*\z)/(\dimension*\dimension*\dimension)*95}
            \ifthenelse{\x>0}
                {\draw[black!\c] (\x,\y,\z) -- (\x-1,\y,\z);}{}
            \ifthenelse{\y>0}
                {\draw[black!\c] (\x,\y,\z) -- (\x,\y-1,\z);}{}
            \ifthenelse{\z>0}
                {\draw[black!\c] (\x,\y,\z) -- (\x,\y,\z-1);}{}     
            \fill[red!\c] (\x,\y,\z) circle (0.05cm);   
        }
    }
}

\foreach \x/\y/\z/\lab in {0/0/4/Bla,1/5/0/Bli,1/1/1/Blubb} 
{   \fill[blue] (\x,\y,\z) circle (0.05cm) node[fill=white,rounded corners=2mm,fill opacity=0.5,text opacity=1,above right,inner sep=2pt] {\lab};
}   

\end{tikzpicture}

\end{document}

산출

여기에 이미지 설명을 입력하세요

출력 직육면체

\newcommand{\xangle}{30}
\newcommand{\yangle}{150}
\newcommand{\zangle}{270}

\newcommand{\xlength}{1}
\newcommand{\ylength}{1.414}
\newcommand{\zlength}{1.732}

여기에 이미지 설명을 입력하세요

답변2

함께 달리다latex->dvips->ps2pdf

\documentclass{article}
\usepackage{pst-gr3d}\SpecialCoor
\begin{document}

\psset{unit=1.3cm}
\PstGridThreeD[GridThreeDNodes](1,2,2)
\psset{arrows=<->,arrowscale=2}
\ThreeDput[normal=0 0 -1](0,0,0){%
  \ncloop[linecolor=red,arm=0.35,loopsize=0.6,
          angleA=-90,angleB=90]{Gr3dNode022}{Gr3dNode002}
  \ncloop[linecolor=green,arm=0.7,nodesepA=0.18,nodesepB=0.12,
           loopsize=-0.5,angleA=180]{Gr3dNode002}{Gr3dNode102}}
\qquad%
\PstGridThreeD[GridThreeDNodes](4,3,3)
\nccurve[ncurv=2,linecolor=red]{->}{Gr3dNode000}{Gr3dNode433}

\end{document}

여기에 이미지 설명을 입력하세요

답변3

다음은 Tom Bombadil의 제안에서 상당 부분을 훔친 것입니다.답변, 일종의 페이딩이 있습니다.

\documentclass[tikz]{standalone}
\usetikzlibrary{3d}

\begin{document}

\newcommand{\xangle}{15}
\newcommand{\yangle}{153}
\newcommand{\zangle}{90}

\newcommand{\xlength}{1}
\newcommand{\ylength}{1}
\newcommand{\zlength}{1}

\newcommand{\dimension}{5}% actually dimension-1

\pgfmathsetmacro{\xx}{\xlength*cos(\xangle)}
\pgfmathsetmacro{\xy}{\xlength*sin(\xangle)}
\pgfmathsetmacro{\yx}{\ylength*cos(\yangle)}
\pgfmathsetmacro{\yy}{\ylength*sin(\yangle)}
\pgfmathsetmacro{\zx}{\zlength*cos(\zangle)}
\pgfmathsetmacro{\zy}{\zlength*sin(\zangle)}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
    y={(\yx cm,\yy cm)},
    z={(\zx cm,\zy cm)},
]
\pgfmathtruncatemacro{\dimmax}{\dimension+3}
\foreach \a in {0,...,\dimmax}
{ \pgfmathtruncatemacro{\dima}{min(\dimension+\a,\dimension+3)}  \foreach \b in {0,...,\dima}
    { \pgfmathtruncatemacro{\dimb}{\dimension+\b+1}
    \ifnum\a<\dimb 
    \pgfmathtruncatemacro{\dimb}{\dimension+\b-\a} \foreach \c in {0,...,\dimension}
        {
        \pgfmathsetmacro{\opa}{max(1-0.12*sqrt(\a^2+\b^2),0)}
        \begin{scope}[opacity=\opa]   
        \fill (\a,\b,\c) circle (0.05cm);
        \draw[canvas is xy plane at z=\c] (\a,\b) -- (\a,\b+1) (\a,\b) -- (\a+1,\b);
        \ifnum\c<\dimension
        \draw[canvas is xz plane at y=\b] (\a,\c) -- (\a,\c+1);
        \fi
        \end{scope}
        }
    \else
    \fi
    }
}   
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

관련 정보