我正在使用 pgfplots 绘制此图:
图片来自我们的姊妹网站数学软件并且还有一个很好的解释如何使用 Mathematica 来实现这一点。
我遵循以下步骤:
- 参数化二维切割
- 嵌入 3D
- 沿圆圈和自身旋转
我最初在TeXwelt LaTeX 论坛用德语写下我的第一步“使用 pgfplots 进行 Dreh 变换“ 是:
第二次切割:
\documentclass[border=10pt]{standalone} \usepackage{pgfplots} \usepgfplotslibrary{polar} \begin{document} \begin{tikzpicture} \begin{polaraxis} \addplot[mark=none, domain=0:360, samples=100] {sin(3*x) + 1.25}; \end{polaraxis} \end{tikzpicture} \end{document}
嵌入 3D 以便更好地可视化一些临时填充:
\documentclass[border=10pt]{standalone} \usepackage{pgfplots} \begin{document} \begin{tikzpicture} \begin{axis} \addplot3 [domain=0:360, samples=60, fill=blue!30, opacity=0.8] ( {cos(x)*(sin(3*x) + 1.25)}, {sin(x)*(sin(3*x) + 1.25)}, 0 ); \end{axis} \end{tikzpicture} \end{document}
通过简单的 3D 扩展获得表面也没有问题:
\documentclass[border=10pt]{standalone} \usepackage{pgfplots} \begin{document} \begin{tikzpicture} \begin{axis} \addplot3 [ surf, domain = 0:360, y domain = 0:360, samples = 50, samples y = 20, ] ( {cos(x)*(sin(3*x) + 1.25)}, {y}, {sin(x)*(sin(3*x) + 1.25)} ); \end{axis} \end{tikzpicture} \end{document}
这是我的问题,因为我仍然需要弯曲和扭曲它:
我怎样才能将该二维图绕圆圈旋转,同时绕其原点旋转,以获得像顶部图像中的表面图?
答案1
当我看到你的第一张图片时,它立即让我想到了一个圆环;当然,它有点像一个扭曲的圆环,但它确实有很多共同之处。详见如何绘制圆环(例如),可以使用以下方法将圆环参数化为曲面(例如)
x(t,s) = (2+cos(t))*cos(s+pi/2)
y(t,s) = (2+cos(t))*sin(s+pi/2)
z(t,s) = sin(t)
其中t
和s
都位于区间内[0,2\pi]
。
那么,我们如何将其应用到您的形状中呢?
让我们首先尝试绘制由以下参数化在三维中给出的曲线:
x(t) = sin(3t)cos(t)
y(t) = sin(3t)sin(t)
稍微思考一下,并应用环面思想,我们就可以发现,在您的示例中,我们可以使用以下内容,例如,
x(t,s) = (4+(sin(3*(t))+1.25)*cos(t))*cos(s)
y(t,s) = (4+(sin(3*(t))+1.25)*cos(t))*sin(s)
z(t,s) = ((sin(3*(t))+1.25)*sin(t))
s
对于固定值和,得出t\in[0,2\pi]
从这里,我们可以允许s
变化 - 例如,如果我们允许s\in[0,\pi]
那么我们就可以实现:
这很接近了,但扭曲程度不够——例如,我们可以选择
x(t,s) = (4+(sin(3*(t+Ns))+1.25)*cos(t))*cos(s)
y(t,s) = (4+(sin(3*(t+Ns))+1.25)*cos(t))*sin(s)
z(t,s) = ((sin(3*(t+Ns))+1.25)*sin(t))
可以改变数字N
来增加/减少“扭曲度”;例如使用N=10
相当低的分辨率,然后我们实现:
最后,在内存耗尽之前尽可能地提高分辨率(运行LuaLaTeX
确实有帮助 - 感谢 Stefan),然后您会得到以下结果:
例如,可以通过使用 来改进shader=interp
。以下是完整的代码供您参考 :)
% arara: lualatex
% !arara: indent: {overwrite: yes}
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis equal,
]
\addplot3[
surf,
samples=100, samples y=70,
colormap/cool,
domain=0:360,y domain=0:360,
z buffer=sort,
]
({(4+(sin(3*(x+2*y))+1.25)*cos(x))*cos(y)},
{(4+(sin(3*(x+2*y))+1.25)*cos(x))*sin(y)},
{((sin(3*(x+2*y))+1.25)*sin(x))});
\end{axis}
\end{tikzpicture}
\end{document}
一旦我们有了模板,我们就可以对其进行更多的操作;例如,将参数化从 更改为sin(3(x+2y))
并sin(4(x+2y))
使用hot2
颜色图,如下所示
\addplot3[
surf,
samples=100, samples y=70,
colormap/hot2,
domain=0:360,y domain=0:360,
z buffer=sort,
]
({(4+(sin(4*(x+2*y))+1.25)*cos(x))*cos(y)},
{(4+(sin(4*(x+2*y))+1.25)*cos(x))*sin(y)},
{((sin(4*(x+2*y))+1.25)*sin(x))});
给出了一个令人愉悦的画面,但还有些许曲折:
答案2
我无法忍受画这个扭曲圆环使用渐近线。
// Run on http://asymptote.ualberta.ca/
size(6cm);
import graph3;
import palette;
currentprojection=orthographic(3,2,2.2,zoom=.9);
triple f(pair M) {
real t=M.x, s=M.y;
real d = 1 + sin(4t+8s);
real a = (6+d*cos(t))*cos(s);
real b = (6+d*cos(t))*sin(s);
real c = d*sin(t);
return (a,b,c);
}
pen[] p=Rainbow(30);
//pen[] p=Gradient(magenta,yellow);
surface s=surface(f,(0,0),(2pi,2pi),50,30,Spline);
draw(s,mean(palette(s.map(zpart),p)),black);
可以找到更多调色板这里。