我正在尝试在 LaTeX 中重现这幅用 Mathcha 手绘的图像。
问题是,我在网上找不到任何关于如何在像这种球体的弯曲(光滑) 3D 表面上绘图的信息。
从技术上讲,该图像只有二维,因此应该可以在二维坐标中绘图,但是,如果不经过反复试验,我很难知道如何变形正弦曲线(并且一般来说,它不是一种适用于其他场景的方法)。
由于我已经熟悉它了,因此非常感谢使用任何东西tikz
,但我也会使用任何其他包。
感谢您付出的时间和精力,我们非常感激。
编辑:
我感谢@Roland 的回答,然而,我正在寻找的是一种将图形包裹在 3d 表面的方法,或者一个球面坐标系,这样就可以——通过一点数学运算——轻松绘制至少一些三维曲面。
答案1
再一次尝试,寻找一个尽可能简单且适合原始绘图的函数。
例如:
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{3d,perspective}
\begin{document}
\begin{tikzpicture}[isometric view,blue]
\foreach\i in {-0.5,0.5}
\draw[canvas is xy plane at z=\i] (0,0) circle ({sqrt(4-\i*\i)});
\draw[red] plot[domain=135:315,samples=181]
({2*cos(\x)*sqrt(1-0.0625*sin(8*\x)*sin(8*\x))},
{2*sin(\x)*sqrt(1-0.0625*sin(8*\x)*sin(8*\x))},
{0.5*sin(8*\x)});
\draw[shading=ball,fill opacity=0.5] (0,0,0) circle (2cm);
\draw[red] plot[domain=-45:135,samples=181]
({2*cos(\x)*sqrt(1-0.0625*sin(8*\x)*sin(8*\x))},
{2*sin(\x)*sqrt(1-0.0625*sin(8*\x)*sin(8*\x))},
{0.5*sin(8*\x)});
\def\h{0.7} % arrows height
\pgfmathsetmacro\r{sqrt(4-\h*\h)} % arrows radii
\foreach\i in {10,55,100} \foreach\j in {-\h,\h}
\draw[-latex,canvas is xy plane at z=\j] (\i-10:\r) arc (\i-10:\i+10:\r);
\end{tikzpicture}
\end{document}
编辑1:如果您不能使用该perspective
库,您可以创建自己的库isometric view
并将此代码添加到序言中:
\pgfmathsetmacro\xx{1/sqrt(2)}
\pgfmathsetmacro\xy{1/sqrt(6)}
\pgfmathsetmacro\zz{sqrt(2/3)}
\tikzset{isometric view/.style={x={(-\xx cm,-\xy cm)},y={(\xx cm,-\xy cm)},z={(0cm,\zz cm)}}}
通过这个您可以删除该rotate around z=180
选项(这些轴是通过旋转定义的)。
编辑2:原始帖子中的正弦函数有一个错误,现已更正。
这是一个可定制性更高的版本。它有两个参数:圆的高度和正弦函数\h
,以及周期数\n
(必须是 4 的倍数)。半径始终为 1cm,但如果您更改比例,则可以获得所需的任何半径。此版本还提高了可见性。它还不完美,但已经好一点了。
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{3d,perspective}
\begin{document}
\begin{tikzpicture}[isometric view,rotate around z=180,scale=2] % <-- radius =2
\def\h{0.1} % height
\def\n{20} % numer of sines (must be a multiple of 4)
\pgfmathsetmacro\c{sqrt(1.5)*\h} % clip height
\pgfmathsetmacro\s{\n*20+1} % samples
% circles, background
\foreach\i in {-1,1}
{
\begin{scope}
\clip (-1cm,\i*\c cm) rectangle (1cm,1cm);
\draw[blue,densely dashed,canvas is xy plane at z=\i*\h] (0,0) circle ({sqrt(1-\h*\h)});
\end{scope}
}
% function, background
\draw[red,densely dashed] plot[domain=135:315,samples=\s]
({cos(\x)*sqrt(1-\h*\h*sin(\n*\x)*sin(\n*\x))},
{sin(\x)*sqrt(1-\h*\h*sin(\n*\x)*sin(\n*\x))},
{\h*sin(\n*\x)});
% sphere
\draw[green,shading=ball,ball color=green,fill opacity=0.5] (0,0,0) circle (1cm);
% circles, foreground
\foreach\i in {-1,1}
{
\begin{scope}
\clip (-1cm,-1cm) rectangle (1cm,\i*\c cm);
\draw[blue,canvas is xy plane at z=\i*\h] (0,0) circle ({sqrt(1-\h*\h)});
\end{scope}
}
% function, foreground
\draw[red] plot[domain=-45:135,samples=\s]
({cos(\x)*sqrt(1-\h*\h*sin(\n*\x)*sin(\n*\x))},
{sin(\x)*sqrt(1-\h*\h*sin(\n*\x)*sin(\n*\x))},
{\h*sin(\n*\x)});
\end{tikzpicture}
\end{document}
答案2
仅通过简单绘制即可获得 tikz 建议:
\documentclass[border=0.5cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\draw (3,0) circle (2cm);
\draw (1.21,0.91) .. controls (2,0.33) and (4,0.30) .. (4.84,0.80);
\draw (1,0.07) .. controls (2,-0.5) and (4,-0.5) .. (5,-0.08);
\draw[decorate, decoration={snake, segment length=7.04mm, amplitude=4mm}] (1.07,0.5) .. controls (2,0) and (4,0) .. (4.94,0.5);
\node[right] at (4.84,0.80) {$\theta_{1}$};
\node[right] at (5,-0.08) {$\theta_{2}$};
% arrows
\draw[-stealth] (1.5,1) -- (2.2,0.91);
\draw[-stealth] (2.5,0.88) -- (3.2,0.8);
\draw[-stealth] (3.5,0.91) -- (4.2,1);
\draw[-stealth] (1.5,-0.4) -- (2.2,-0.5);
\draw[-stealth] (2.5,-0.55) -- (3.2,-0.6);
\draw[-stealth] (3.5,-0.58) -- (4.2,-0.5);
\end{tikzpicture}
\end{document}