在带填充的球冠上绘制圆弧

在带填充的球冠上绘制圆弧

我问了这个问题: 在球冠上画圆弧
并且有一位用户很友善地回答了这个问题。

但是,我尝试通过更改一些颜色、添加填充以及添加具有这些属性的坐标 (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}

在此处输入图片描述

相关内容