我问了这个问题:
在球冠上画圆弧
并且有一位用户很友善地回答了这个问题。
但是,我尝试通过更改一些颜色、添加填充以及添加具有这些属性的坐标 (x,y,z) 轴 [虚线、线宽 = 0.1pt、黑色] 等来改进设计。
以下是我设想的(未绘制但 LaTeX 中需要填充):
我需要一些帮助来添加填充和坐标轴、矢量等。
这是我目前拥有的代码:
\documentclass[letter, 10pt]{article}
\usepackage{tikz}
\usetikzlibrary{3d,calc}
\usepackage{float}
% For Conical Resistor Figure
\def\ch{3.75} % cone height
\def\cv{2} % cone visibility height
\def\ph{20} % cone angle
% isometric axes
\pgfmathsetmacro\xx{1/sqrt(2)}
\pgfmathsetmacro\xy{1/sqrt(6)}
\pgfmathsetmacro\zz{sqrt(2/3)}
\pgfmathsetmacro\cr {\ch*tan(\ph)} % cone radius
\pgfmathsetmacro\cg {\ch/cos(\ph)} % cone generatrix
\pgfmathsetmacro\crv{\cv*tan(\ph)} % cone radius (not visible part)
\pgfmathsetmacro\cgv{\cv/cos(\ph)} % cone generatrix (not visible part)
\pgfmathsetmacro\gs{sqrt((2*\ch*\ch-\cr*\cr)/(3*\cr*\cr))} % generatrix slope
\pgfmathsetmacro\xt{sqrt(6)*\gs*\ch/(1+3*\gs*\gs)} % tangent point x
\pgfmathsetmacro\yt{\gs*\xt} % tangent point y
\pgfmathsetmacro\aa{(\ch*\zz-\yt)/\xy/2-\xt/\xx/2} % coordinate x in xy plane
\pgfmathsetmacro\bb{(\ch*\zz-\yt)/\xy/2+\xt/\xx/2} % coordinate y in xy plane
\pgfmathsetmacro\at{atan(\bb/\aa)+180} % angle to the tangent point
%
\begin{document}
\begin{figure}[H]
\centering
\begin{tikzpicture}[line cap=round,line join=round,x={(-\xx cm,-\xy cm)},y={(\xx cm,-\xy cm)},z={(0cm,\zz cm)}]
\begin{scope}[canvas is xy plane at z=\ch]
\draw[magenta] (0,0) circle (\cr);
\fill[magenta!40, opacity=0.9] (0,0) circle (\cr); % fill of big cap
\fill[magenta!40, opacity=0.9] (1.75,1.75) circle (\crv); % fill of small cap
\end{scope}
% meridians
\foreach \a in {0,30,...,179}
{%
\begin{scope}[rotate around z=\a, canvas is xz plane at y=0]
\draw[line width=0.1pt, magenta] (0,0) ++ (90-\ph:\cg) arc (90-\ph:90+\ph:\cg);
\draw[line width=0.1pt, magenta] (0,0) ++ (90-\ph:\cgv) arc (90-\ph:90+\ph:\cgv);
\end{scope}
}
% parallels
\foreach \i in {1,2} \foreach \j in {\cg}
{%
\pgfmathsetmacro\a{\i*\ph/3}
\begin{scope}[canvas is xy plane at z={\j*cos(\a)}]
\draw[line width=0.1pt, magenta] (0,0) circle ({\j*sin(\a)} );
\end{scope}
}
\foreach \i in {1,2} \foreach \j in {\cgv}
{%
\pgfmathsetmacro\a{\i*\ph/3}
\begin{scope}[canvas is xy plane at z={\j*cos(\a)}]
\draw[line width=0.1pt, magenta] (0,0) circle ({\j*sin(\a)} );
\end{scope}
}
% body
\draw[dashed, magenta] ($(\at:\crv)+(0,0,\cv)$) arc (\at:450-\at:\crv);
\draw[dashed, black] (0,0,0) -- ($(\at:\crv)+(0,0,\cv)$);
\draw[dashed, black] (0,0,0) -- ($(90-\at:\crv)+(0,0,\cv)$);
\draw[magenta] ($(\at:\cr)+(0,0,\ch)$) -- ($(\at:\crv)+(0,0,\cv)$) arc (\at:90-\at:\crv) -- ($(90-\at:\cr)+(0,0,\ch)$);
% a bad attempt at adding fill
\fill[magenta!40, opacity=0.9] ($(\at:\crv)+(0,0,\cv)$) arc (\at:90-\at:\crv) -- ($(90-\at:\cr)+(0,0,\ch)$) arc (\at:450-\at:-\cr) -- ($(\at:\crv)+(0,0,\cv)$);
\end{tikzpicture}
\end{figure}
\end{document}
输出如下:
由于我对代码不太理解,因此我非常感谢您的帮助。
另外,如果有人能帮我将椭圆中心的点偏移到更北的位置(半短轴的中间)那就太好了?我认为这样看起来会更真实。这就是我在手绘中尝试做的。
先感谢您!
答案1
这将绘制一个球形帽,其中的半圆呈各种角度。遗憾的是,我无法使用您的 MWE,因为各种东西都是硬编码的,因此计算确定实线需要变为虚线的临界角非常麻烦。另一方面,对于tikz-3dplots
这里使用的,这是一个简洁的三角学小练习,因为视角是已知的。由于旋转对称性和 z 轴“向上”的事实,只有一个相关的视角,即纬度角 theta,您可以根据需要进行调整。
\documentclass[tikz,border=3mm]{standalone}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{70}{90}% keep 90 fixed but feel free to change the first argument
\begin{tikzpicture}[tdplot_main_coords,line cap=round,line join=round,
declare function={R=2;
tcrit(\x)=180-atan2(sin(\tdplotmaintheta),cos(\tdplotmaintheta)*cos(\x));}]
\foreach \Angle in {-75,-45,...,75}
{\pgfmathsetmacro{\tcrit}{tcrit(\Angle)}
\draw[dashed] plot[variable=\t,domain=\tcrit:180,smooth]
({R*cos(\Angle)*cos(\t)},{R*sin(\Angle)*cos(\t)},{R*sin(\t)}) ;
}
\draw[dashed] (0,-R) arc[start angle=-90,end angle=-270,radius=R];
\begin{scope}
\clip (0,-R) arc[start angle=-90,end angle=90,radius=R]
[tdplot_screen_coords] --(R,0) arc[start angle=0,end angle=180,radius=R];
\shade[ball color=magenta,fill opacity=0.6,tdplot_screen_coords]
circle[radius=R];
\end{scope}
\foreach \Angle in {-75,-45,...,75}
{\pgfmathsetmacro{\tcrit}{tcrit(\Angle)}
\draw plot[variable=\t,domain=0:\tcrit,smooth]
({R*cos(\Angle)*cos(\t)},{R*sin(\Angle)*cos(\t)},{R*sin(\t)}) ;
}
\draw (0,-R) arc[start angle=-90,end angle=90,radius=R]
[tdplot_screen_coords] -- (R,0) arc[start angle=0,end angle=180,radius=R]
-- cycle;
\end{tikzpicture}
\end{document}