Water inside a hemispherical bowl
Clash Royale CLAN TAG#URR8PPP
up vote
6
down vote
favorite
I am trying to draw the diagram below in latex
I got this far with the following code:
documentclassarticle
usepackage[margin=0.5in]geometry
usepackagepgfplots
renewcommandthesectionarabicsection
usepackagemathtools
usepackagecancel
usepackagepgfplots
usepackageamsmath
newtheoremtheoremTHEOREM
newtheoremproofPROOF
usepackagetikz
usepackageamssymb
usetikzlibrarypatterns
usepackagefancyhdr
usepackagebigints
usepackagecolor
usepackagetcolorbox
usepackagecolor,xcolor
usepackagebooktabs,array
usepackagehyperref
usepackagegraphicx
usetikzlibraryarrows
usepackagepolynom
usepackageflexisym
usepackagewallpaper
usepackageblkarray
usetikzlibraryshapes.geometric
usetikzlibrarydecorations.markings
newenvironmenttightcenter
setlengthtopsep0pt
setlengthparskip0pt
begincenterendcenter
begindocument
A hemispherical bowl of radius $5.1$ cm contains water of depth $3.5$ cm, as shown below.
begincenter
begintikzpicture[scale=0.75]
%draw (-2.5,-1.65) arc (180:360:2.5 and 0.25);
%BIG CIRCLE
draw[thick](-3.2,+0.04) arc (180:360:3.2 and 1.05);
draw[thick](-3.2,+0.04) arc (3.2:180:-3.2 and 1.05);
%SMALL CIRLCE
draw[dashed](-2.85,-1.34) arc (180:360:2.85 and 0.8);
draw[dashed](-2.85,-1.34) arc (2.85:180:-2.85 and 1.05);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%draw (0,0) ++(0:2.8) arc (0:-45:2.8);
draw [thick,domain=-180:0] plot (3.2*cos(x), 3.2*sin(x)) ;
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
endcenter
enddocument
Can someone suggest how to do the shading so I can complete this diagram?
Thank you.
tikz-pgf
add a comment |Â
up vote
6
down vote
favorite
I am trying to draw the diagram below in latex
I got this far with the following code:
documentclassarticle
usepackage[margin=0.5in]geometry
usepackagepgfplots
renewcommandthesectionarabicsection
usepackagemathtools
usepackagecancel
usepackagepgfplots
usepackageamsmath
newtheoremtheoremTHEOREM
newtheoremproofPROOF
usepackagetikz
usepackageamssymb
usetikzlibrarypatterns
usepackagefancyhdr
usepackagebigints
usepackagecolor
usepackagetcolorbox
usepackagecolor,xcolor
usepackagebooktabs,array
usepackagehyperref
usepackagegraphicx
usetikzlibraryarrows
usepackagepolynom
usepackageflexisym
usepackagewallpaper
usepackageblkarray
usetikzlibraryshapes.geometric
usetikzlibrarydecorations.markings
newenvironmenttightcenter
setlengthtopsep0pt
setlengthparskip0pt
begincenterendcenter
begindocument
A hemispherical bowl of radius $5.1$ cm contains water of depth $3.5$ cm, as shown below.
begincenter
begintikzpicture[scale=0.75]
%draw (-2.5,-1.65) arc (180:360:2.5 and 0.25);
%BIG CIRCLE
draw[thick](-3.2,+0.04) arc (180:360:3.2 and 1.05);
draw[thick](-3.2,+0.04) arc (3.2:180:-3.2 and 1.05);
%SMALL CIRLCE
draw[dashed](-2.85,-1.34) arc (180:360:2.85 and 0.8);
draw[dashed](-2.85,-1.34) arc (2.85:180:-2.85 and 1.05);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%draw (0,0) ++(0:2.8) arc (0:-45:2.8);
draw [thick,domain=-180:0] plot (3.2*cos(x), 3.2*sin(x)) ;
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
endcenter
enddocument
Can someone suggest how to do the shading so I can complete this diagram?
Thank you.
tikz-pgf
add a comment |Â
up vote
6
down vote
favorite
up vote
6
down vote
favorite
I am trying to draw the diagram below in latex
I got this far with the following code:
documentclassarticle
usepackage[margin=0.5in]geometry
usepackagepgfplots
renewcommandthesectionarabicsection
usepackagemathtools
usepackagecancel
usepackagepgfplots
usepackageamsmath
newtheoremtheoremTHEOREM
newtheoremproofPROOF
usepackagetikz
usepackageamssymb
usetikzlibrarypatterns
usepackagefancyhdr
usepackagebigints
usepackagecolor
usepackagetcolorbox
usepackagecolor,xcolor
usepackagebooktabs,array
usepackagehyperref
usepackagegraphicx
usetikzlibraryarrows
usepackagepolynom
usepackageflexisym
usepackagewallpaper
usepackageblkarray
usetikzlibraryshapes.geometric
usetikzlibrarydecorations.markings
newenvironmenttightcenter
setlengthtopsep0pt
setlengthparskip0pt
begincenterendcenter
begindocument
A hemispherical bowl of radius $5.1$ cm contains water of depth $3.5$ cm, as shown below.
begincenter
begintikzpicture[scale=0.75]
%draw (-2.5,-1.65) arc (180:360:2.5 and 0.25);
%BIG CIRCLE
draw[thick](-3.2,+0.04) arc (180:360:3.2 and 1.05);
draw[thick](-3.2,+0.04) arc (3.2:180:-3.2 and 1.05);
%SMALL CIRLCE
draw[dashed](-2.85,-1.34) arc (180:360:2.85 and 0.8);
draw[dashed](-2.85,-1.34) arc (2.85:180:-2.85 and 1.05);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%draw (0,0) ++(0:2.8) arc (0:-45:2.8);
draw [thick,domain=-180:0] plot (3.2*cos(x), 3.2*sin(x)) ;
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
endcenter
enddocument
Can someone suggest how to do the shading so I can complete this diagram?
Thank you.
tikz-pgf
I am trying to draw the diagram below in latex
I got this far with the following code:
documentclassarticle
usepackage[margin=0.5in]geometry
usepackagepgfplots
renewcommandthesectionarabicsection
usepackagemathtools
usepackagecancel
usepackagepgfplots
usepackageamsmath
newtheoremtheoremTHEOREM
newtheoremproofPROOF
usepackagetikz
usepackageamssymb
usetikzlibrarypatterns
usepackagefancyhdr
usepackagebigints
usepackagecolor
usepackagetcolorbox
usepackagecolor,xcolor
usepackagebooktabs,array
usepackagehyperref
usepackagegraphicx
usetikzlibraryarrows
usepackagepolynom
usepackageflexisym
usepackagewallpaper
usepackageblkarray
usetikzlibraryshapes.geometric
usetikzlibrarydecorations.markings
newenvironmenttightcenter
setlengthtopsep0pt
setlengthparskip0pt
begincenterendcenter
begindocument
A hemispherical bowl of radius $5.1$ cm contains water of depth $3.5$ cm, as shown below.
begincenter
begintikzpicture[scale=0.75]
%draw (-2.5,-1.65) arc (180:360:2.5 and 0.25);
%BIG CIRCLE
draw[thick](-3.2,+0.04) arc (180:360:3.2 and 1.05);
draw[thick](-3.2,+0.04) arc (3.2:180:-3.2 and 1.05);
%SMALL CIRLCE
draw[dashed](-2.85,-1.34) arc (180:360:2.85 and 0.8);
draw[dashed](-2.85,-1.34) arc (2.85:180:-2.85 and 1.05);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%draw (0,0) ++(0:2.8) arc (0:-45:2.8);
draw [thick,domain=-180:0] plot (3.2*cos(x), 3.2*sin(x)) ;
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
endcenter
enddocument
Can someone suggest how to do the shading so I can complete this diagram?
Thank you.
tikz-pgf
tikz-pgf
asked 2 days ago
Will Kim
571216
571216
add a comment |Â
add a comment |Â
2 Answers
2
active
oldest
votes
up vote
3
down vote
accepted
documentclass[border=5pt,tikz]standalone
usetikzlibraryarrows
begindocument
begintikzpicture[>=latex']
draw[xshift=1.9cm,densely dashed,<->] (1,-1) -- (1,-1.5) node[midway,right] tiny $2,mathrmcm$;
draw[densely dashed] (2,-1) --+ (.9,0);
draw[densely dashed] (1.5,-1.5) --+ (1.4,0);
beginscope
clip[draw] (0,0) arc(180:360:1.5) (1.5,0) circle(1.5 and .5);
draw[fill=gray!40] (.4,-1) arc(180:360:.73*1.5 and .2);
draw[fill=gray!40,dashed] (2.59,-1) arc(0:180:.73*1.5 and .2);
draw[gray!40] (.4,-1) -- (2.589,-1);
fill[gray!40] (2.4*.73*1.5,-1) arc(0:-180:.73*1.5 and .6);
draw (0,0) arc(180:360:1.5);
draw[densely dashed,<->] (1.5,0) -- (3,0) node[midway,above] tiny $10,mathrmcm$;
endscope
draw (2.6,-1) arc(0:-180:.73*1.5 and .2);
endtikzpicture
enddocument
Here is the output:
@Harald_Hanche-Olsen: Thank you, I've got some bug, so that I can't format the code â¦
â current_user
2 days ago
In the preview it is alright, but in the answer it isn't anymore!
â current_user
2 days ago
@Harald_Hanche-Olsen: Sorry, didn't want that. I fixed my code, so could you please do it one more time for me?
â current_user
2 days ago
@Harald_Hanche-Olsen: imgur.com/a/YxcmzdZ
â current_user
2 days ago
1
Looks beautiful, thank you!
â Will Kim
2 days ago
 |Â
show 2 more comments
up vote
4
down vote
I know I'm quite late to the party, but I took this question as an opportunity to learn some more on the projection of spheres, and to re-use my answer here. I created a partially filled sphere, with a predetermined level waterlevel
which should be between 0
and 1
, which is projected with a certain elevation angle el
which should be between 0
and 90
. The best results are obtained with 0.2 < waterlevel < 1
and 10 < el < 40
. In the following example el
is set to 20
and the waterlevel
to 0.5
.
Of course, an animation can be made easily (with el
still set to 20):
Disclaimer
The projection of the hemisphere is correct, as is the projection of the water surface. The shading of the water is not completely correct. The 'front view', the part of the water that is touching the sphere, is an approximation, but that is invisible with waterlevel
above approximately 0.35.
MWE:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroel20
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevel0.5 % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
MWE animation:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
pgfmathsetmacroel20
foreach fr [evaluate=fr as wl using fr/100] in 0,5,...,100
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevelwl % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%CLIPPING
% For the animation only (I think this is required because arcs are drawn as Bezier curves with control points that contribute to the bounding box)
clip (-1.2*radius,-1.2*radius) rectangle (1.2*radius,1.5*smallradius);
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
This is beautiful. Thank you so much
â Will Kim
yesterday
add a comment |Â
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
documentclass[border=5pt,tikz]standalone
usetikzlibraryarrows
begindocument
begintikzpicture[>=latex']
draw[xshift=1.9cm,densely dashed,<->] (1,-1) -- (1,-1.5) node[midway,right] tiny $2,mathrmcm$;
draw[densely dashed] (2,-1) --+ (.9,0);
draw[densely dashed] (1.5,-1.5) --+ (1.4,0);
beginscope
clip[draw] (0,0) arc(180:360:1.5) (1.5,0) circle(1.5 and .5);
draw[fill=gray!40] (.4,-1) arc(180:360:.73*1.5 and .2);
draw[fill=gray!40,dashed] (2.59,-1) arc(0:180:.73*1.5 and .2);
draw[gray!40] (.4,-1) -- (2.589,-1);
fill[gray!40] (2.4*.73*1.5,-1) arc(0:-180:.73*1.5 and .6);
draw (0,0) arc(180:360:1.5);
draw[densely dashed,<->] (1.5,0) -- (3,0) node[midway,above] tiny $10,mathrmcm$;
endscope
draw (2.6,-1) arc(0:-180:.73*1.5 and .2);
endtikzpicture
enddocument
Here is the output:
@Harald_Hanche-Olsen: Thank you, I've got some bug, so that I can't format the code â¦
â current_user
2 days ago
In the preview it is alright, but in the answer it isn't anymore!
â current_user
2 days ago
@Harald_Hanche-Olsen: Sorry, didn't want that. I fixed my code, so could you please do it one more time for me?
â current_user
2 days ago
@Harald_Hanche-Olsen: imgur.com/a/YxcmzdZ
â current_user
2 days ago
1
Looks beautiful, thank you!
â Will Kim
2 days ago
 |Â
show 2 more comments
up vote
3
down vote
accepted
documentclass[border=5pt,tikz]standalone
usetikzlibraryarrows
begindocument
begintikzpicture[>=latex']
draw[xshift=1.9cm,densely dashed,<->] (1,-1) -- (1,-1.5) node[midway,right] tiny $2,mathrmcm$;
draw[densely dashed] (2,-1) --+ (.9,0);
draw[densely dashed] (1.5,-1.5) --+ (1.4,0);
beginscope
clip[draw] (0,0) arc(180:360:1.5) (1.5,0) circle(1.5 and .5);
draw[fill=gray!40] (.4,-1) arc(180:360:.73*1.5 and .2);
draw[fill=gray!40,dashed] (2.59,-1) arc(0:180:.73*1.5 and .2);
draw[gray!40] (.4,-1) -- (2.589,-1);
fill[gray!40] (2.4*.73*1.5,-1) arc(0:-180:.73*1.5 and .6);
draw (0,0) arc(180:360:1.5);
draw[densely dashed,<->] (1.5,0) -- (3,0) node[midway,above] tiny $10,mathrmcm$;
endscope
draw (2.6,-1) arc(0:-180:.73*1.5 and .2);
endtikzpicture
enddocument
Here is the output:
@Harald_Hanche-Olsen: Thank you, I've got some bug, so that I can't format the code â¦
â current_user
2 days ago
In the preview it is alright, but in the answer it isn't anymore!
â current_user
2 days ago
@Harald_Hanche-Olsen: Sorry, didn't want that. I fixed my code, so could you please do it one more time for me?
â current_user
2 days ago
@Harald_Hanche-Olsen: imgur.com/a/YxcmzdZ
â current_user
2 days ago
1
Looks beautiful, thank you!
â Will Kim
2 days ago
 |Â
show 2 more comments
up vote
3
down vote
accepted
up vote
3
down vote
accepted
documentclass[border=5pt,tikz]standalone
usetikzlibraryarrows
begindocument
begintikzpicture[>=latex']
draw[xshift=1.9cm,densely dashed,<->] (1,-1) -- (1,-1.5) node[midway,right] tiny $2,mathrmcm$;
draw[densely dashed] (2,-1) --+ (.9,0);
draw[densely dashed] (1.5,-1.5) --+ (1.4,0);
beginscope
clip[draw] (0,0) arc(180:360:1.5) (1.5,0) circle(1.5 and .5);
draw[fill=gray!40] (.4,-1) arc(180:360:.73*1.5 and .2);
draw[fill=gray!40,dashed] (2.59,-1) arc(0:180:.73*1.5 and .2);
draw[gray!40] (.4,-1) -- (2.589,-1);
fill[gray!40] (2.4*.73*1.5,-1) arc(0:-180:.73*1.5 and .6);
draw (0,0) arc(180:360:1.5);
draw[densely dashed,<->] (1.5,0) -- (3,0) node[midway,above] tiny $10,mathrmcm$;
endscope
draw (2.6,-1) arc(0:-180:.73*1.5 and .2);
endtikzpicture
enddocument
Here is the output:
documentclass[border=5pt,tikz]standalone
usetikzlibraryarrows
begindocument
begintikzpicture[>=latex']
draw[xshift=1.9cm,densely dashed,<->] (1,-1) -- (1,-1.5) node[midway,right] tiny $2,mathrmcm$;
draw[densely dashed] (2,-1) --+ (.9,0);
draw[densely dashed] (1.5,-1.5) --+ (1.4,0);
beginscope
clip[draw] (0,0) arc(180:360:1.5) (1.5,0) circle(1.5 and .5);
draw[fill=gray!40] (.4,-1) arc(180:360:.73*1.5 and .2);
draw[fill=gray!40,dashed] (2.59,-1) arc(0:180:.73*1.5 and .2);
draw[gray!40] (.4,-1) -- (2.589,-1);
fill[gray!40] (2.4*.73*1.5,-1) arc(0:-180:.73*1.5 and .6);
draw (0,0) arc(180:360:1.5);
draw[densely dashed,<->] (1.5,0) -- (3,0) node[midway,above] tiny $10,mathrmcm$;
endscope
draw (2.6,-1) arc(0:-180:.73*1.5 and .2);
endtikzpicture
enddocument
Here is the output:
edited 2 days ago
Harald Hanche-Olsen
12.5k24560
12.5k24560
answered 2 days ago
current_user
2,5741428
2,5741428
@Harald_Hanche-Olsen: Thank you, I've got some bug, so that I can't format the code â¦
â current_user
2 days ago
In the preview it is alright, but in the answer it isn't anymore!
â current_user
2 days ago
@Harald_Hanche-Olsen: Sorry, didn't want that. I fixed my code, so could you please do it one more time for me?
â current_user
2 days ago
@Harald_Hanche-Olsen: imgur.com/a/YxcmzdZ
â current_user
2 days ago
1
Looks beautiful, thank you!
â Will Kim
2 days ago
 |Â
show 2 more comments
@Harald_Hanche-Olsen: Thank you, I've got some bug, so that I can't format the code â¦
â current_user
2 days ago
In the preview it is alright, but in the answer it isn't anymore!
â current_user
2 days ago
@Harald_Hanche-Olsen: Sorry, didn't want that. I fixed my code, so could you please do it one more time for me?
â current_user
2 days ago
@Harald_Hanche-Olsen: imgur.com/a/YxcmzdZ
â current_user
2 days ago
1
Looks beautiful, thank you!
â Will Kim
2 days ago
@Harald_Hanche-Olsen: Thank you, I've got some bug, so that I can't format the code â¦
â current_user
2 days ago
@Harald_Hanche-Olsen: Thank you, I've got some bug, so that I can't format the code â¦
â current_user
2 days ago
In the preview it is alright, but in the answer it isn't anymore!
â current_user
2 days ago
In the preview it is alright, but in the answer it isn't anymore!
â current_user
2 days ago
@Harald_Hanche-Olsen: Sorry, didn't want that. I fixed my code, so could you please do it one more time for me?
â current_user
2 days ago
@Harald_Hanche-Olsen: Sorry, didn't want that. I fixed my code, so could you please do it one more time for me?
â current_user
2 days ago
@Harald_Hanche-Olsen: imgur.com/a/YxcmzdZ
â current_user
2 days ago
@Harald_Hanche-Olsen: imgur.com/a/YxcmzdZ
â current_user
2 days ago
1
1
Looks beautiful, thank you!
â Will Kim
2 days ago
Looks beautiful, thank you!
â Will Kim
2 days ago
 |Â
show 2 more comments
up vote
4
down vote
I know I'm quite late to the party, but I took this question as an opportunity to learn some more on the projection of spheres, and to re-use my answer here. I created a partially filled sphere, with a predetermined level waterlevel
which should be between 0
and 1
, which is projected with a certain elevation angle el
which should be between 0
and 90
. The best results are obtained with 0.2 < waterlevel < 1
and 10 < el < 40
. In the following example el
is set to 20
and the waterlevel
to 0.5
.
Of course, an animation can be made easily (with el
still set to 20):
Disclaimer
The projection of the hemisphere is correct, as is the projection of the water surface. The shading of the water is not completely correct. The 'front view', the part of the water that is touching the sphere, is an approximation, but that is invisible with waterlevel
above approximately 0.35.
MWE:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroel20
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevel0.5 % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
MWE animation:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
pgfmathsetmacroel20
foreach fr [evaluate=fr as wl using fr/100] in 0,5,...,100
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevelwl % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%CLIPPING
% For the animation only (I think this is required because arcs are drawn as Bezier curves with control points that contribute to the bounding box)
clip (-1.2*radius,-1.2*radius) rectangle (1.2*radius,1.5*smallradius);
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
This is beautiful. Thank you so much
â Will Kim
yesterday
add a comment |Â
up vote
4
down vote
I know I'm quite late to the party, but I took this question as an opportunity to learn some more on the projection of spheres, and to re-use my answer here. I created a partially filled sphere, with a predetermined level waterlevel
which should be between 0
and 1
, which is projected with a certain elevation angle el
which should be between 0
and 90
. The best results are obtained with 0.2 < waterlevel < 1
and 10 < el < 40
. In the following example el
is set to 20
and the waterlevel
to 0.5
.
Of course, an animation can be made easily (with el
still set to 20):
Disclaimer
The projection of the hemisphere is correct, as is the projection of the water surface. The shading of the water is not completely correct. The 'front view', the part of the water that is touching the sphere, is an approximation, but that is invisible with waterlevel
above approximately 0.35.
MWE:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroel20
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevel0.5 % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
MWE animation:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
pgfmathsetmacroel20
foreach fr [evaluate=fr as wl using fr/100] in 0,5,...,100
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevelwl % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%CLIPPING
% For the animation only (I think this is required because arcs are drawn as Bezier curves with control points that contribute to the bounding box)
clip (-1.2*radius,-1.2*radius) rectangle (1.2*radius,1.5*smallradius);
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
This is beautiful. Thank you so much
â Will Kim
yesterday
add a comment |Â
up vote
4
down vote
up vote
4
down vote
I know I'm quite late to the party, but I took this question as an opportunity to learn some more on the projection of spheres, and to re-use my answer here. I created a partially filled sphere, with a predetermined level waterlevel
which should be between 0
and 1
, which is projected with a certain elevation angle el
which should be between 0
and 90
. The best results are obtained with 0.2 < waterlevel < 1
and 10 < el < 40
. In the following example el
is set to 20
and the waterlevel
to 0.5
.
Of course, an animation can be made easily (with el
still set to 20):
Disclaimer
The projection of the hemisphere is correct, as is the projection of the water surface. The shading of the water is not completely correct. The 'front view', the part of the water that is touching the sphere, is an approximation, but that is invisible with waterlevel
above approximately 0.35.
MWE:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroel20
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevel0.5 % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
MWE animation:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
pgfmathsetmacroel20
foreach fr [evaluate=fr as wl using fr/100] in 0,5,...,100
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevelwl % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%CLIPPING
% For the animation only (I think this is required because arcs are drawn as Bezier curves with control points that contribute to the bounding box)
clip (-1.2*radius,-1.2*radius) rectangle (1.2*radius,1.5*smallradius);
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
I know I'm quite late to the party, but I took this question as an opportunity to learn some more on the projection of spheres, and to re-use my answer here. I created a partially filled sphere, with a predetermined level waterlevel
which should be between 0
and 1
, which is projected with a certain elevation angle el
which should be between 0
and 90
. The best results are obtained with 0.2 < waterlevel < 1
and 10 < el < 40
. In the following example el
is set to 20
and the waterlevel
to 0.5
.
Of course, an animation can be made easily (with el
still set to 20):
Disclaimer
The projection of the hemisphere is correct, as is the projection of the water surface. The shading of the water is not completely correct. The 'front view', the part of the water that is touching the sphere, is an approximation, but that is invisible with waterlevel
above approximately 0.35.
MWE:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroel20
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevel0.5 % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
MWE animation:
documentclass[tikz,margin=2mm]standalone
usetikzlibrary3d
% small fix for canvas is xy plane at z % https://tex.stackexchange.com/a/48776/121799
makeatletter
tikzoptioncanvas is xy plane at z%
deftikz@plane@originpgfpointxyz00#1%
deftikz@plane@xpgfpointxyz10#1%
deftikz@plane@ypgfpointxyz01#1%
tikz@canvas@is@plane
% view=<azimuth>,<elevation> key https://tex.stackexchange.com/a/447401/74459
tikzset
view/.code args=#1,#2%
% Set elevation and azimuth angles
pgfmathsetmacroview@az#1
pgfmathsetmacroview@el#2
% Calculate projections of rotation matrix
pgfmathsetmacroxvec@xcos(view@az)
pgfmathsetmacroxvec@y-sin(view@az)*sin(view@el)
pgfmathsetmacroyvec@xsin(view@az)
pgfmathsetmacroyvec@ycos(view@az)*sin(view@el)
pgfmathsetmacrozvec@x0
pgfmathsetmacrozvec@ycos(view@el)
% Set base vectors
pgfsetxvecpgfpointxvec@x cmxvec@y cm
pgfsetyvecpgfpointyvec@x cmyvec@y cm
pgfsetzvecpgfpointzvec@x cmzvec@y cm
,
makeatother
begindocument
pgfmathsetmacroel20
foreach fr [evaluate=fr as wl using fr/100] in 0,5,...,100
begintikzpicture[scale=0.75,water shading/.style=ball color=cyan!50!white,fill opacity=0.5]
% PRE-CALCULATIONS
pgfmathsetmacroradius3.2
pgfmathsetmacrosmallradiussin(el)*radius
pgfmathsetmacrowaterlevelwl % between 0 and 1
pgfmathsetmacrowaterradiussin(acos(-1+waterlevel))*radius
pgfmathsetmacrowatersmallradiussin(el)*waterradius
%CLIPPING
% For the animation only (I think this is required because arcs are drawn as Bezier curves with control points that contribute to the bounding box)
clip (-1.2*radius,-1.2*radius) rectangle (1.2*radius,1.5*smallradius);
%SHADING
% Two shading paths to mimic the different light refraction of the front and the surface
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (180:0:waterradius and watersmallradius) -- cycle;
path[water shading] (-asin(1-waterlevel):radius)
arc (-asin(1-waterlevel):-180+asin(1-waterlevel):radius)
-- (-waterradius,-(1-waterlevel)*radius*cosel)
arc (-180:0:waterradius and watersmallradius) -- cycle;
%BIG CIRCLE
% Due to the 'view' key, a circle with a fixed radius becomes an ellipse
draw[thick,view=0,el,canvas is xy plane at z=0] (0,0) circle (radius);
% No matter what the elevation of the view is, a (half-)sphere is always projected as a (half-)circle.
draw[thick] (0,0) ++(0:radius) arc (0:-180:radius);
%SMALL CIRLCE
% Again using the 'view' key, the small circle can be drawn as two seperate arcs with fixed radius.
draw[dashed,view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:180:waterradius);
draw[view=0,el,canvas is xy plane at z=-(1-waterlevel)*radius]
(0,0) ++(0:waterradius) arc (0:-180:waterradius);
%triangle
%draw[gray,dashed](0,0) -- (+2.84,-1.52);
%draw[gray,dashed](0,0) -- (0,-1.52);
%draw[gray,dashed](0,-1.52) --(+2.9,-1.52);
%
%node[below] at (0,-1.52) A;
%node[right] at (2.84,-1.52) B;
%
%draw [thick,fill=black] (0,-1.52) circle (0.04);
draw [thick,fill=black] (0,0) circle (0.04);
%draw [thick,fill=black] (2.81,-1.52) circle (0.04);
node[above] at (0,0.2) O;
%
%draw[gray,dashed] (0,-1.52) -- (3.8,-1.52);
%draw[gray,dashed] (0,-3.22) -- (3.8,-3.22);
%draw[thick,<->](3.4,-1.52) to node[fill=white] $3.5$ cm (3.4,-3.22);
endtikzpicture
enddocument
answered yesterday
Max
6,14311727
6,14311727
This is beautiful. Thank you so much
â Will Kim
yesterday
add a comment |Â
This is beautiful. Thank you so much
â Will Kim
yesterday
This is beautiful. Thank you so much
â Will Kim
yesterday
This is beautiful. Thank you so much
â Will Kim
yesterday
add a comment |Â
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
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f450223%2fwater-inside-a-hemispherical-bowl%23new-answer', 'question_page');
);
Post as a guest
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
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
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