行星之舞:简介
我得到了一些关于我的问题的精彩答案金星和地球的天体之舞。在这个问题中,我将提出一个更概括的问题,该问题涉及任何两个天体对的舞蹈。现在,让我考虑一下从地球上观察金星和地球的舞蹈。从我们在地球上的角度来看(即在地心系统中),我们感觉我们静止不动,太阳在绕着我们转(而实际上,地球在绕着太阳转)。我们还知道金星在绕着太阳转。现在想象一个以地球为中心,太阳和金星绕着地球转的图,金星本身绕着太阳转的图。在这个图中,在金星中心和太阳中心之间画一条假想线,然后运行模拟,观察太阳和金星以不同的速度绕地球转。我用sgmoye 使用 TikZ 的回答生成金星-地球舞蹈的逐步构造,以便于更容易地进行可视化:
\documentclass[border=1cm]{standalone}
\usepackage[margin=1in]{geometry}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage{keyval}
\newlength{\outerdistance}
\setlength{\outerdistance}{5.41cm}
\newlength{\innerdistance}
\setlength{\innerdistance}{7.48cm}
\def\outerperiod{123}
\def\innerperiod{200}
\def\step{5}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\begin{tikzpicture}
\foreach \x in {0,\step,...,270}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{red}\scalebox{5}{$1$}};
\end{tikzpicture}%
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,360}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{red}\scalebox{5}{$2$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,540}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{red}\scalebox{5}{$3$}};
\end{tikzpicture}
\\
\hline
\begin{tikzpicture}
\foreach \x in {0,\step,...,720}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{orange}\scalebox{5}{$4$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,900}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{orange}\scalebox{5}{$5$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,1080}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{orange}\scalebox{5}{$6$}};
\end{tikzpicture}
\\
\hline
\begin{tikzpicture}
\foreach \x in {0,\step,...,1260}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{yellow}\scalebox{5}{$7$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,1440}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{yellow}\scalebox{5}{$8$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,1620}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{yellow}\scalebox{5}{$9$}};
\end{tikzpicture}
\\
\hline
\begin{tikzpicture}
\foreach \x in {0,\step,...,1800}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{green}\scalebox{5}{$10$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,1980}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{green}\scalebox{5}{$11$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,2160}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{green}\scalebox{5}{$12$}};
\end{tikzpicture}
\\
\hline
\begin{tikzpicture}
\foreach \x in {0,\step,...,2340}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{blue}\scalebox{5}{$13$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,2520}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{blue}\scalebox{5}{$14$}};
\end{tikzpicture}
&
\begin{tikzpicture}
\foreach \x in {0,\step,...,2700}{
\draw[black] (\x:\outerdistance) -- ({(\x/\outerperiod)*\innerperiod}:\innerdistance);
} \node {\color{blue}\scalebox{5}{$15$}};
\end{tikzpicture}
\\
\hline
\end{tabular}
\end{document}
我对这段代码有几个问题:
其他行星对的舞蹈
金星和地球在很多方面都很相似。它们的直径大致相同(12,104 公里 vs 12,756 公里),轨道(恒星)周期比为 224.7/365.2 ~ 0.618,即黄金比例。此外,地球和金星绕太阳的轨道实际上非常接近圆形轨道。换句话说,轨道偏心率金星和地球的距离接近于零(0.007 vs 0.017),这将导致金星美丽的五角星,如上图所示(看最后一步,第 15 步)。无论我们从地心角度(如上图所示)还是在日心系统(以太阳为中心)绘制金星-地球之舞,金星五角星都是相同的。事实上,两颗行星的天体之舞似乎与观察者无关。例如,看看这个以日心模型绘制的金星五角星的彩色版本(由 sgmoye 创建;取自这里):
我尝试为太阳系中其他行星对的舞蹈生成相同的图表。你可以在本书的最后几页找到此类图表的完整列表。太阳系巧合小书作者:John Martineau。不幸的是,用于生成金星-地球舞蹈的 TikZ 代码无法重现相距遥远的行星之间的舞蹈。例如,我尝试使用 sgmoye 的\makevenus
宏(在本例中更改为\danceofplanets
)来获取水星-火星舞蹈,但我需要手动更改maxtimes
以消除dimensions too large
编译时的错误:
\documentclass[tikz,border=20pt]{standalone}
\usepackage{keyval}
\usepackage{caption}
\usepackage{subcaption}
%% Initialization
\newlength{\outerdistance} %% Distance of the outer planet from Sun
\setlength{\outerdistance}{22.79cm}
\newlength{\innerdistance} %% Distance of the inner planet from Sun
\setlength{\innerdistance}{5.79cm}
\def\innerperiod{88} %% Orbital period of the inner planet (in days)
\def\outerperiod{687} %% Orbital period of the outer planet (in days)
\def\maxtimes{2700} %% Default max value for iteration
\def\increment{2} %% Default increment value
%% Define \danceofplanets macro
\makeatletter
\define@key{planet}{outerdistance}{\setlength{\outerdistance}{#1}}
\define@key{planet}{innerdistance}{\setlength{\innerdistance}{#1}}
\define@key{planet}{innerperiod}{\def\innerperiod{#1}}
\define@key{planet}{outerperiod}{\def\outerperiod{#1}}
\define@key{planet}{maxtimes}{\def\maxtimes{#1}}
\define@key{planet}{increment}{\def\increment{#1}}
\newcommand{\danceofplanets}[1][]{%
\setkeys{planet}{#1}
\begin{tikzpicture}
\foreach \x in {0,\increment,...,\maxtimes}{%
\draw[help lines] (\x:\outerdistance) -- ({(\x/\innerperiod)*\outerperiod}:\innerdistance);%% <<<--- avoids arithmetic overflow
}%
\end{tikzpicture}%
}
\begin{document}
\danceofplanets[ %% Venus and Earth
outerperiod=365.2,
innerperiod=224.7,
innerdistance=5.41cm,
outerdistance=7.48cm,
increment=5]
% \danceofplanets[ %% Mercury and Mars - TOO LARGE
% outerperiod=687,
% innerperiod=88,
% outerdistance=22.79cm,
% innerdistance=5.79cm,
% increment=5]
\danceofplanets[ %% Mercury and Mars - needs maxtimes<2099 to work
outerperiod=687,
innerperiod=88,
outerdistance=22.79cm,
innerdistance=5.79cm,
increment=1,
maxtimes=2098]
\end{document}
\danceofplanets
对于靠近太阳的行星,该宏可以正常工作;但是当行星距离太阳太远时,此代码需要对 、和进行一些更改maxtimes
,以使尺寸足够小以便在输出中打印。和之间的比率必须是固定的,并且很容易找出近似值以使代码可编译(检查来自innerdistance
outerdistance
innerdistance
outerdistance
这maxtimes
页面)。但是,在使用此宏时,应通过反复试验来计算生成行星美丽对称舞蹈的确切值。例如,\danceofplanets[ outerperiod=687, innerperiod=88, outerdistance=22.79cm, innerdistance=5.79cm, increment=1, maxtimes=360]
生成不完整的水星-火星舞蹈,而\danceofplanets[ outerperiod=687, innerperiod=88, outerdistance=22.79cm, innerdistance=5.79cm, increment=1, maxtimes=2098]
生成舞蹈的迭代次数过多。
轨道偏心率
上述示例中使用的 TikZ 代码不会生成距离太阳太远的行星的舞蹈(它会给出一个dimensions too large
我不知道如何解决的错误)。我试过Metapost 解决方案Thruston 建议的,它恰好对生成任何一对行星的舞蹈图表非常有帮助。以下是 Metapost 生成的海王星和冥王星的日心舞蹈:
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\def\outerdistance{59.064} % Pluto to Sun
\def\innerdistance{44.951} % Neptune to Sun
\begin{document}
\mplibnumbersystem{double}
\begin{mplibcode}
vardef hsv_color(expr h,s,v) =
% following wikipedia article on "HSL and HSV"
save chroma, hh, x, m;
chroma = v*s;
hh = h/60;
x = chroma * (1-abs(hh mod 2 - 1));
m = v - chroma;
if hh < 1: (chroma,x,0)+(m,m,m)
elseif hh < 2: (x,chroma,0)+(m,m,m)
elseif hh < 3: (0,chroma,x)+(m,m,m)
elseif hh < 4: (0,x,chroma)+(m,m,m)
elseif hh < 5: (x,0,chroma)+(m,m,m)
else: (chroma,0,x)+(m,m,m)
fi
enddef;
% Heliocentric Neptune-Pluto Dance
beginfig(1);
for t=0 step 1 until 360:
draw \innerdistance dir 90.56t -- \outerdistance dir 59.8t
withpen pencircle scaled 1/8 withcolor hsv_color(t, .4, .8); endfor;
endfig;
\end{mplibcode}
\end{document}
该图为海王星-冥王星之舞创建了一个看似对称的图,但实际上并不准确。不准确的原因是冥王星的轨道偏心率为 0.244,而海王星的轨道偏心率为 0.011。这意味着冥王星以椭圆形轨道绕太阳运行,而海王星的轨道几乎是圆形的。我读了Metapost 教程寻找一种绘制冥王星椭圆轨道的方法,但没有找到解决方案。主要问题是创建一个绘制圆形轨道的命令,该命令考虑了行星相对于太阳的轨道偏心率。有关冥王星轨道偏心率的更多信息,请访问维基百科。
轨道倾角
黄道是地球绕太阳运行的轨道平面。其他行星绕太阳运行的轨道平面与黄道略有倾角(小于 20 度)。这被称为行星的轨道倾角,它会影响行星的舞蹈。金星的轨道倾角为 3.4 度,在绘制金星五角星时可以忽略不计,不会对其产生影响。然而,冥王星的大轨道倾角(17.2 度)及其绕太阳的椭圆轨道将改变海王星-冥王星舞蹈的性质。我不确定是否有办法在 TikZ 或 Metapost 中表示轨道倾角,以及它是否会影响行星舞蹈的图表。以下动画片显示冥王星的轨道倾角(红色倾斜椭圆):
感谢您阅读这篇长文,我也很感激您对上述任何问题提供的帮助。
答案1
这是一个很长的问题,我不确定我是否读完了所有内容,但错误dimension too large
很容易解决。你的角度变大了,但显然只有角度模 360 才相关。
\documentclass[tikz,border=20pt]{standalone}
\tikzset{planets/.cd,outer distance/.store in=\outerdistance,
inner distance/.store in=\innerdistance,
outer period/.store in=\outerperiod,
inner period/.store in=\innerperiod,
max times/.store in=\maxtimes,
increment/.store in=\increment,
outer distance=22.79cm,
inner distance=5.79cm,
inner period=88,
outer period=687,
max times=2700,
increment=2}
\newcommand{\danceofplanets}[1][]{%
%\setkeys{planet}{#1}
\begin{tikzpicture}[planets/.cd,#1]
\edef\iloop{0}
\edef\x{0}
\edef\y{0}
\loop
\pgfmathsetmacro{\x}{Mod(\x+\increment,360)}
\pgfmathsetmacro{\y}{Mod(\y+(\increment/\innerperiod)*\outerperiod,360)}
\draw[help lines]
(\x:\outerdistance) --
(\y:\innerdistance);%
\edef\iloop{\the\numexpr\iloop+\increment}
\ifnum\iloop<\maxtimes\repeat
\end{tikzpicture}%
}
\begin{document}
\danceofplanets[ %% Venus and Earth
outer period=365.2,
inner period=224.7,
inner distance=5.41cm,
outer distance=7.48cm,
increment=5]
\danceofplanets[ %% Mercury and Mars
outer period=687,
inner period=88,
outer distance=22.79cm,
inner distance=5.79cm,
increment=5]
\end{document}
这是第二张图的效果,之前是没有效果的。
应该可以稍微加快速度,但这也取决于边界条件,例如是否需要着色。
dimension too large
事实证明,当 的值(过大?)时,仍然会出现和内存错误max times
。造成这种情况的原因有很多,其中一些与 Ti 有关钾Z。此外,编译会变慢。所以这里有一个解决方案,用于(可笑的)较大的max time
: picture
mode 值!
\documentclass[border=20pt]{standalone}
\usepackage{xfp}
\usepackage{pgf}
\usepackage{pict2e}
\standaloneenv{picture}
\pgfkeys{/planets/.cd,outer distance/.store in=\outerdistance,
inner distance/.store in=\innerdistance,
outer period/.store in=\outerperiod,
inner period/.store in=\innerperiod,
max times/.store in=\maxtimes,
increment/.store in=\increment,
line width/.store in=\planetlinewidth,
outer distance=22.79cm,
inner distance=5.79cm,
inner period=88,
outer period=687,
max times=270,
increment=2,
line width=0.2pt}
\newcommand\PlanetDance[1][]{%
\begingroup
\pgfkeys{/planets/.cd,#1}%
\pgfmathtruncatemacro{\dx}{2*\outerdistance+1pt}%
\pgfmathtruncatemacro{\dy}{\dx/2}%
\begin{picture}(\dx,\dx)(-\dy,-\dy)
\linethickness{\planetlinewidth}%
\edef\iloop{0}%
\edef\x{0}%
\edef\y{0}%
\edef\imax{\inteval{\maxtimes/\increment}}%
\loop
\pgfmathsetmacro{\x}{Mod(\x+\increment,360)}%
\pgfmathsetmacro{\y}{Mod(\y+(\increment/\innerperiod)*\outerperiod,360)}%
\pgfmathsetmacro{\myxa}{\outerdistance*cos(\x)}%
\pgfmathsetmacro{\myya}{\outerdistance*sin(\x)}%
\pgfmathsetmacro{\myxb}{\innerdistance*cos(\y)}%
\pgfmathsetmacro{\myyb}{\innerdistance*sin(\y)}%
\Line(\myxa,\myya)(\myxb,\myyb)%
\edef\iloop{\inteval{\iloop+1}}%
\ifnum\inteval{\iloop<\imax}\repeat
\end{picture}\endgroup}
\begin{document}
\PlanetDance[ %% Venus and Earth
outer period=365.2,
inner period=224.7,
inner distance=5.41cm,
outer distance=7.48cm,
increment=5,
max times=10000]
\end{document}
请注意,尽管这会加载xfp
,但我保留\pgfmathsetmacro
s 是有原因的:它们比 更快\fpeval
。
我们也可以使用fpu
,但这会稍微减慢编译速度。由于mod
中没有实现,fpu
因此我们必须自己实现。(我也切换到了 pgf 键。)
\documentclass[tikz,border=20pt]{standalone}
\usetikzlibrary{fpu}
\tikzset{planets/.cd,outer distance/.store in=\outerdistance,
inner distance/.store in=\innerdistance,
outer period/.store in=\outerperiod,
inner period/.store in=\innerperiod,
max times/.store in=\maxtimes,
increment/.store in=\increment,
outer distance=22.79cm,
inner distance=5.79cm,
inner period=88,
outer period=687,
max times=2700,
increment=2}
\newcommand{\danceofplanets}[1][]{%
%\setkeys{planet}{#1}
\begin{tikzpicture}[planets/.cd,#1]
\edef\iloop{0}
\loop
\let\x\iloop
\begingroup
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathsetmacro{\y}{(\x/\innerperiod)*\outerperiod}
\pgfmathsetmacro{\y}{\y-int(\y/360)*360}
\pgfmathsmuggle\y
\endgroup
\pgfmathsetmacro{\x}{Mod(\x,360)}
\draw[help lines]
(\x:\outerdistance) --
(\y:\innerdistance);%% <<<--- avoids arithmetic overflow
\edef\iloop{\the\numexpr\iloop+\increment}
\ifnum\iloop<\maxtimes\repeat
\end{tikzpicture}%
}
\begin{document}
\danceofplanets[ %% Venus and Earth
outer period=365.2,
inner period=224.7,
inner distance=5.41cm,
outer distance=7.48cm,
increment=5]
% \danceofplanets[ %% Mercury and Mars - TOO LARGE
% outerperiod=687,
% innerperiod=88,
% outerdistance=22.79cm,
% innerdistance=5.79cm,
% increment=5]
\danceofplanets[ %% Mercury and Mars - needs maxtimes<2099 to work
outer period=687,
inner period=88,
outer distance=22.79cm,
inner distance=5.79cm,
increment=1,
max times=2700]
\end{document}
人们可以对此进行完善,但在这之前,我想知道我是否遗漏了问题的某些关键部分。
额外的:这是支持偏心率和近日点相位(这是正确的术语吗?)的原型版本。它基于第一个解决方案,因此不支持过大的值max times
。
\documentclass[tikz,border=20pt]{standalone}
\tikzset{planets/.cd,outer distance/.store in=\outerdistance,
inner distance/.store in=\innerdistance,
outer period/.store in=\outerperiod,
inner period/.store in=\innerperiod,
outer eccentricity/.store in=\outereccentricity,
inner eccentricity/.store in=\innereccentricity,
max times/.store in=\maxtimes,
increment/.store in=\increment,
phase/.store in=\perihelionphase,
outer distance=22.79cm,
inner distance=5.79cm,
inner period=88,
outer period=687,
max times=2700,
increment=2,
outer eccentricity=1,
inner eccentricity=1,
phase=0}
\newcommand{\danceofplanets}[1][]{%
%\setkeys{planet}{#1}
\begin{tikzpicture}[planets/.cd,#1]
\edef\iloop{0}
\edef\x{0}
\edef\y{\perihelionphase}
\pgfmathsetmacro{\outerydistance}{\outereccentricity*\outerdistance}%
\pgfmathsetmacro{\innerydistance}{\innereccentricity*\innerdistance}%
\loop
\pgfmathsetmacro{\x}{Mod(\x+\increment,360)}
\pgfmathsetmacro{\y}{Mod(\y+(\increment/\innerperiod)*\outerperiod,360)}
\draw[help lines]
(\x:\outerdistance\space and \outerydistance pt) --
([rotate=-\perihelionphase]\y:\innerdistance\space and \innerydistance pt);%
\edef\iloop{\the\numexpr\iloop+\increment}
\ifnum\iloop<\maxtimes\repeat
\end{tikzpicture}%
}
\begin{document}
\danceofplanets[ %% Mercury and Mars
outer period=687,
inner period=88,
outer distance=22.79cm,
outer eccentricity=0.2,
inner distance=5.79cm,
inner eccentricity=0.3,
phase=30,
increment=5]
\end{document}
答案2
这不是答案;而是带有图片的沉思的提示。
最终,我们看到的是重力如何运作的视觉表现:通过轨道共振机制在太阳系中传递动量,因为扭曲时空需要能量(质量),尤其是当其他人以另一种方式扭曲时空时。最终结果是一系列“上坡”和“下坡”,阻碍或促进该方向/时间配对的运动。
最好是 3D 版本,以便看到管道和通道。
===
距离给出了尺度(两者均为 100 个单位,这是“缩放”或“温度”的舒适范围 - 将重力视为非常非常慢的电子),时间比给出了“花瓣”的数量,即两个时间之间的(无量纲)差异。
举例来说:
考虑:
相差 5 = 5 个花瓣
比例 1:6
比例 8:13
比例为31:36
差 4 = 4 片花瓣
比例 1:5
比例 8:12
发生了什么事?8:12 实际上是 2:3 = 差 1。正确。
比例为31:35
相差 6 = 6 片花瓣
比例为1:7
比例为8:14
= 4:7 = 差异3。正确。
比例为11:17
想想为什么 8:14、9:15、10:16,都相差 6,却不会产生 6 个花瓣。
我留给读者一项练习......