我一直在尝试创建费马(或抛物线)螺旋的图像,并在其上贴上几个标签。
我尝试使用一些回应TikZ — 圆的渐开线, 也根螺旋,b但似乎无法让它工作。
我基本上追求的是两个相交的费马螺旋每个都有不同的背景颜色:
我还想要一些标签,标明其生长过程中的各个组成部分。如果颜色能随着生长而变深,就像根螺旋一样,那就更好了。
答案1
我的回答tikz 中的螺旋弹簧使用命令来提供一种方法:
\newcommand\spiral{} % just for safety
\def\spiral[#1](#2)(#3:#4)(#5:#6)[#7]{%
%\spiral[options](center)(start angle:end angle)(start radius:final radius)[revolutions]
\pgfmathsetmacro{\domain}{#4+#7*360}
\pgfmathsetmacro{\growth}{180*(#6-#5)/(pi*(\domain-#3))}
\draw [#1,
shift={(#2)},
domain=#3*pi/180:\domain*pi/180,
variable=\t,
smooth,
samples=int(\domain/5)] plot ({\t r}: {#5+\growth*\t-\growth*#3*pi/180})
}
但这样螺旋增长就是线性的,而费马螺旋具有另一种函数:r(θ)=θ^(1/2)
,所以我们只需要调整命令:
\newcommand\fermatspiral{} % just for safety
\def\fermatspiral[#1](#2)(#3:#4)[#5]{%
% \fermatspiral[options](placement)(start angle:final angle)[revolutions]
\pgfmathsetmacro{\domain}{#4+#5*360}
\draw [#1,
shift={(#2)},
domain=#3*pi/180:\domain*pi/180,
variable=\t,
smooth,
samples=int(\domain/5)] plot ({\t r} : {sqrt(\t)})
}
唯一的问题是获得 - 部分,因此我们可以获得rotate=180
两个螺旋。
平均能量损失
\documentclass{standalone}
\usepackage{tikz}
\newcommand\fermatspiral{} % just for safety
\def\fermatspiral[#1](#2)(#3:#4)[#5]{%
% \fermatspiral[options](placement)(start angle:final angle)[revolutions]
\pgfmathsetmacro{\domain}{#4+#5*360}
\draw [#1,
shift={(#2)},
domain=#3*pi/180:\domain*pi/180,
variable=\t,
smooth,
samples=int(\domain/5)] plot ({\t r} : {sqrt(\t)})
}
\begin{document}
\begin{tikzpicture}
\fermatspiral[red](0,0)(0:2)[3]; % Positive part
\fermatspiral[blue, rotate=180](0,0)(0:2)[3]; % Negative part
\end{tikzpicture}
\end{document}
编辑:
这里有三个独立的问题,我回答了第一个也是唯一一个网站上还没有回答的问题。下面回答了其他问题,即:(i) 如何将路径从浅色淡化为深色,以及 (ii) 如何在函数生成的任意路径上放置标签。
要让路径从红色逐渐变为深红色并不是那么简单inner color=red, outer color=red!20!black
,因为必须path fading
像这样使用percusse 的精彩回答但是当你将路径规范与填充分离时,可能会发生一些奇怪的事情:
\begin{tikzfadingfrompicture}[name=fermat]%
\fermatspiral[transparent!20](0,0)(0:360)[3];
\end{tikzfadingfrompicture}
要在路径上的某个地方获得标签,可以使用带有标记的装饰(就像 Jesse 的这个回答一样),但话又说回来,path fading
现在我们的路径是在淡入淡出选项中指定的,我们无法再对其进行修饰。不过,并非一切都丢失了,因为我们的路径是一个众所周知的函数,我们可以使用它\node at (x,f(x)) {};
来指定我们的标签位置。所以,总而言之,我们可以使用路径淡入淡出并用\node at
符号手动标记,或者我们可以忘记淡入淡出并使用修饰来标记我们的路径。由于 OP 想要淡入淡出并标记路径,因此下面的 MWE 提出了这样的解决方案:
完成 MWE
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fadings}%
\newcommand\fermatspiral{} % just for safety
\def\fermatspiral[#1](#2)(#3:#4)[#5]{%
% \fermatspiral[options](placement)(start radius:final radius)[revolutions]
\pgfmathsetmacro{\domain}{#4+#5*360}
\draw [#1,
shift={(#2)},
domain=#3*pi/180:\domain*pi/180,
variable=\t,
smooth,
samples=int(\domain/2)] plot ({\t r} : {sqrt(\t)})
}
\begin{tikzfadingfrompicture}[name=fermat]%
\fermatspiral[transparent!20](0,0)(0:360)[3];
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\domain}{4*360}
\path[path fading=fermat, fit fading=false, fading transform={shift={(134:-6.6pt)}}, inner color=red, outer color=red!30!black] circle ({1.1*sqrt(rad(\domain))});
\path[path fading=fermat, fit fading=false, fading transform={rotate=180, shift={(134:-6.6pt)}}, inner color=blue, outer color=blue!30!black] circle ({1.1*sqrt(rad(\domain))});
\node[right] at ({rad(360) r}:{sqrt(rad(360))}) {A};
\node[left] at ({rad(360) r}:{-sqrt(rad(360))}) {A};
\end{tikzpicture}
\end{document}
答案2
以下是简单版本元帖子包裹在luamplib
。用 进行编译lualatex
。(或者去掉 LaTeX 页眉/页脚并使用普通的mpost
)。
\RequirePackage{luatex85}
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
turns = 5;
radius = 21;
path s; % MP deals in degrees, so \pi/180 \simeq 0.0174533
s = origin for t=1 upto 360*turns: -- (radius * sqrt(0.0174533t),0) rotated t endfor;
path xx, yy;
xx = (left--right) scaled radius scaled sqrt( 2 * 3.1415926 turns );
yy = xx rotated 90;
draw xx withcolor .7 white;
draw yy withcolor .7 white;
drawarrow s withcolor 2/3 red;
drawarrow s rotated 180 withcolor 1/2 blue;
endfig;
\end{mplibcode}
\end{document}