将此三角形投影到球体表面

将此三角形投影到球体表面

我在 TikZ MWE 中有以下三角形:

\documentclass[tikz]{standalone}
\usepackage{pgfplots,mathtools} 
\usetikzlibrary{hapes,decorations.pathreplacing}  
\usetikzlibrary{patterns}
\definecolor{RoyalAzure}{rgb}{0.0, 0.22, 0.66}  

\begin{document}

\begin{tikzpicture}
\draw[pattern color=black!50!white,pattern=dots, line width=0.6pt] (0,0) -- (2,3.4641) -- (4,0)--cycle;
\end{tikzpicture}

\end{document}

生成:

三角形

我想将这个三角形投影到球体表面,就像下图这样:

布洛赫球

我怎样才能做到这一点?

答案1

球体上的三角形的角是 3 个 90 度,而平面上的三角形的角是每个 60 度。因此,我不太明白“投影”是什么意思。如果球体上的三角形也应该有三个相等的角,你可以这样做

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{tikz-3dplot}
\usetikzlibrary{patterns,backgrounds}
\begin{document}
\tdplotsetmaincoords{70}{30}
\begin{tikzpicture}[tdplot_main_coords,declare function={R=pi;}]
 \shade[tdplot_screen_coords,ball color=gray,opacity=0.5] (0,0) coordinate(O)
  circle[radius=R];
 \draw plot[variable=\x,domain=\tdplotmainphi-180:\tdplotmainphi,smooth]
 ({R*cos(\x)},{R*sin(\x)},0);
 \draw[blue,pattern=dots,pattern color=blue] 
   plot[variable=\x,domain=90:00,smooth] (0,{-R*sin(\x)},{R*cos(\x)})
    coordinate   (p1) 
 -- plot[variable=\x,domain=0:90,smooth] ({R*sin(\x)},0,{R*cos(\x)})
   coordinate   (p2) 
 -- plot[variable=\x,domain=0:90,smooth] ({R*cos(\x)},{-R*sin(\x)},0)
   coordinate   (p3);
   \begin{scope}[on background layer]
    \foreach \X in {1,2,3}
    { \draw[dashed] (O) -- (p\X); }
   \end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

另一种方法是使用非线性变换将你想要的任何东西投影到球体上。我们在圣诞球中用过这种方法这个视频(当时气氛还好……)但是这样做的时候,就会遇到上面提到的三角形在球面上的角度不一样的问题。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{patterns}
\usepgfmodule{nonlineartransformations}
\makeatletter
% from https://tex.stackexchange.com/a/434247/121799
\tikzdeclarecoordinatesystem{sphere}{
    \tikz@scan@one@point\relax(#1)
    \spheretransformation
}
% 
\def\spheretransformation{% similar to the pgfmanual section 103.4.2
\pgfmathsincos@{\pgf@sys@tonumber\pgf@x}%
\pgfmathsetmacro{\relX}{\the\pgf@x/28.3465}%
\pgfmathsetmacro{\relY}{\the\pgf@y/28.3465}%min(max(
\pgfmathsetmacro{\myx}{28.3465*\Radius*cos(min(max((\relY/\Radius)*(180/pi),-90),90))*sin(min(max((\relX/\Radius)*cos(min(max((\relY/\Radius)*(180/pi),-90),90))*(180/pi),-90),90))}
\pgfmathsetmacro{\myy}{28.3465*\Radius*sin(min(max((\relY/\Radius)*(180/pi),-90),90))}%\typeout{(\relX,\relY)->(\myx,\myy)}%
\pgf@x=\myx pt%
\pgf@y=\myy pt%
} 
\makeatother
\begin{document}
\begin{tikzpicture}[pics/trian/.style={code={
\draw[pattern color=black!50!white,pattern=dots, line width=0.6pt] (0,0) -- (2,3.4641) -- (4,0)--cycle;}}]
 \pgfmathsetmacro{\Radius}{4}
 \shade[ball color=red] (0,0) circle[radius=\Radius];
 \begin{scope}[xshift=-10cm]
  \path (0,0) pic{trian};
 \end{scope}
 \begin{scope}[transform shape nonlinear=true]
  \pgftransformnonlinear{\spheretransformation}
  \pic[local bounding box=box1] at (0,0) {trian};
 \end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容