Incomplete cubePlaying around with a Rubik's Cube in TikZHow to draw a cube as the following?What is the correct way to typeset a vector when there is subscript or superscript?How can I put a coloured outline around fraction lines?Rotate a node but not its content: the case of the ellipse decorationHow to define the default vertical distance between nodes?Numerical conditional within tikz keys?Why do I get an extra white page before my TikZ picture?TikZ: Drawing an arc from an intersection to an intersectionShading inside a triangle when the coordinates of one vertex are calculated by TikZDrawing rectilinear curves in Tikz, aka an Etch-a-Sketch drawingLine up nested tikz enviroments or how to get rid of themHow to draw a square and its diagonals with arrows?
I would say: "You are another teacher", but she is a woman and I am a man
How do I deal with an unproductive colleague in a small company?
Why are the 737's rear doors unusable in a water landing?
What killed these X2 caps?
Plagiarism or not?
What does the expression "A Mann!" means
Should I cover my bicycle overnight while bikepacking?
Watching something be piped to a file live with tail
Why can't we play rap on piano?
Expand and Contract
Is "remove commented out code" correct English?
What are some good books on Machine Learning and AI like Krugman, Wells and Graddy's "Essentials of Economics"
A category-like structure without composition?
How to Recreate this in LaTeX? (Unsure What the Notation is Called)
Detention in 1997
Assassin's bullet with mercury
Is it acceptable for a professor to tell male students to not think that they are smarter than female students?
Little known, relatively unlikely, but scientifically plausible, apocalyptic (or near apocalyptic) events
Unlock My Phone! February 2018
Is it logically or scientifically possible to artificially send energy to the body?
Intersection Puzzle
Why doesn't using multiple commands with a || or && conditional work?
Is there a hemisphere-neutral way of specifying a season?
Why didn't Boeing produce its own regional jet?
Incomplete cube
Playing around with a Rubik's Cube in TikZHow to draw a cube as the following?What is the correct way to typeset a vector when there is subscript or superscript?How can I put a coloured outline around fraction lines?Rotate a node but not its content: the case of the ellipse decorationHow to define the default vertical distance between nodes?Numerical conditional within tikz keys?Why do I get an extra white page before my TikZ picture?TikZ: Drawing an arc from an intersection to an intersectionShading inside a triangle when the coordinates of one vertex are calculated by TikZDrawing rectilinear curves in Tikz, aka an Etch-a-Sketch drawingLine up nested tikz enviroments or how to get rid of themHow to draw a square and its diagonals with arrows?
I want to draw an incomplete cube, as in the following figure.
But, I can only draw a complete cube, see below.
documentclass[12pt]article
usepackagetikz
usepackageverbatim
usetikzlibrarypositioning
begindocument
begintikzpicture[on grid][scale=1.4]
shade[yslant=-0.5,right color=white, left color=white]
(0,0) rectangle +(3,3);
draw[yslant=-0.5] (0,0) grid (3,3);
shade[yslant=0.5,right color=white,left color=white]
(3,-3) rectangle +(3,3);
draw[yslant=0.5] (3,-3) grid (6,0);
shade[yslant=0.5,xslant=-1,bottom color=white,
top color=white] (6,3) rectangle +(-3,-3);
draw[yslant=0.5,xslant=-1] (3,0) grid (6,3);
endtikzpicture
enddocument
tikz-pgf
add a comment |
I want to draw an incomplete cube, as in the following figure.
But, I can only draw a complete cube, see below.
documentclass[12pt]article
usepackagetikz
usepackageverbatim
usetikzlibrarypositioning
begindocument
begintikzpicture[on grid][scale=1.4]
shade[yslant=-0.5,right color=white, left color=white]
(0,0) rectangle +(3,3);
draw[yslant=-0.5] (0,0) grid (3,3);
shade[yslant=0.5,right color=white,left color=white]
(3,-3) rectangle +(3,3);
draw[yslant=0.5] (3,-3) grid (6,0);
shade[yslant=0.5,xslant=-1,bottom color=white,
top color=white] (6,3) rectangle +(-3,-3);
draw[yslant=0.5,xslant=-1] (3,0) grid (6,3);
endtikzpicture
enddocument
tikz-pgf
add a comment |
I want to draw an incomplete cube, as in the following figure.
But, I can only draw a complete cube, see below.
documentclass[12pt]article
usepackagetikz
usepackageverbatim
usetikzlibrarypositioning
begindocument
begintikzpicture[on grid][scale=1.4]
shade[yslant=-0.5,right color=white, left color=white]
(0,0) rectangle +(3,3);
draw[yslant=-0.5] (0,0) grid (3,3);
shade[yslant=0.5,right color=white,left color=white]
(3,-3) rectangle +(3,3);
draw[yslant=0.5] (3,-3) grid (6,0);
shade[yslant=0.5,xslant=-1,bottom color=white,
top color=white] (6,3) rectangle +(-3,-3);
draw[yslant=0.5,xslant=-1] (3,0) grid (6,3);
endtikzpicture
enddocument
tikz-pgf
I want to draw an incomplete cube, as in the following figure.
But, I can only draw a complete cube, see below.
documentclass[12pt]article
usepackagetikz
usepackageverbatim
usetikzlibrarypositioning
begindocument
begintikzpicture[on grid][scale=1.4]
shade[yslant=-0.5,right color=white, left color=white]
(0,0) rectangle +(3,3);
draw[yslant=-0.5] (0,0) grid (3,3);
shade[yslant=0.5,right color=white,left color=white]
(3,-3) rectangle +(3,3);
draw[yslant=0.5] (3,-3) grid (6,0);
shade[yslant=0.5,xslant=-1,bottom color=white,
top color=white] (6,3) rectangle +(-3,-3);
draw[yslant=0.5,xslant=-1] (3,0) grid (6,3);
endtikzpicture
enddocument
tikz-pgf
tikz-pgf
edited 2 days ago
sheß
2,05011436
2,05011436
asked 2 days ago
Benedito FreireBenedito Freire
1107
1107
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
Just for fun: everything is in 2D
documentclass[tikz]standalone
begindocument
begintikzpicture
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
With colors
documentclass[tikz]standalone
begindocument
begintikzpicture
fill[black!70] (3,0)--(3.6,.6)--(3.6,2.6)--(3.4,2.4)--(3.4,1.4)--(3,1)--cycle (2.4,2.4)--(2.6,2.6)--(2.6,3.6)--(2.4,3.4)--(2.4,1.4)--(2,1)--(2,2)--cycle (1,2)--(1.4,2.4)--(1.4,3.4)--(1,3)--cycle;
fill[black!30] (0,3)--(.6,3.6)-_(2.6,3.6)--(2.4,3.4)--(1.4,3.4)--(1,3)--cycle (2.4,2.4)--(2.6,2.6)--(3.6,2.6)--(3.4,2.4)--(1.4,2.4)--(1,2)--(2,2)--cycle (2,1)--(2.4,1.4)--(3.4,1.4)--(3,1)--cycle;
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
add a comment |
You can define a single cube as pic
and place it where you want (starting from bottom back to top front).
documentclass[tikz,border=7pt]standalone
tikzset
cube/.pic=
draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0);
draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0);
draw[fill=white] (0,0,0) rectangle (1,1,0);
begindocument
tikz[z=(.4,.3)]pathpgfextradef~piccube % <--- to make the code shorter
(2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~
(2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~
(0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;
enddocument
1
...better to use the redefined~
version inside a group, even if it's just to shorten your code. As in,begingroup def~piccode begintikzpicture ... endtikzpicture
.
– Werner
2 days ago
@Werner Agree, thanks. Done.
– Kpym
2 days ago
Thepgfextra
and...
only to avoidand
? ` tikz[z=(.4,.3)]def~piccube path (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~ (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~ (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;`
– marmot
2 days ago
@marmot I never avoid shorter code in general ;) But here, as redefining~
is not a good practice, I decided to follow the comment of @Werner and to make its definition as local as possible : so local to the path is better to local for the entire tikz.
– Kpym
2 days ago
If that's your aim:documentclass[tikz,border=7pt]standalone tikzset cube/.pic= draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0); draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0); draw[fill=white] (0,0,0) rectangle (1,1,0); ,icube/.style=insert path=#1 piccube begindocument tikz[z=(.4,.3)]path[icube/.list=(2,0,2),(2,0,1),(0,0,0),(1,0,0),(2,0,0), (2,1,2),(1,1,1),(0,1,0),(1,1,0), (0,2,2),(1,2,2),(0,2,1),(0,2,0)]; enddocument
– marmot
2 days ago
add a comment |
I would like to argue that one should use orthographic projections and write it in such a way that one can change the view angle. There are already many posts on this, perhaps most impressingly this one. The idea to use pic
s for the unit cubes to draw 3d cubes with some little cubes missing is also not new, it has been used here, where the cubes are rotatable in 3d. I just recycled the code to get
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
usetikzlibrarycalc
tikzsetplane/.style n args=3insert path=%
#1 -- ++ #2 -- ++ #3 -- ++ ($-1*#2$) -- cycle,
unit xy plane/.style=plane=#1(1,0,0)(0,1,0),
unit xz plane/.style=plane=#1(1,0,0)(0,0,1),
unit yz plane/.style=plane=#1(0,1,0)(0,0,1),
get projections/.style=insert path=%
let p1=(1,0,0),p2=(0,1,0) in
[/utils/exec=pgfmathtruncatemacroxprojsign(x1)xdefxprojxproj
pgfmathtruncatemacroyprojsign(x2)xdefyprojyproj
pgfmathtruncatemacrozprojsign(cos(tdplotmaintheta))xdefzprojzproj],
pics/unit cube/.style=code=
path[get projections];
draw (0,0,0) -- (1,1,1);
ifnumzproj=-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,0)];
fi
ifnumyproj=1
path[3d cube/every face,3d cube/yz face,unit yz plane=(1,0,0)];
else
path[3d cube/every face,3d cube/yz face,unit yz plane=(0,0,0)];
fi
ifnumxproj=1
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,0,0)];
else
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,1,0)];
fi
ifnumzproj>-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,1)];
fi
,
3d cube/.cd,
xy face/.style=fill=gray!20,
xz face/.style=fill=gray!50,
yz face/.style=fill=gray!90,
every face/.style=draw,very thick
begindocument
foreach Angle in 5,15,...,355
tdplotsetmaincoords60Angle % the first argument cannot be larger than 90
begintikzpicture[line join=round]
pgfmathtruncatemacroNumCubes7
path[use as bounding box] (-NumCubes/2-3,-NumCubes/2-2)
rectangle (NumCubes/2+3,NumCubes/2+4);
beginscope[tdplot_main_coords]
pgfmathtruncatemacroNextToLastNumCubes-1
path[get projections];
ifnumyproj=1
defLstX1,2,3
else
defLstX3,2,1
fi
ifnumxproj=-1
defLstY1,2,3
else
defLstY3,2,1
fi
foreach X in LstX
foreach Y in LstY
ifnumY=3
pgfmathtruncatemacroZmax5-max(X,2)
else
pgfmathtruncatemacroZmax4-X
fi
foreach Z in 1,...,Zmax
path (X-2,Y-2,Z-1) picunit cube;
endscope
endtikzpicture
enddocument
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
2 days ago
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "85"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f482561%2fincomplete-cube%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Just for fun: everything is in 2D
documentclass[tikz]standalone
begindocument
begintikzpicture
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
With colors
documentclass[tikz]standalone
begindocument
begintikzpicture
fill[black!70] (3,0)--(3.6,.6)--(3.6,2.6)--(3.4,2.4)--(3.4,1.4)--(3,1)--cycle (2.4,2.4)--(2.6,2.6)--(2.6,3.6)--(2.4,3.4)--(2.4,1.4)--(2,1)--(2,2)--cycle (1,2)--(1.4,2.4)--(1.4,3.4)--(1,3)--cycle;
fill[black!30] (0,3)--(.6,3.6)-_(2.6,3.6)--(2.4,3.4)--(1.4,3.4)--(1,3)--cycle (2.4,2.4)--(2.6,2.6)--(3.6,2.6)--(3.4,2.4)--(1.4,2.4)--(1,2)--(2,2)--cycle (2,1)--(2.4,1.4)--(3.4,1.4)--(3,1)--cycle;
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
add a comment |
Just for fun: everything is in 2D
documentclass[tikz]standalone
begindocument
begintikzpicture
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
With colors
documentclass[tikz]standalone
begindocument
begintikzpicture
fill[black!70] (3,0)--(3.6,.6)--(3.6,2.6)--(3.4,2.4)--(3.4,1.4)--(3,1)--cycle (2.4,2.4)--(2.6,2.6)--(2.6,3.6)--(2.4,3.4)--(2.4,1.4)--(2,1)--(2,2)--cycle (1,2)--(1.4,2.4)--(1.4,3.4)--(1,3)--cycle;
fill[black!30] (0,3)--(.6,3.6)-_(2.6,3.6)--(2.4,3.4)--(1.4,3.4)--(1,3)--cycle (2.4,2.4)--(2.6,2.6)--(3.6,2.6)--(3.4,2.4)--(1.4,2.4)--(1,2)--(2,2)--cycle (2,1)--(2.4,1.4)--(3.4,1.4)--(3,1)--cycle;
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
add a comment |
Just for fun: everything is in 2D
documentclass[tikz]standalone
begindocument
begintikzpicture
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
With colors
documentclass[tikz]standalone
begindocument
begintikzpicture
fill[black!70] (3,0)--(3.6,.6)--(3.6,2.6)--(3.4,2.4)--(3.4,1.4)--(3,1)--cycle (2.4,2.4)--(2.6,2.6)--(2.6,3.6)--(2.4,3.4)--(2.4,1.4)--(2,1)--(2,2)--cycle (1,2)--(1.4,2.4)--(1.4,3.4)--(1,3)--cycle;
fill[black!30] (0,3)--(.6,3.6)-_(2.6,3.6)--(2.4,3.4)--(1.4,3.4)--(1,3)--cycle (2.4,2.4)--(2.6,2.6)--(3.6,2.6)--(3.4,2.4)--(1.4,2.4)--(1,2)--(2,2)--cycle (2,1)--(2.4,1.4)--(3.4,1.4)--(3,1)--cycle;
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
Just for fun: everything is in 2D
documentclass[tikz]standalone
begindocument
begintikzpicture
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
With colors
documentclass[tikz]standalone
begindocument
begintikzpicture
fill[black!70] (3,0)--(3.6,.6)--(3.6,2.6)--(3.4,2.4)--(3.4,1.4)--(3,1)--cycle (2.4,2.4)--(2.6,2.6)--(2.6,3.6)--(2.4,3.4)--(2.4,1.4)--(2,1)--(2,2)--cycle (1,2)--(1.4,2.4)--(1.4,3.4)--(1,3)--cycle;
fill[black!30] (0,3)--(.6,3.6)-_(2.6,3.6)--(2.4,3.4)--(1.4,3.4)--(1,3)--cycle (2.4,2.4)--(2.6,2.6)--(3.6,2.6)--(3.4,2.4)--(1.4,2.4)--(1,2)--(2,2)--cycle (2,1)--(2.4,1.4)--(3.4,1.4)--(3,1)--cycle;
draw (0,0) rectangle (1,1) (1,1) rectangle (2,2) (0,1) rectangle (1,2) (0,2) rectangle (1,3) (1,0) rectangle (2,1) (2,0) rectangle (3,1);
draw (3.6,1.6)--(3.6,.6)--(3,0)--(3,1)--cycle--(3.6,2.6)--(2.6,2.6)--(2.6,3.6)--(.6,3.6)--(0,3);
draw (2,1)--(2.4,1.4) (2,2)--(2.6,2.6) (1,2)--(1.4,2.4) (1,3)--(1.6,3.6) (2.4,3.4)--(2.6,3.6) (3.4,2.4)--(3.6,2.6);
draw (2.4,1.4) rectangle (3.4,2.4) (1.4,2.4) rectangle (2.4,3.4);
draw (.4,3.4)--(1.4,3.4) (3.4,1.4)--(3.4,.4) (.2,3.2)--(1.2,3.2)--(1.2,2.2)--(2.2,2.2)--(2.2,1.2)--(3.2,1.2)--(3.2,.2);
endtikzpicture
enddocument
answered 2 days ago
JouleVJouleV
10.3k22558
10.3k22558
add a comment |
add a comment |
You can define a single cube as pic
and place it where you want (starting from bottom back to top front).
documentclass[tikz,border=7pt]standalone
tikzset
cube/.pic=
draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0);
draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0);
draw[fill=white] (0,0,0) rectangle (1,1,0);
begindocument
tikz[z=(.4,.3)]pathpgfextradef~piccube % <--- to make the code shorter
(2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~
(2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~
(0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;
enddocument
1
...better to use the redefined~
version inside a group, even if it's just to shorten your code. As in,begingroup def~piccode begintikzpicture ... endtikzpicture
.
– Werner
2 days ago
@Werner Agree, thanks. Done.
– Kpym
2 days ago
Thepgfextra
and...
only to avoidand
? ` tikz[z=(.4,.3)]def~piccube path (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~ (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~ (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;`
– marmot
2 days ago
@marmot I never avoid shorter code in general ;) But here, as redefining~
is not a good practice, I decided to follow the comment of @Werner and to make its definition as local as possible : so local to the path is better to local for the entire tikz.
– Kpym
2 days ago
If that's your aim:documentclass[tikz,border=7pt]standalone tikzset cube/.pic= draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0); draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0); draw[fill=white] (0,0,0) rectangle (1,1,0); ,icube/.style=insert path=#1 piccube begindocument tikz[z=(.4,.3)]path[icube/.list=(2,0,2),(2,0,1),(0,0,0),(1,0,0),(2,0,0), (2,1,2),(1,1,1),(0,1,0),(1,1,0), (0,2,2),(1,2,2),(0,2,1),(0,2,0)]; enddocument
– marmot
2 days ago
add a comment |
You can define a single cube as pic
and place it where you want (starting from bottom back to top front).
documentclass[tikz,border=7pt]standalone
tikzset
cube/.pic=
draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0);
draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0);
draw[fill=white] (0,0,0) rectangle (1,1,0);
begindocument
tikz[z=(.4,.3)]pathpgfextradef~piccube % <--- to make the code shorter
(2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~
(2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~
(0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;
enddocument
1
...better to use the redefined~
version inside a group, even if it's just to shorten your code. As in,begingroup def~piccode begintikzpicture ... endtikzpicture
.
– Werner
2 days ago
@Werner Agree, thanks. Done.
– Kpym
2 days ago
Thepgfextra
and...
only to avoidand
? ` tikz[z=(.4,.3)]def~piccube path (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~ (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~ (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;`
– marmot
2 days ago
@marmot I never avoid shorter code in general ;) But here, as redefining~
is not a good practice, I decided to follow the comment of @Werner and to make its definition as local as possible : so local to the path is better to local for the entire tikz.
– Kpym
2 days ago
If that's your aim:documentclass[tikz,border=7pt]standalone tikzset cube/.pic= draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0); draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0); draw[fill=white] (0,0,0) rectangle (1,1,0); ,icube/.style=insert path=#1 piccube begindocument tikz[z=(.4,.3)]path[icube/.list=(2,0,2),(2,0,1),(0,0,0),(1,0,0),(2,0,0), (2,1,2),(1,1,1),(0,1,0),(1,1,0), (0,2,2),(1,2,2),(0,2,1),(0,2,0)]; enddocument
– marmot
2 days ago
add a comment |
You can define a single cube as pic
and place it where you want (starting from bottom back to top front).
documentclass[tikz,border=7pt]standalone
tikzset
cube/.pic=
draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0);
draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0);
draw[fill=white] (0,0,0) rectangle (1,1,0);
begindocument
tikz[z=(.4,.3)]pathpgfextradef~piccube % <--- to make the code shorter
(2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~
(2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~
(0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;
enddocument
You can define a single cube as pic
and place it where you want (starting from bottom back to top front).
documentclass[tikz,border=7pt]standalone
tikzset
cube/.pic=
draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0);
draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0);
draw[fill=white] (0,0,0) rectangle (1,1,0);
begindocument
tikz[z=(.4,.3)]pathpgfextradef~piccube % <--- to make the code shorter
(2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~
(2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~
(0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;
enddocument
edited 2 days ago
answered 2 days ago
KpymKpym
17.6k24191
17.6k24191
1
...better to use the redefined~
version inside a group, even if it's just to shorten your code. As in,begingroup def~piccode begintikzpicture ... endtikzpicture
.
– Werner
2 days ago
@Werner Agree, thanks. Done.
– Kpym
2 days ago
Thepgfextra
and...
only to avoidand
? ` tikz[z=(.4,.3)]def~piccube path (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~ (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~ (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;`
– marmot
2 days ago
@marmot I never avoid shorter code in general ;) But here, as redefining~
is not a good practice, I decided to follow the comment of @Werner and to make its definition as local as possible : so local to the path is better to local for the entire tikz.
– Kpym
2 days ago
If that's your aim:documentclass[tikz,border=7pt]standalone tikzset cube/.pic= draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0); draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0); draw[fill=white] (0,0,0) rectangle (1,1,0); ,icube/.style=insert path=#1 piccube begindocument tikz[z=(.4,.3)]path[icube/.list=(2,0,2),(2,0,1),(0,0,0),(1,0,0),(2,0,0), (2,1,2),(1,1,1),(0,1,0),(1,1,0), (0,2,2),(1,2,2),(0,2,1),(0,2,0)]; enddocument
– marmot
2 days ago
add a comment |
1
...better to use the redefined~
version inside a group, even if it's just to shorten your code. As in,begingroup def~piccode begintikzpicture ... endtikzpicture
.
– Werner
2 days ago
@Werner Agree, thanks. Done.
– Kpym
2 days ago
Thepgfextra
and...
only to avoidand
? ` tikz[z=(.4,.3)]def~piccube path (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~ (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~ (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;`
– marmot
2 days ago
@marmot I never avoid shorter code in general ;) But here, as redefining~
is not a good practice, I decided to follow the comment of @Werner and to make its definition as local as possible : so local to the path is better to local for the entire tikz.
– Kpym
2 days ago
If that's your aim:documentclass[tikz,border=7pt]standalone tikzset cube/.pic= draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0); draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0); draw[fill=white] (0,0,0) rectangle (1,1,0); ,icube/.style=insert path=#1 piccube begindocument tikz[z=(.4,.3)]path[icube/.list=(2,0,2),(2,0,1),(0,0,0),(1,0,0),(2,0,0), (2,1,2),(1,1,1),(0,1,0),(1,1,0), (0,2,2),(1,2,2),(0,2,1),(0,2,0)]; enddocument
– marmot
2 days ago
1
1
...better to use the redefined
~
version inside a group, even if it's just to shorten your code. As in, begingroup def~piccode begintikzpicture ... endtikzpicture
.– Werner
2 days ago
...better to use the redefined
~
version inside a group, even if it's just to shorten your code. As in, begingroup def~piccode begintikzpicture ... endtikzpicture
.– Werner
2 days ago
@Werner Agree, thanks. Done.
– Kpym
2 days ago
@Werner Agree, thanks. Done.
– Kpym
2 days ago
The
pgfextra
and ...
only to avoid
and
? ` tikz[z=(.4,.3)]def~piccube path (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~ (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~ (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;`– marmot
2 days ago
The
pgfextra
and ...
only to avoid
and
? ` tikz[z=(.4,.3)]def~piccube path (2,0,2)~(2,0,1)~(0,0,0)~(1,0,0)~(2,0,0)~ (2,1,2)~(1,1,1)~(0,1,0)~(1,1,0)~ (0,2,2)~(1,2,2)~(0,2,1)~(0,2,0)~;`– marmot
2 days ago
@marmot I never avoid shorter code in general ;) But here, as redefining
~
is not a good practice, I decided to follow the comment of @Werner and to make its definition as local as possible : so local to the path is better to local for the entire tikz.– Kpym
2 days ago
@marmot I never avoid shorter code in general ;) But here, as redefining
~
is not a good practice, I decided to follow the comment of @Werner and to make its definition as local as possible : so local to the path is better to local for the entire tikz.– Kpym
2 days ago
If that's your aim:
documentclass[tikz,border=7pt]standalone tikzset cube/.pic= draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0); draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0); draw[fill=white] (0,0,0) rectangle (1,1,0); ,icube/.style=insert path=#1 piccube begindocument tikz[z=(.4,.3)]path[icube/.list=(2,0,2),(2,0,1),(0,0,0),(1,0,0),(2,0,0), (2,1,2),(1,1,1),(0,1,0),(1,1,0), (0,2,2),(1,2,2),(0,2,1),(0,2,0)]; enddocument
– marmot
2 days ago
If that's your aim:
documentclass[tikz,border=7pt]standalone tikzset cube/.pic= draw[fill=black!20] (0,1,0) -- (0,1,1) -- (1,1,1) -- (1,1,0); draw[fill=black!50] (1,0,0) -- (1,0,1) -- (1,1,1) -- (1,1,0); draw[fill=white] (0,0,0) rectangle (1,1,0); ,icube/.style=insert path=#1 piccube begindocument tikz[z=(.4,.3)]path[icube/.list=(2,0,2),(2,0,1),(0,0,0),(1,0,0),(2,0,0), (2,1,2),(1,1,1),(0,1,0),(1,1,0), (0,2,2),(1,2,2),(0,2,1),(0,2,0)]; enddocument
– marmot
2 days ago
add a comment |
I would like to argue that one should use orthographic projections and write it in such a way that one can change the view angle. There are already many posts on this, perhaps most impressingly this one. The idea to use pic
s for the unit cubes to draw 3d cubes with some little cubes missing is also not new, it has been used here, where the cubes are rotatable in 3d. I just recycled the code to get
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
usetikzlibrarycalc
tikzsetplane/.style n args=3insert path=%
#1 -- ++ #2 -- ++ #3 -- ++ ($-1*#2$) -- cycle,
unit xy plane/.style=plane=#1(1,0,0)(0,1,0),
unit xz plane/.style=plane=#1(1,0,0)(0,0,1),
unit yz plane/.style=plane=#1(0,1,0)(0,0,1),
get projections/.style=insert path=%
let p1=(1,0,0),p2=(0,1,0) in
[/utils/exec=pgfmathtruncatemacroxprojsign(x1)xdefxprojxproj
pgfmathtruncatemacroyprojsign(x2)xdefyprojyproj
pgfmathtruncatemacrozprojsign(cos(tdplotmaintheta))xdefzprojzproj],
pics/unit cube/.style=code=
path[get projections];
draw (0,0,0) -- (1,1,1);
ifnumzproj=-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,0)];
fi
ifnumyproj=1
path[3d cube/every face,3d cube/yz face,unit yz plane=(1,0,0)];
else
path[3d cube/every face,3d cube/yz face,unit yz plane=(0,0,0)];
fi
ifnumxproj=1
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,0,0)];
else
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,1,0)];
fi
ifnumzproj>-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,1)];
fi
,
3d cube/.cd,
xy face/.style=fill=gray!20,
xz face/.style=fill=gray!50,
yz face/.style=fill=gray!90,
every face/.style=draw,very thick
begindocument
foreach Angle in 5,15,...,355
tdplotsetmaincoords60Angle % the first argument cannot be larger than 90
begintikzpicture[line join=round]
pgfmathtruncatemacroNumCubes7
path[use as bounding box] (-NumCubes/2-3,-NumCubes/2-2)
rectangle (NumCubes/2+3,NumCubes/2+4);
beginscope[tdplot_main_coords]
pgfmathtruncatemacroNextToLastNumCubes-1
path[get projections];
ifnumyproj=1
defLstX1,2,3
else
defLstX3,2,1
fi
ifnumxproj=-1
defLstY1,2,3
else
defLstY3,2,1
fi
foreach X in LstX
foreach Y in LstY
ifnumY=3
pgfmathtruncatemacroZmax5-max(X,2)
else
pgfmathtruncatemacroZmax4-X
fi
foreach Z in 1,...,Zmax
path (X-2,Y-2,Z-1) picunit cube;
endscope
endtikzpicture
enddocument
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
2 days ago
add a comment |
I would like to argue that one should use orthographic projections and write it in such a way that one can change the view angle. There are already many posts on this, perhaps most impressingly this one. The idea to use pic
s for the unit cubes to draw 3d cubes with some little cubes missing is also not new, it has been used here, where the cubes are rotatable in 3d. I just recycled the code to get
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
usetikzlibrarycalc
tikzsetplane/.style n args=3insert path=%
#1 -- ++ #2 -- ++ #3 -- ++ ($-1*#2$) -- cycle,
unit xy plane/.style=plane=#1(1,0,0)(0,1,0),
unit xz plane/.style=plane=#1(1,0,0)(0,0,1),
unit yz plane/.style=plane=#1(0,1,0)(0,0,1),
get projections/.style=insert path=%
let p1=(1,0,0),p2=(0,1,0) in
[/utils/exec=pgfmathtruncatemacroxprojsign(x1)xdefxprojxproj
pgfmathtruncatemacroyprojsign(x2)xdefyprojyproj
pgfmathtruncatemacrozprojsign(cos(tdplotmaintheta))xdefzprojzproj],
pics/unit cube/.style=code=
path[get projections];
draw (0,0,0) -- (1,1,1);
ifnumzproj=-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,0)];
fi
ifnumyproj=1
path[3d cube/every face,3d cube/yz face,unit yz plane=(1,0,0)];
else
path[3d cube/every face,3d cube/yz face,unit yz plane=(0,0,0)];
fi
ifnumxproj=1
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,0,0)];
else
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,1,0)];
fi
ifnumzproj>-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,1)];
fi
,
3d cube/.cd,
xy face/.style=fill=gray!20,
xz face/.style=fill=gray!50,
yz face/.style=fill=gray!90,
every face/.style=draw,very thick
begindocument
foreach Angle in 5,15,...,355
tdplotsetmaincoords60Angle % the first argument cannot be larger than 90
begintikzpicture[line join=round]
pgfmathtruncatemacroNumCubes7
path[use as bounding box] (-NumCubes/2-3,-NumCubes/2-2)
rectangle (NumCubes/2+3,NumCubes/2+4);
beginscope[tdplot_main_coords]
pgfmathtruncatemacroNextToLastNumCubes-1
path[get projections];
ifnumyproj=1
defLstX1,2,3
else
defLstX3,2,1
fi
ifnumxproj=-1
defLstY1,2,3
else
defLstY3,2,1
fi
foreach X in LstX
foreach Y in LstY
ifnumY=3
pgfmathtruncatemacroZmax5-max(X,2)
else
pgfmathtruncatemacroZmax4-X
fi
foreach Z in 1,...,Zmax
path (X-2,Y-2,Z-1) picunit cube;
endscope
endtikzpicture
enddocument
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
2 days ago
add a comment |
I would like to argue that one should use orthographic projections and write it in such a way that one can change the view angle. There are already many posts on this, perhaps most impressingly this one. The idea to use pic
s for the unit cubes to draw 3d cubes with some little cubes missing is also not new, it has been used here, where the cubes are rotatable in 3d. I just recycled the code to get
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
usetikzlibrarycalc
tikzsetplane/.style n args=3insert path=%
#1 -- ++ #2 -- ++ #3 -- ++ ($-1*#2$) -- cycle,
unit xy plane/.style=plane=#1(1,0,0)(0,1,0),
unit xz plane/.style=plane=#1(1,0,0)(0,0,1),
unit yz plane/.style=plane=#1(0,1,0)(0,0,1),
get projections/.style=insert path=%
let p1=(1,0,0),p2=(0,1,0) in
[/utils/exec=pgfmathtruncatemacroxprojsign(x1)xdefxprojxproj
pgfmathtruncatemacroyprojsign(x2)xdefyprojyproj
pgfmathtruncatemacrozprojsign(cos(tdplotmaintheta))xdefzprojzproj],
pics/unit cube/.style=code=
path[get projections];
draw (0,0,0) -- (1,1,1);
ifnumzproj=-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,0)];
fi
ifnumyproj=1
path[3d cube/every face,3d cube/yz face,unit yz plane=(1,0,0)];
else
path[3d cube/every face,3d cube/yz face,unit yz plane=(0,0,0)];
fi
ifnumxproj=1
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,0,0)];
else
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,1,0)];
fi
ifnumzproj>-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,1)];
fi
,
3d cube/.cd,
xy face/.style=fill=gray!20,
xz face/.style=fill=gray!50,
yz face/.style=fill=gray!90,
every face/.style=draw,very thick
begindocument
foreach Angle in 5,15,...,355
tdplotsetmaincoords60Angle % the first argument cannot be larger than 90
begintikzpicture[line join=round]
pgfmathtruncatemacroNumCubes7
path[use as bounding box] (-NumCubes/2-3,-NumCubes/2-2)
rectangle (NumCubes/2+3,NumCubes/2+4);
beginscope[tdplot_main_coords]
pgfmathtruncatemacroNextToLastNumCubes-1
path[get projections];
ifnumyproj=1
defLstX1,2,3
else
defLstX3,2,1
fi
ifnumxproj=-1
defLstY1,2,3
else
defLstY3,2,1
fi
foreach X in LstX
foreach Y in LstY
ifnumY=3
pgfmathtruncatemacroZmax5-max(X,2)
else
pgfmathtruncatemacroZmax4-X
fi
foreach Z in 1,...,Zmax
path (X-2,Y-2,Z-1) picunit cube;
endscope
endtikzpicture
enddocument
I would like to argue that one should use orthographic projections and write it in such a way that one can change the view angle. There are already many posts on this, perhaps most impressingly this one. The idea to use pic
s for the unit cubes to draw 3d cubes with some little cubes missing is also not new, it has been used here, where the cubes are rotatable in 3d. I just recycled the code to get
documentclass[tikz,border=3.14mm]standalone
usepackagetikz-3dplot
usetikzlibrarycalc
tikzsetplane/.style n args=3insert path=%
#1 -- ++ #2 -- ++ #3 -- ++ ($-1*#2$) -- cycle,
unit xy plane/.style=plane=#1(1,0,0)(0,1,0),
unit xz plane/.style=plane=#1(1,0,0)(0,0,1),
unit yz plane/.style=plane=#1(0,1,0)(0,0,1),
get projections/.style=insert path=%
let p1=(1,0,0),p2=(0,1,0) in
[/utils/exec=pgfmathtruncatemacroxprojsign(x1)xdefxprojxproj
pgfmathtruncatemacroyprojsign(x2)xdefyprojyproj
pgfmathtruncatemacrozprojsign(cos(tdplotmaintheta))xdefzprojzproj],
pics/unit cube/.style=code=
path[get projections];
draw (0,0,0) -- (1,1,1);
ifnumzproj=-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,0)];
fi
ifnumyproj=1
path[3d cube/every face,3d cube/yz face,unit yz plane=(1,0,0)];
else
path[3d cube/every face,3d cube/yz face,unit yz plane=(0,0,0)];
fi
ifnumxproj=1
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,0,0)];
else
path[3d cube/every face,3d cube/xz face,unit xz plane=(0,1,0)];
fi
ifnumzproj>-1
path[3d cube/every face,3d cube/xy face,unit xy plane=(0,0,1)];
fi
,
3d cube/.cd,
xy face/.style=fill=gray!20,
xz face/.style=fill=gray!50,
yz face/.style=fill=gray!90,
every face/.style=draw,very thick
begindocument
foreach Angle in 5,15,...,355
tdplotsetmaincoords60Angle % the first argument cannot be larger than 90
begintikzpicture[line join=round]
pgfmathtruncatemacroNumCubes7
path[use as bounding box] (-NumCubes/2-3,-NumCubes/2-2)
rectangle (NumCubes/2+3,NumCubes/2+4);
beginscope[tdplot_main_coords]
pgfmathtruncatemacroNextToLastNumCubes-1
path[get projections];
ifnumyproj=1
defLstX1,2,3
else
defLstX3,2,1
fi
ifnumxproj=-1
defLstY1,2,3
else
defLstY3,2,1
fi
foreach X in LstX
foreach Y in LstY
ifnumY=3
pgfmathtruncatemacroZmax5-max(X,2)
else
pgfmathtruncatemacroZmax4-X
fi
foreach Z in 1,...,Zmax
path (X-2,Y-2,Z-1) picunit cube;
endscope
endtikzpicture
enddocument
answered 2 days ago
marmotmarmot
114k5145276
114k5145276
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
2 days ago
add a comment |
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
2 days ago
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
2 days ago
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
2 days ago
add a comment |
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f482561%2fincomplete-cube%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown