平均能量损失

平均能量损失

我一直在尝试创建费马(或抛物线)螺旋的图像,并在其上贴上几个标签。

我尝试使用一些回应TikZ — 圆的渐开线, 也根螺旋,b但似乎无法让它工作。

我基本上追求的是两个相交的费马螺旋每个都有不同的背景颜色:

enter image description here

我还想要一些标签,标明其生长过程中的各个组成部分。如果颜色能随着生长而变深,就像根螺旋一样,那就更好了。

答案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}

enter image description here

编辑:

这里有三个独立的问题,我回答了第一个也是唯一一个网站上还没有回答的问题。下面回答了其他问题,即:(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} 

enter image description here

答案2

以下是简单版本元帖子包裹在luamplib。用 进行编译lualatex。(或者去掉 LaTeX 页眉/页脚并使用普通的mpost)。

enter image description here

\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}

相关内容