Incomplete cube Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)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?
How widely used is the term Treppenwitz? Is it something that most Germans know?
Using audio cues to encourage good posture
Can I cast Passwall to drop an enemy into a 20-foot pit?
Apollo command module space walk?
List of Python versions
Extract all GPU name, model and GPU ram
Generate an RGB colour grid
How to remove list items depending on predecessor in python
Understanding Ceva's Theorem
Why did the rest of the Eastern Bloc not invade Yugoslavia?
Why do people hide their license plates in the EU?
Is the Standard Deduction better than Itemized when both are the same amount?
Is it fair for a professor to grade us on the possession of past papers?
How do pianists reach extremely loud dynamics?
How does debian/ubuntu knows a package has a updated version
Can we see the USA flag on the Moon from Earth?
What does the "x" in "x86" represent?
Delete nth line from bottom
What would be the ideal power source for a cybernetic eye?
How much time will it take to get my passport back if I am applying for multiple Schengen visa countries?
Do I really need recursive chmod to restrict access to a folder?
How to call a function with default parameter through a pointer to function that is the return of another function?
How to find out what spells would be useless to a blind NPC spellcaster?
Why aren't air breathing engines used as small first stages
Incomplete cube
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)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 Apr 1 at 11:25
sheß
2,06511436
2,06511436
asked Apr 1 at 10:51
Benedito FreireBenedito Freire
1307
1307
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
Apr 1 at 19:22
@Werner Agree, thanks. Done.
– Kpym
Apr 1 at 19:30
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
Apr 1 at 20:23
@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
Apr 1 at 20:49
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
Apr 1 at 20:59
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
Apr 1 at 14:13
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 Apr 1 at 11:07
JouleVJouleV
14k22664
14k22664
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
Apr 1 at 19:22
@Werner Agree, thanks. Done.
– Kpym
Apr 1 at 19:30
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
Apr 1 at 20:23
@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
Apr 1 at 20:49
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
Apr 1 at 20:59
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
Apr 1 at 19:22
@Werner Agree, thanks. Done.
– Kpym
Apr 1 at 19:30
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
Apr 1 at 20:23
@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
Apr 1 at 20:49
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
Apr 1 at 20:59
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 Apr 1 at 19:30
answered Apr 1 at 11:49
KpymKpym
17.9k24192
17.9k24192
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
Apr 1 at 19:22
@Werner Agree, thanks. Done.
– Kpym
Apr 1 at 19:30
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
Apr 1 at 20:23
@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
Apr 1 at 20:49
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
Apr 1 at 20:59
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
Apr 1 at 19:22
@Werner Agree, thanks. Done.
– Kpym
Apr 1 at 19:30
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
Apr 1 at 20:23
@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
Apr 1 at 20:49
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
Apr 1 at 20:59
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
Apr 1 at 19:22
...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
Apr 1 at 19:22
@Werner Agree, thanks. Done.
– Kpym
Apr 1 at 19:30
@Werner Agree, thanks. Done.
– Kpym
Apr 1 at 19:30
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
Apr 1 at 20:23
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
Apr 1 at 20:23
@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
Apr 1 at 20:49
@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
Apr 1 at 20:49
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
Apr 1 at 20:59
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
Apr 1 at 20:59
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
Apr 1 at 14:13
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
Apr 1 at 14:13
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 Apr 1 at 14:11
marmotmarmot
118k6153288
118k6153288
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
Apr 1 at 14:13
add a comment |
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
Apr 1 at 14:13
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
Apr 1 at 14:13
"I would like to argue that one should use orthographic projections". Spoken like a true engineer! +1
– Steven B. Segletes
Apr 1 at 14:13
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