行星之舞:简介

行星之舞:简介

行星之舞:简介

我得到了一些关于我的问题的精彩答案金星和地球的天体之舞。在这个问题中,我将提出一个更概括的问题,该问题涉及任何两个天体对的舞蹈。现在,让我考虑一下从地球上观察金星和地球的舞蹈。从我们在地球上的角度来看(即在地心系统中),我们感觉我们静止不动,太阳在绕着我们转(而实际上,地球在绕着太阳转)。我们还知道金星在绕着太阳转。现在想象一个以地球为中心,太阳和金星绕着地球转的图,金星本身绕着太阳转的图。在这个图中,在金星中心和太阳中心之间画一条假想线,然后运行模拟,观察太阳和金星以不同的速度绕地球转。我用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,以使尺寸足够小以便在输出中打印。和之间的比率必须是固定的,并且很容易找出近似值以使代码可编译(检查来自innerdistanceouterdistanceinnerdistanceouterdistancemaxtimes页面)。但是,在使用此宏时,应通过反复试验来计算生成行星美丽对称舞蹈的确切值。例如,\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: picturemode 值!

\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,但我保留\pgfmathsetmacros 是有原因的:它们比 更快\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

d16

比例 8:13

d813

比例为31:36

d3136

差 4 = 4 片花瓣

比例 1:5

d15

比例 8:12

d812

发生了什么事?8:12 实际上是 2:3 = 差 1。正确。

比例为31:35

d3135

相差 6 = 6 片花瓣

比例为1:7

d17

比例为8:14

d814

= 4:7 = 差异3。正确。

比例为11:17

d1117

想想为什么 8:14、9:15、10:16,都相差 6,却不会产生 6 个花瓣。

我留给读者一项练习......

相关内容