如何用 TikZ 绘制一个函数,该函数接受一个球体并将其投影到二维空间

如何用 TikZ 绘制一个函数,该函数接受一个球体并将其投影到二维空间

我想取一个球体,然后应用从 3D(球体空间)到 2D 的线性变换。我希望绘制得到的线性变换。目前我的代码如下所示:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{tikz, tikz-3dplot}
\usepackage{pgfplots}
\usepackage{pgfmath}

\begin{document}

\begin{figure}
\centering
\begin{tikzpicture}[
declare function={
lin1(\x,\y) = 1.8*cos(\x)*sin(\y)+1*sin(\x)*sin(\y)+cos(\y);
lin2(\x,\y) = 0.8*cos(\x)*sin(\y)+1.5*sin(\x)*sin(\y)+.8cos(\y);
}]
\draw[blue] plot[domain=0:360, domain y=0:180] ({lin1(\x,\y)},{lin2(\x,\y)});
\end{tikzpicture}
\end{figure}

\end{document}

但我收到不存在的错误domain y(未定义的控制序列)。我该如何解决这个问题?或者有另一种(简单)方法可以实现我想要的效果吗?

答案1

据我所知,您的图将两个值映射到另外两个值。那应该是什么样子?此外:TikZ 不支持第二个域。(支持更多。)

它应该如何连接这些点?它应该先迭代然后再迭代,\x还是\y反过来?

我已将您的“双重绘图”打包到 foreach 循环中,该循环迭代一个变量,同时绘制另一个变量。这会产生截然不同的图形。

我已经评论了“一条路径”图,我只展示了可以使用不同颜色表示不同迭代的图。

代码

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[
  smooth,
  declare function={
    lin1(\x,\y) = 1.8*cos(\x)*sin(\y)+1.0*sin(\x)*sin(\y)+    cos(\y);
    lin2(\x,\y) = 0.8*cos(\x)*sin(\y)+1.5*sin(\x)*sin(\y)+0.8*cos(\y);
  }]
% \draw[help lines] (-2.5,-4.1) grid (7.5,2.1);
\draw[help lines] ( 2.5,-4.1) grid (7.5,2.1);
% \draw[blue] (0,0) foreach \valX in {0,15,...,359} {
%   plot[variable=\valY, domain=0:180] ({lin1(\valX,\valY)},{lin2(\valX,\valY)})};
  
% \draw[yshift=+-2cm, blue] (0,0) foreach \valY in {0,10,...,180} {
%   plot[variable=\valX, domain=0:360] ({lin1(\valX,\valY)},{lin2(\valX,\valY)})};

\tikzset{xshift=+5cm}
\foreach \valX[evaluate={\col=\valX/3.6;}] in {0,15,...,359}
  \draw[blue!\col!red] plot[variable=\valY, domain=0:180] ({lin1(\valX,\valY)},{lin2(\valX,\valY)});

\tikzset{yshift=+-2cm}
\foreach \valY[evaluate={\col=\valY/1.8;}] in {0,10,...,180}
  \draw[blue!\col!red] plot[variable=\valX, domain=0:360] ({lin1(\valX,\valY)},{lin2(\valX,\valY)});
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容