# Lego Bricks in LaTeX

Who does not enjoy lego bricks, raise a hand! In this post, I am sharing an elegant and efficient way of plotting bricks under 3d view in TikZ. Briefly speaking, it utilizes canvas transforms to plot facets, and describes boundaries of studs in a simple way with cylindrical coordinates based on the azimuth angle (localizing extreme edges might be a challenge on its own).
While there are other packages, like TikZbricks, this method seems simpler in terms of complexity and brings some educational value in terms of cylinders geometry.

\documentclass[12pt]{standalone}

\usepackage{pgfplots}
\usepackage{tikz-3dplot}

\begin{document}

%  elevation and azimuth for 3D-view
\def\rotx{60}
\def\rotz{120}

\newcommand{\brick}[8]{
\pgfmathsetmacro{\posx}{#1}
\pgfmathsetmacro{\posy}{#2}
\pgfmathsetmacro{\posz}{#3}
\pgfmathsetmacro{\cubex}{#4}
\pgfmathsetmacro{\cubey}{#5}
\pgfmathsetmacro{\cubez}{#6}

% cube by rectangle facets
\begin{scope}
\begin{scope}[canvas is yx plane at z=\posz,transform shape]
\draw[fill=#8] (\posy,\posx) rectangle ++(\cubey,\cubex);
\end{scope}
\begin{scope}[canvas is yx plane at z=\posz+\cubez,transform shape]
\draw[fill=#8] (\posy,\posx) rectangle ++(\cubey,\cubex);
\end{scope}
\begin{scope}[canvas is yz plane at x=\posx+\cubex,transform shape]
\draw[fill=#8] (\posy,\posz) rectangle ++(\cubey,\cubez) node[pos=.5] {#7};
\end{scope}
\begin{scope}[canvas is xz plane at y=\posy+\cubey,transform shape]
\draw[fill=#8] (\posx,\posz) rectangle ++(\cubex,\cubez);
\end{scope}
\end{scope}

% studs by arcs and extreme edges
\foreach \i in {1,...,\cubey}{
\foreach \j in {1,...,\cubex}{
% upper part - full circle
% lower part - arc
\begin{scope}[canvas is xy plane at z=\posz+\cubez]
\end{scope}
\begin{scope}[shift={(\posx-0.5+\j,\posy-0.5+\i)}]
% edges easily identified in cylindrical coordinates!
\draw[] (edge1_top) -- (edge1_bottom);
\draw[] (edge1_top) -- (edge1_bottom);
\end{scope}
}
}
}

\tdplotsetmaincoords{\rotx}{\rotz}
\begin{tikzpicture}[tdplot_main_coords,]
% draw axes
\coordinate (O) at (0,0,0);
\coordinate (A) at (5,0,0);
\coordinate (B) at (0,5,0);
\coordinate (C) at (0,0,5);
\draw[-latex] (O) -- (A) node[below] {$x$};
\draw[-latex] (O) -- (B) node[above] {$y$};
\draw[-latex] (O) -- (C) node[left] {$z$};
% draw brick
\brick{0}{1}{0}{3}{3}{1}{Lego}{blue!50};
\brick{0}{1}{2}{2}{3}{1}{Enjoys}{green!50};
\brick{0}{1}{4}{1}{3}{1}{Everybody}{red!50};
\end{tikzpicture}

\end{document}