我想取一个球体,然后应用从 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 不支持第二个域。(pgf图支持更多。)
它应该如何连接这些点?它应该先迭代然后再迭代,\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}