我在 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}