How to draw circles in an arbitrary plane
How to draw circles in an arbitrary plane
I would like to generate the following image of TikZ:
The closest resemblance on the examples is this post. However, I am not sure how to add the circles in the plane of the cubes. Any help is appreciated.
@Andrew Even though I agree with you to a large extent, I somehow cannot refrain from making a comment. If the OP would have just copied the code under the link, not disclosed its source, and posted it as his MWE, he would be drowning in upvotes. I personally like an honest reference and an honest "I am not sure how to add the circles in the plane of the cubes" better than the alternative which one sometimes encounters. I think the OP has done his homework, i.e. done some research, and asked a very clear question.
– marmot
Aug 22 at 18:42
@marmot In an ideal world the OP would post the code they found and give the link. The problem, as always, with external links is that they are likely to disappear at some point, significantly weakening the question.
– Andrew
Aug 22 at 20:41
@Andrew I fully agree with that statement, but given the world we live in I would like to argue that the present question is actually quite nice. It is clear and honest. Of course, like in most posts, there is room for improvement.
– marmot
Aug 22 at 21:29
@Andrew, thank you for the comments! I hadn't thought of the longevity of the post and the problem external posts may have in the long run. Any future posts will take this into account.
– Sid
Aug 23 at 8:44
1 Answer
1
documentclass[tikz,border=3.14mm]standalone
usetikzlibrary3d,decorations.markings,calc
usepackagetikz-3dplot
makeatletter % https://tex.stackexchange.com/a/48776/121799
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
makeatother
begindocument
foreach X in -50
tdplotsetmaincoords110X
begintikzpicture
%path[use as bounding box] (-6,-3) rectangle (6,5);
%node[anchor=north west] at (-6,5) X,xtest,ytest;
beginscope[tdplot_main_coords]
% ray in the back
draw [thick,blue,postaction=decorate,decoration=markings,mark=at position 0.2
with arrowstealth;] (-6,0,0) -- (0,0,0);
% back
filldraw[cyan,fill opacity=0.3] (-0.5,-2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (-0.5,-2,2) -- cycle;
% bottom
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,2,-2)
-- (0,2,-2) -- cycle;
% right
filldraw[cyan,fill opacity=0.1] (0,2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
% left
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,-2,2)
-- (0,-2,2) -- cycle;
% top
filldraw[cyan,fill opacity=0.1] (0,-2,2) -- (-0.5,-2,2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
%front
filldraw[cyan,fill opacity=0.1] (0,-2,-2) -- (0,2,-2) -- (0,2,2)
-- (0,-2,2) -- cycle;
% ray in front
draw[thick,blue] (0,0,0) -- (8,0,0);
beginscope[canvas is yz plane at x=8,xscale=-1,transform shape]
draw[gray] (-4,0) -- (4,0);
draw[gray] (0,-4) -- (0,4);
draw[red,thick] (0,0) circle (2);
node[circle,fill,red,inner sep=2pt] (A) at (45:2);
node[circle,fill,red,inner sep=2pt] (B) at (-135:2);
draw[gray] (A) circle (4.5pt) (B) circle (4.5pt);
draw[gray,shorten >=1.5pt,shorten <=1.5pt] (A)--(B);
endscope
draw[red] (A) -- (0,0,0) (B) -- (0,0,0);
endscope
endtikzpicture
foreach X in -50
tdplotsetmaincoords110X
begintikzpicture
%path[use as bounding box] (-6,-3) rectangle (6,5);
%node[anchor=north west] at (-6,5) X,xtest,ytest;
beginscope[tdplot_main_coords]
% ray in the back
draw [thick,blue,postaction=decorate,decoration=markings,mark=at position 0.2
with arrowstealth;] (-6,0,0) -- (0,0,0);
% back
filldraw[cyan,fill opacity=0.3] (-0.5,-2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (-0.5,-2,2) -- cycle;
% bottom
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,2,-2)
-- (0,2,-2) -- cycle;
% right
filldraw[cyan,fill opacity=0.1] (0,2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
% left
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,-2,2)
-- (0,-2,2) -- cycle;
% top
filldraw[cyan,fill opacity=0.1] (0,-2,2) -- (-0.5,-2,2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
%front
filldraw[cyan,fill opacity=0.1] (0,-2,-2) -- (0,2,-2) -- (0,2,2)
-- (0,-2,2) -- cycle;
% ray in front
draw[thick,blue] (0,0,0) -- (8,0,0);
beginscope[canvas is yz plane at x=8,xscale=-1,transform shape]
draw[gray] (-5,0) -- (5,0);
draw[gray] (0,-4) -- (0,4);
draw[red,thick] (1,0) circle (2);
draw[red,thick] (-1,0) circle (2);
node[circle,fill,red,inner sep=2pt] (A) at ($(1,0)+(45:2)$) ;
node[circle,fill,red,inner sep=2pt] (B) at ($(-1,0)+(-135:2)$) ;
draw[gray] (A) circle (4.5pt) (B) circle (4.5pt);
draw[gray,shorten >=1.5pt,shorten <=1.5pt] (A)--(B);
endscope
draw[red] (A) -- (0,0,0) (B) -- (0,0,0);
endscope
endtikzpicture
foreach X in -50
tdplotsetmaincoords110X
begintikzpicture
%path[use as bounding box] (-6,-3) rectangle (6,5);
%node[anchor=north west] at (-6,5) X,xtest,ytest;
beginscope[tdplot_main_coords]
% ray in the back
draw [thick,blue,postaction=decorate,decoration=markings,mark=at position 0.2
with arrowstealth;] (-6,0,0) -- (0,0,0);
% back
filldraw[cyan,fill opacity=0.3] (-0.5,-2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (-0.5,-2,2) -- cycle;
% bottom
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,2,-2)
-- (0,2,-2) -- cycle;
% right
filldraw[cyan,fill opacity=0.1] (0,2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
% left
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,-2,2)
-- (0,-2,2) -- cycle;
% top
filldraw[cyan,fill opacity=0.1] (0,-2,2) -- (-0.5,-2,2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
%front
filldraw[cyan,fill opacity=0.1] (0,-2,-2) -- (0,2,-2) -- (0,2,2)
-- (0,-2,2) -- cycle;
% ray in front
draw[thick,blue] (0,0,0) -- (8,0,0);
beginscope[canvas is yz plane at x=8,xscale=-1,transform shape]
draw[gray] (-5,0) -- (5,0);
draw[gray] (0,-4) -- (0,4);
draw[red,thick] (2,0) circle (2);
draw[red,thick] (-2,0) circle (2);
node[circle,fill,red,inner sep=2pt] (A) at ($(2,0)+(45:2)$) ;
node[circle,fill,red,inner sep=2pt] (B) at ($(-2,0)+(-135:2)$) ;
draw[gray] (A) circle (4.5pt) (B) circle (4.5pt);
draw[gray,shorten >=1.5pt,shorten <=1.5pt] (A)--(B);
endscope
draw[red] (A) -- (0,0,0) (B) -- (0,0,0);
endscope
endtikzpicture
foreach X in -50
tdplotsetmaincoords110X
begintikzpicture
%path[use as bounding box] (-6,-3) rectangle (6,5);
%node[anchor=north west] at (-6,5) X,xtest,ytest;
beginscope[tdplot_main_coords]
% ray in the back
draw [thick,blue,postaction=decorate,decoration=markings,mark=at position 0.2
with arrowstealth;] (-6,0,0) -- (0,0,0);
% back
filldraw[cyan,fill opacity=0.3] (-0.5,-2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (-0.5,-2,2) -- cycle;
% bottom
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,2,-2)
-- (0,2,-2) -- cycle;
% right
filldraw[cyan,fill opacity=0.1] (0,2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
% left
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,-2,2)
-- (0,-2,2) -- cycle;
% top
filldraw[cyan,fill opacity=0.1] (0,-2,2) -- (-0.5,-2,2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
%front
filldraw[cyan,fill opacity=0.1] (0,-2,-2) -- (0,2,-2) -- (0,2,2)
-- (0,-2,2) -- cycle;
% ray in front
draw[thick,blue] (0,0,0) -- (8,0,0);
beginscope[canvas is yz plane at x=8,xscale=-1,transform shape]
draw[gray] (-5,0) -- (5,0);
draw[gray] (0,-4) -- (0,4);
% draw[red,thick] (1,0) circle (2);
% draw[red,thick] (-1,0) circle (2);
node[circle,fill,red,inner sep=2pt] (A) at (2.5,0) ;
node[circle,fill,red,inner sep=2pt] (B) at (-2.5,0) ;
draw[gray] (A) circle (4.5pt) (B) circle (4.5pt);
%draw[gray,shorten >=1.5pt,shorten <=1.5pt] (A)--(B);
endscope
draw[red] (A) -- (0,0,0) (B) -- (0,0,0);
endscope
endtikzpicture
enddocument
And the nowadays mandatory animation can't be missing.
documentclass[tikz,border=3.14mm]standalone
usetikzlibrary3d,decorations.markings,calc
usepackagetikz-3dplot
makeatletter % https://tex.stackexchange.com/a/48776/121799
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
makeatother
begindocument
foreach Z in 0,0.075,...,4
pgfmathsetmacroXmin(Z,2)
pgfmathsetmacroYmin(4-Z,2)
tdplotsetmaincoords110-50
begintikzpicture
%path[use as bounding box] (-6,-3) rectangle (6,5);
%node[anchor=north west] at (-6,5) X,xtest,ytest;
beginscope[tdplot_main_coords]
% ray in the back
draw [thick,blue,postaction=decorate,decoration=markings,mark=at position 0.2
with arrowstealth;] (-6,0,0) -- (0,0,0);
% back
filldraw[cyan,fill opacity=0.3] (-0.5,-2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (-0.5,-2,2) -- cycle;
% bottom
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,2,-2)
-- (0,2,-2) -- cycle;
% right
filldraw[cyan,fill opacity=0.1] (0,2,-2) -- (-0.5,2,-2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
% left
filldraw[cyan,fill opacity=0.3] (0,-2,-2) -- (-0.5,-2,-2) -- (-0.5,-2,2)
-- (0,-2,2) -- cycle;
% top
filldraw[cyan,fill opacity=0.1] (0,-2,2) -- (-0.5,-2,2) -- (-0.5,2,2)
-- (0,2,2) -- cycle;
%front
filldraw[cyan,fill opacity=0.1] (0,-2,-2) -- (0,2,-2) -- (0,2,2)
-- (0,-2,2) -- cycle;
% ray in front
draw[thick,blue] (0,0,0) -- (8,0,0);
beginscope[canvas is yz plane at x=8,xscale=-1,transform shape]
draw[gray] (-5,0) -- (5,0);
draw[gray] (0,-4) -- (0,4);
draw[red,thick] (X,0) circle (Y);
draw[red,thick] (-X,0) circle (Y);
node[circle,fill,red,inner sep=2pt] (A) at ($(X,0)+(45:Y)$) ;
node[circle,fill,red,inner sep=2pt] (B) at ($(-X,0)+(-135:Y)$) ;
draw[gray] (A) circle (4.5pt) (B) circle (4.5pt);
draw[gray,shorten >=1.5pt,shorten <=1.5pt] (A)--(B);
endscope
draw[red] (A) -- (0,0,0) (B) -- (0,0,0);
endscope
endtikzpicture
enddocument
+1! You don't have to define
canvas is xy plane at z
, it's defined in the 3d
library.– Max
Aug 22 at 12:06
canvas is xy plane at z
3d
@Max Thanks! I know that it is defined there but the definition is wrong. I am not using this very canvas here but decided to carry the correct definition with me in order to avoid the complications I have experienced here, and to spare others to go through that.
– marmot
Aug 22 at 12:11
Ah I've never encountered that bug! Thanks for the heads-up
– Max
Aug 22 at 12:14
So the plane of the image is selected through tikzoption?
– Sid
Aug 22 at 13:42
@Sid Is there a
tikzoption
? The plane is selected/defined through beginscope[canvas is yz plane at x=8,xscale=-1,transform shape]
(xscale=-1
is just for convenience), and the view angles are specified in tdplotsetmaincoords110-50
. Thanks for updating the title of your nice question!– marmot
Aug 22 at 13:44
tikzoption
beginscope[canvas is yz plane at x=8,xscale=-1,transform shape]
xscale=-1
tdplotsetmaincoords110-50
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Welcome to TeX.SX! The short answer is that, yes, this is possible but I have to warn you that questions of the form "Please draw this for me" that show no effort on the part of OP, often don't get answered. You will get more help if you post some code showing what you have tried and give a minimal working example. A quick search on TeX.SX for drawing functions (with tikz or pstricks) will give you an idea of where to start from.
– Andrew
Aug 22 at 11:51