How can I make a cone from a cube and view the cube with different angles?Different sibling angles at the...
I’m planning on buying a laser printer but concerned about the life cycle of toner in the machine
Voyeurism but not really
US citizen flying to France today and my passport expires in less than 2 months
How did the USSR manage to innovate in an environment characterized by government censorship and high bureaucracy?
How to find program name(s) of an installed package?
Writing rule stating superpower from different root cause is bad writing
Risk of getting Chronic Wasting Disease (CWD) in the United States?
A newer friend of my brother's gave him a load of baseball cards that are supposedly extremely valuable. Is this a scam?
What typically incentivizes a professor to change jobs to a lower ranking university?
Why, historically, did Gödel think CH was false?
Why are 150k or 200k jobs considered good when there are 300k+ births a month?
What defenses are there against being summoned by the Gate spell?
Can I ask the recruiters in my resume to put the reason why I am rejected?
How can I prevent hyper evolved versions of regular creatures from wiping out their cousins?
Watching something be written to a file live with tail
Have astronauts in space suits ever taken selfies? If so, how?
Is it unprofessional to ask if a job posting on GlassDoor is real?
Schoenfled Residua test shows proportionality hazard assumptions holds but Kaplan-Meier plots intersect
Approximately how much travel time was saved by the opening of the Suez Canal in 1869?
Is it possible to do 50 km distance without any previous training?
"You are your self first supporter", a more proper way to say it
Minkowski space
How is the claim "I am in New York only if I am in America" the same as "If I am in New York, then I am in America?
Theorems that impeded progress
How can I make a cone from a cube and view the cube with different angles?
Different sibling angles at the same level when using mindmapLabeling the lengths and angles in a diagram with measurementshow to achieve and draw the final rotation of a frame with Euler angles.how I can select view in 3d tikz? and how I can change view?How can I make a 3D representation of a potential wellHow Can I draw a cube of cubes efficiently?How can I draw this cone exactly?How to make a 2D sphere with decreasing radial gradientCone in Latex with right angles and LabelHow can I draw this cylinder with 3D?
I am trying to draw a cone with vertex C and base is circle BDG and want to view the cube with different angles like some following pictures.

I tried
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz,tikz-3dplot}
usepackage{fouriernc}
usepackage{tkz-euclide}
usetkzobj{all}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
makeatother
% based on tex.stackexchange.com/a/12033/…
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,ultra thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
begin{scope}[tdplot_screen_coords]
fill[ball color=gray, opacity=0.1] (I) circle (r); % 3D lighting effect
end{scope}
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(E) --(F) --(G)-- (H) --cycle
(C)--(D) --(H)--(G)--cycle
;
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D)
;
draw[dashed, blue] (B) -- (D);
end{tikzpicture}
end{document}
I got

My questions are:
- How can I draw some generators (not
CB, CG, CD) of the cone? - How can I view the cube with different angles?


tikz-pgf tikz-3dplot
add a comment |
I am trying to draw a cone with vertex C and base is circle BDG and want to view the cube with different angles like some following pictures.

I tried
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz,tikz-3dplot}
usepackage{fouriernc}
usepackage{tkz-euclide}
usetkzobj{all}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
makeatother
% based on tex.stackexchange.com/a/12033/…
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,ultra thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
begin{scope}[tdplot_screen_coords]
fill[ball color=gray, opacity=0.1] (I) circle (r); % 3D lighting effect
end{scope}
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(E) --(F) --(G)-- (H) --cycle
(C)--(D) --(H)--(G)--cycle
;
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D)
;
draw[dashed, blue] (B) -- (D);
end{tikzpicture}
end{document}
I got

My questions are:
- How can I draw some generators (not
CB, CG, CD) of the cone? - How can I view the cube with different angles?


tikz-pgf tikz-3dplot
add a comment |
I am trying to draw a cone with vertex C and base is circle BDG and want to view the cube with different angles like some following pictures.

I tried
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz,tikz-3dplot}
usepackage{fouriernc}
usepackage{tkz-euclide}
usetkzobj{all}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
makeatother
% based on tex.stackexchange.com/a/12033/…
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,ultra thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
begin{scope}[tdplot_screen_coords]
fill[ball color=gray, opacity=0.1] (I) circle (r); % 3D lighting effect
end{scope}
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(E) --(F) --(G)-- (H) --cycle
(C)--(D) --(H)--(G)--cycle
;
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D)
;
draw[dashed, blue] (B) -- (D);
end{tikzpicture}
end{document}
I got

My questions are:
- How can I draw some generators (not
CB, CG, CD) of the cone? - How can I view the cube with different angles?


tikz-pgf tikz-3dplot
I am trying to draw a cone with vertex C and base is circle BDG and want to view the cube with different angles like some following pictures.

I tried
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz,tikz-3dplot}
usepackage{fouriernc}
usepackage{tkz-euclide}
usetkzobj{all}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
makeatother
% based on tex.stackexchange.com/a/12033/…
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,ultra thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
begin{scope}[tdplot_screen_coords]
fill[ball color=gray, opacity=0.1] (I) circle (r); % 3D lighting effect
end{scope}
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(E) --(F) --(G)-- (H) --cycle
(C)--(D) --(H)--(G)--cycle
;
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D)
;
draw[dashed, blue] (B) -- (D);
end{tikzpicture}
end{document}
I got

My questions are:
- How can I draw some generators (not
CB, CG, CD) of the cone? - How can I view the cube with different angles?


tikz-pgf tikz-3dplot
tikz-pgf tikz-3dplot
edited 10 hours ago
TeXnician
25.9k63491
25.9k63491
asked 11 hours ago
minhthien_2016minhthien_2016
1,4741917
1,4741917
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
TikZ does not have a 3d engine, so one has to distinguish many cases. I hope this does not contain too many bugs. (There is also something that keeps track of the bounding boxes, meaning you have to compile the file twice.)
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz-3dplot}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
defSaveBBox{%
immediatewrite@mainaux{xdefstringxmin{xmin}relax}
immediatewrite@mainaux{xdefstringxmax{xmax}relax}
immediatewrite@mainaux{xdefstringymin{ymin}relax}
immediatewrite@mainaux{xdefstringymax{ymax}relax}}
makeatother
% based on tex.stackexchange.com/a/12033/AAA
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
foreach Angle in {5,15,...,355} % {5}
{
tdplotsetmaincoords{70}{Angle}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
ifdefinedxmin
else
defxmin{0}
fi
ifdefinedxmax
else
defxmax{0}
fi
ifdefinedymin
else
defymin{0}
fi
ifdefinedymax
else
defymax{0}
fi
path[tdplot_screen_coords] (xmin pt,ymin pt) rectangle (xmax pt,ymax pt);
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[very thick] (E) --(F) --(G)-- (H) --cycle;
ifnumAngle<90
draw[very thick] (D) --(A) --(B) (D) -- (H) (A)--(E) (B) -- (F);
draw[dashed, thick] (D) -- (C) -- (B) (C) -- (G);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (F) -- (G) -- (H) -- (D) -- (A) -- (B) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) --(A) --(B) -- (C) -- (G) (B) -- (F);
draw[dashed, thick] (A) -- (D) -- (C) (D) -- (H);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<150
clip (G) -- (H) -- (E) -- (A) -- (B) -- cycle [reverseclip];
else
clip (B) -- (C) -- (G) -- cycle [reverseclip];
fi
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(C)--(D) --(H)--(G)--cycle ;
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<270
draw[very thick] (F) -- (B) -- (C) -- (D) -- (H) (C) -- (G);
draw[dashed, thick] (B) -- (A) -- (D) (A) -- (E);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<230
clip (G) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (B) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
else
draw[very thick] (G) -- (C) -- (D) -- (A) -- (E) (D) -- (H);
draw[dashed, thick] (A) -- (B) -- (C) (B) -- (F);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<300
clip (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (D) -- (A) -- (E) -- (H) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
fi
fi
fi
fi
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
draw[dashed, blue] (B) -- (D);
path[tdplot_screen_coords] let p1=(current bounding box.south west),
p2=(current bounding box.north east)
in [/utils/exec=pgfmathsetmacro{xmin}{min(xmin pt,x1)}
pgfmathsetmacro{xmax}{max(xmax pt,x2)}
pgfmathsetmacro{ymin}{min(ymin pt,y1)}
pgfmathsetmacro{ymax}{max(ymax pt,y2)}
xdefxmin{xmin}xdefxmax{xmax}xdefymin{ymin}xdefymax{ymax}];
%node[tdplot_screen_coords] at (current bounding box.center) {angle=Angle};
SaveBBox
end{tikzpicture}
}
end{document}

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%2f483509%2fhow-can-i-make-a-cone-from-a-cube-and-view-the-cube-with-different-angles%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
TikZ does not have a 3d engine, so one has to distinguish many cases. I hope this does not contain too many bugs. (There is also something that keeps track of the bounding boxes, meaning you have to compile the file twice.)
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz-3dplot}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
defSaveBBox{%
immediatewrite@mainaux{xdefstringxmin{xmin}relax}
immediatewrite@mainaux{xdefstringxmax{xmax}relax}
immediatewrite@mainaux{xdefstringymin{ymin}relax}
immediatewrite@mainaux{xdefstringymax{ymax}relax}}
makeatother
% based on tex.stackexchange.com/a/12033/AAA
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
foreach Angle in {5,15,...,355} % {5}
{
tdplotsetmaincoords{70}{Angle}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
ifdefinedxmin
else
defxmin{0}
fi
ifdefinedxmax
else
defxmax{0}
fi
ifdefinedymin
else
defymin{0}
fi
ifdefinedymax
else
defymax{0}
fi
path[tdplot_screen_coords] (xmin pt,ymin pt) rectangle (xmax pt,ymax pt);
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[very thick] (E) --(F) --(G)-- (H) --cycle;
ifnumAngle<90
draw[very thick] (D) --(A) --(B) (D) -- (H) (A)--(E) (B) -- (F);
draw[dashed, thick] (D) -- (C) -- (B) (C) -- (G);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (F) -- (G) -- (H) -- (D) -- (A) -- (B) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) --(A) --(B) -- (C) -- (G) (B) -- (F);
draw[dashed, thick] (A) -- (D) -- (C) (D) -- (H);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<150
clip (G) -- (H) -- (E) -- (A) -- (B) -- cycle [reverseclip];
else
clip (B) -- (C) -- (G) -- cycle [reverseclip];
fi
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(C)--(D) --(H)--(G)--cycle ;
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<270
draw[very thick] (F) -- (B) -- (C) -- (D) -- (H) (C) -- (G);
draw[dashed, thick] (B) -- (A) -- (D) (A) -- (E);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<230
clip (G) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (B) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
else
draw[very thick] (G) -- (C) -- (D) -- (A) -- (E) (D) -- (H);
draw[dashed, thick] (A) -- (B) -- (C) (B) -- (F);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<300
clip (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (D) -- (A) -- (E) -- (H) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
fi
fi
fi
fi
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
draw[dashed, blue] (B) -- (D);
path[tdplot_screen_coords] let p1=(current bounding box.south west),
p2=(current bounding box.north east)
in [/utils/exec=pgfmathsetmacro{xmin}{min(xmin pt,x1)}
pgfmathsetmacro{xmax}{max(xmax pt,x2)}
pgfmathsetmacro{ymin}{min(ymin pt,y1)}
pgfmathsetmacro{ymax}{max(ymax pt,y2)}
xdefxmin{xmin}xdefxmax{xmax}xdefymin{ymin}xdefymax{ymax}];
%node[tdplot_screen_coords] at (current bounding box.center) {angle=Angle};
SaveBBox
end{tikzpicture}
}
end{document}

add a comment |
TikZ does not have a 3d engine, so one has to distinguish many cases. I hope this does not contain too many bugs. (There is also something that keeps track of the bounding boxes, meaning you have to compile the file twice.)
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz-3dplot}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
defSaveBBox{%
immediatewrite@mainaux{xdefstringxmin{xmin}relax}
immediatewrite@mainaux{xdefstringxmax{xmax}relax}
immediatewrite@mainaux{xdefstringymin{ymin}relax}
immediatewrite@mainaux{xdefstringymax{ymax}relax}}
makeatother
% based on tex.stackexchange.com/a/12033/AAA
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
foreach Angle in {5,15,...,355} % {5}
{
tdplotsetmaincoords{70}{Angle}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
ifdefinedxmin
else
defxmin{0}
fi
ifdefinedxmax
else
defxmax{0}
fi
ifdefinedymin
else
defymin{0}
fi
ifdefinedymax
else
defymax{0}
fi
path[tdplot_screen_coords] (xmin pt,ymin pt) rectangle (xmax pt,ymax pt);
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[very thick] (E) --(F) --(G)-- (H) --cycle;
ifnumAngle<90
draw[very thick] (D) --(A) --(B) (D) -- (H) (A)--(E) (B) -- (F);
draw[dashed, thick] (D) -- (C) -- (B) (C) -- (G);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (F) -- (G) -- (H) -- (D) -- (A) -- (B) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) --(A) --(B) -- (C) -- (G) (B) -- (F);
draw[dashed, thick] (A) -- (D) -- (C) (D) -- (H);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<150
clip (G) -- (H) -- (E) -- (A) -- (B) -- cycle [reverseclip];
else
clip (B) -- (C) -- (G) -- cycle [reverseclip];
fi
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(C)--(D) --(H)--(G)--cycle ;
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<270
draw[very thick] (F) -- (B) -- (C) -- (D) -- (H) (C) -- (G);
draw[dashed, thick] (B) -- (A) -- (D) (A) -- (E);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<230
clip (G) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (B) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
else
draw[very thick] (G) -- (C) -- (D) -- (A) -- (E) (D) -- (H);
draw[dashed, thick] (A) -- (B) -- (C) (B) -- (F);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<300
clip (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (D) -- (A) -- (E) -- (H) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
fi
fi
fi
fi
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
draw[dashed, blue] (B) -- (D);
path[tdplot_screen_coords] let p1=(current bounding box.south west),
p2=(current bounding box.north east)
in [/utils/exec=pgfmathsetmacro{xmin}{min(xmin pt,x1)}
pgfmathsetmacro{xmax}{max(xmax pt,x2)}
pgfmathsetmacro{ymin}{min(ymin pt,y1)}
pgfmathsetmacro{ymax}{max(ymax pt,y2)}
xdefxmin{xmin}xdefxmax{xmax}xdefymin{ymin}xdefymax{ymax}];
%node[tdplot_screen_coords] at (current bounding box.center) {angle=Angle};
SaveBBox
end{tikzpicture}
}
end{document}

add a comment |
TikZ does not have a 3d engine, so one has to distinguish many cases. I hope this does not contain too many bugs. (There is also something that keeps track of the bounding boxes, meaning you have to compile the file twice.)
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz-3dplot}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
defSaveBBox{%
immediatewrite@mainaux{xdefstringxmin{xmin}relax}
immediatewrite@mainaux{xdefstringxmax{xmax}relax}
immediatewrite@mainaux{xdefstringymin{ymin}relax}
immediatewrite@mainaux{xdefstringymax{ymax}relax}}
makeatother
% based on tex.stackexchange.com/a/12033/AAA
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
foreach Angle in {5,15,...,355} % {5}
{
tdplotsetmaincoords{70}{Angle}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
ifdefinedxmin
else
defxmin{0}
fi
ifdefinedxmax
else
defxmax{0}
fi
ifdefinedymin
else
defymin{0}
fi
ifdefinedymax
else
defymax{0}
fi
path[tdplot_screen_coords] (xmin pt,ymin pt) rectangle (xmax pt,ymax pt);
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[very thick] (E) --(F) --(G)-- (H) --cycle;
ifnumAngle<90
draw[very thick] (D) --(A) --(B) (D) -- (H) (A)--(E) (B) -- (F);
draw[dashed, thick] (D) -- (C) -- (B) (C) -- (G);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (F) -- (G) -- (H) -- (D) -- (A) -- (B) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) --(A) --(B) -- (C) -- (G) (B) -- (F);
draw[dashed, thick] (A) -- (D) -- (C) (D) -- (H);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<150
clip (G) -- (H) -- (E) -- (A) -- (B) -- cycle [reverseclip];
else
clip (B) -- (C) -- (G) -- cycle [reverseclip];
fi
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(C)--(D) --(H)--(G)--cycle ;
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<270
draw[very thick] (F) -- (B) -- (C) -- (D) -- (H) (C) -- (G);
draw[dashed, thick] (B) -- (A) -- (D) (A) -- (E);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<230
clip (G) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (B) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
else
draw[very thick] (G) -- (C) -- (D) -- (A) -- (E) (D) -- (H);
draw[dashed, thick] (A) -- (B) -- (C) (B) -- (F);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<300
clip (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (D) -- (A) -- (E) -- (H) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
fi
fi
fi
fi
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
draw[dashed, blue] (B) -- (D);
path[tdplot_screen_coords] let p1=(current bounding box.south west),
p2=(current bounding box.north east)
in [/utils/exec=pgfmathsetmacro{xmin}{min(xmin pt,x1)}
pgfmathsetmacro{xmax}{max(xmax pt,x2)}
pgfmathsetmacro{ymin}{min(ymin pt,y1)}
pgfmathsetmacro{ymax}{max(ymax pt,y2)}
xdefxmin{xmin}xdefxmax{xmax}xdefymin{ymin}xdefymax{ymax}];
%node[tdplot_screen_coords] at (current bounding box.center) {angle=Angle};
SaveBBox
end{tikzpicture}
}
end{document}

TikZ does not have a 3d engine, so one has to distinguish many cases. I hope this does not contain too many bugs. (There is also something that keeps track of the bounding boxes, meaning you have to compile the file twice.)
documentclass[border=2mm,12pt,tikz]{standalone}
usepackage{tikz-3dplot}
makeatletter
newcounter{smuggle}
DeclareRobustCommandsmuggleone[1]{%
stepcounter{smuggle}%
expandafterglobalexpandafterletcsname smuggle@arabic{smuggle}endcsname#1%
aftergroupletaftergroup#1expandafteraftergroupcsname smuggle@arabic{smuggle}endcsname
}
DeclareRobustCommandsmuggle[2][1]{%
smuggleone{#2}%
ifnum#1>1
aftergroupsmuggleaftergroup[expandafteraftergroupthenumexpr#1-1aftergroup]aftergroup#2%
fi
}
defSaveBBox{%
immediatewrite@mainaux{xdefstringxmin{xmin}relax}
immediatewrite@mainaux{xdefstringxmax{xmax}relax}
immediatewrite@mainaux{xdefstringymin{ymin}relax}
immediatewrite@mainaux{xdefstringymax{ymax}relax}}
makeatother
% based on tex.stackexchange.com/a/12033/AAA
tikzset{reverseclip/.style={insert path={(current bounding box.south west)rectangle
(current bounding box.north east)} }}
defparsecoord(#1,#2,#3)>(#4,#5,#6){%
def#4{#1}%
def#5{#2}%
def#6{#3}%
smuggle{#4}%
smuggle{#5}%
smuggle{#6}%
}
defSPTD(#1,#2,#3).(#4,#5,#6){((#1)*(#4)+1*(#2)*(#5)+1*(#3)*(#6))}
defVPTD(#1,#2,#3)x(#4,#5,#6){((#2)*(#6)-1*(#3)*(#5),(#3)*(#4)-1*(#1)*(#6),(#1)*(#5)-1*(#2)*(#4))}
defVecMinus(#1,#2,#3)-(#4,#5,#6){(#1-1*(#4),#2-1*(#5),#3-1*(#6))}
defVecAdd(#1,#2,#3)+(#4,#5,#6){(#1+1*(#4),#2+1*(#5),#3+1*(#6))}
newcommand{RotationAnglesForPlaneWithNormal}[5]{%typeout{N=(#1,#2,#3)}
foreach XS in {1,-1}
{foreach YS in {1,-1}
{pgfmathsetmacro{mybeta}{XS*acos(#3)}
pgfmathsetmacro{myalpha}{YS*acos(#1/sin(mybeta))}
pgfmathsetmacro{ntest}{abs(cos(myalpha)*sin(mybeta)-#1)%
+abs(sin(myalpha)*sin(mybeta)-#2)+abs(cos(mybeta)-#3)}
ifdimntest pt<0.1pt
xdef#4{myalpha}
xdef#5{mybeta}
fi
}}
}
tikzset{circle in plane with normal/.style args={#1 with radius #2 around #3}{
/utils/exec={edeftemp{noexpandparsecoord#1>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
temp
pgfmathsetmacro{myNx}{myNx}
pgfmathsetmacro{myNy}{myNy}
pgfmathsetmacro{myNz}{myNz}
pgfmathsetmacro{myNormalization}{sqrt(pow(myNx,2)+pow(myNy,2)+pow(myNz,2))}
pgfmathsetmacro{myNx}{myNx/myNormalization}
pgfmathsetmacro{myNy}{myNy/myNormalization}
pgfmathsetmacro{myNz}{myNz/myNormalization}
% compute the rotation angles that transform us in the corresponding plabe
RotationAnglesForPlaneWithNormal{myNx}{myNy}{myNz}{tmpalpha}{tmpbeta}
%typeout{N=(myNx,myNy,myNz),alpha=tmpalpha,beta=tmpbeta,r=#2,#3}
tdplotsetrotatedcoords{tmpalpha}{tmpbeta}{0}},
insert path={[tdplot_rotated_coords,canvas is xy plane at z=0,transform shape]
#3 circle[radius=#2]}
}}
begin{document}
tdplotsetmaincoords{70}{195}
foreach Angle in {5,15,...,355} % {5}
{
tdplotsetmaincoords{70}{Angle}
begin{tikzpicture}[tdplot_main_coords,scale=1,line join = round, line cap = round]
ifdefinedxmin
else
defxmin{0}
fi
ifdefinedxmax
else
defxmax{0}
fi
ifdefinedymin
else
defymin{0}
fi
ifdefinedymax
else
defymax{0}
fi
path[tdplot_screen_coords] (xmin pt,ymin pt) rectangle (xmax pt,ymax pt);
pgfmathsetmacroa{3}
pgfmathsetmacror{2/3*sqrt(6)*a}
path
coordinate (A) at (a,-a,-a)
coordinate (B) at (a,a,-a)
coordinate (C) at (-a,a,-a)
coordinate (D) at (-a,-a,-a)
coordinate (E) at ($(A)+ (0,0,2*a)$)
coordinate (F) at ($(B)+ (0,0,2*a)$)
coordinate (G) at ($(C)+ (0,0,2*a)$)
coordinate (H) at ($(D)+ (0,0,2*a)$)
coordinate (O) at (0,0,0)
coordinate (I) at (-1/3*a, 1/3*a, -1/3*a)
;
parsecoord(a,a,-a)>(myBx,myBy,myBz)
parsecoord(-a,a,a)>(myGx,myGy,myGz)
parsecoord(-a,-a,-a)>(myDx,myDy,myDz)
defmynormal{VPTD({myDx-myBx},{myDy-myBy},{myDz-myBz})x({myDx-myGx},{myDy-myGy},{myDz-myGz})}
edeftemp{noexpandparsecoordmynormal>(noexpandmyNx,noexpandmyNy,noexpandmyNz)}
draw[very thick, blue] (G) -- (D) (G) -- (B);
draw[very thick] (E) --(F) --(G)-- (H) --cycle;
ifnumAngle<90
draw[very thick] (D) --(A) --(B) (D) -- (H) (A)--(E) (B) -- (F);
draw[dashed, thick] (D) -- (C) -- (B) (C) -- (G);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (F) -- (G) -- (H) -- (D) -- (A) -- (B) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) --(A) --(B) -- (C) -- (G) (B) -- (F);
draw[dashed, thick] (A) -- (D) -- (C) (D) -- (H);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<150
clip (G) -- (H) -- (E) -- (A) -- (B) -- cycle [reverseclip];
else
clip (B) -- (C) -- (G) -- cycle [reverseclip];
fi
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<180
draw[very thick] (E) -- (F) -- (B)
(B) --(C)--(G)--(F)
(C)--(D) --(H)--(G)--cycle ;
draw[dashed, thick]
(B) -- (A) -- (E) (D) --(A) (D) --(C) (D) --(H) (E) --(C) (I) -- (B) (I) -- (G) (I) --(D);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
clip (B) -- (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
end{scope}
else
ifnumAngle<270
draw[very thick] (F) -- (B) -- (C) -- (D) -- (H) (C) -- (G);
draw[dashed, thick] (B) -- (A) -- (D) (A) -- (E);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<230
clip (G) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (B) -- (C) -- (D) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
else
draw[very thick] (G) -- (C) -- (D) -- (A) -- (E) (D) -- (H);
draw[dashed, thick] (A) -- (B) -- (C) (B) -- (F);
begin{scope}
draw[red,dashed,circle in plane with normal={{mynormal} with radius {r} around (I)}];
ifnumAngle<300
clip (C) -- (D) -- (G) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
else
clip (G) -- (D) -- (A) -- (E) -- (H) -- cycle [reverseclip];
draw[red,thick,circle in plane with normal={{mynormal} with radius {r} around (I)}];
fi
end{scope}
fi
fi
fi
fi
foreach point/position in {A/below,B/below,C/below,D/right,E/above,F/left,G/above,H/above,O/above,I/below}
{fill (point) circle (2.0pt);
node[position=2pt] at (point) {$point$};
}
draw[dashed, blue] (B) -- (D);
path[tdplot_screen_coords] let p1=(current bounding box.south west),
p2=(current bounding box.north east)
in [/utils/exec=pgfmathsetmacro{xmin}{min(xmin pt,x1)}
pgfmathsetmacro{xmax}{max(xmax pt,x2)}
pgfmathsetmacro{ymin}{min(ymin pt,y1)}
pgfmathsetmacro{ymax}{max(ymax pt,y2)}
xdefxmin{xmin}xdefxmax{xmax}xdefymin{ymin}xdefymax{ymax}];
%node[tdplot_screen_coords] at (current bounding box.center) {angle=Angle};
SaveBBox
end{tikzpicture}
}
end{document}

answered 9 hours ago
marmotmarmot
115k5146277
115k5146277
add a comment |
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%2f483509%2fhow-can-i-make-a-cone-from-a-cube-and-view-the-cube-with-different-angles%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