Tikz:椭圆形以与所附圆类似的方式进行划分

Tikz:椭圆形以与所附圆类似的方式进行划分

在此处输入图片描述

我正在尝试生成一个类似于此处显示的圆形的椭圆。

感谢你的帮助。

我已经尝试过以下代码。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{arrows}
\begin{document}
\begin{tikzpicture}[>=latex]

\draw [dashed, line width=0.5pt] (0,0) ellipse (6cm and 4cm);

\foreach \i [evaluate={\a=\i*45-45; \b=\a+22.5; \c=cos(\b)<0; \d=sin(\b)<0;}] in {1,...,8}{
    \draw [line width=0.50pt](\a:3.95) -- (\a:4.05) node [at end, anchor=\a+180] {\i};
    \tikzset{shift=(\b:4)}
    \node [anchor=\b+180, circle, draw, outer sep=1ex] {\i};
    \draw [line width=0.5pt][->](\c*1.5-0.75,0) -- (0,0) node [at start, anchor=180*\c] {$\rho_{x_{\i}}$};
    \draw [line width=0.5pt][->](0,\d*1.5-0.75) -- (0,0) node [at start, anchor=180*\d+90] {$\rho_{y_{\i}}$};
}
\draw [line width=0.50pt](-0.10,0) -- (0.10,0);
\draw [line width=0.50pt](0,-0.10) -- (0,0.10);

\end{tikzpicture}
\end{document}

答案1

我完全同意@Zarko 的观点 - 这更像是一个数学挑战,而不是 LaTeX 挑战。但由于我对这两个领域都很感兴趣,我认为答案很有趣,我会尝试一下。如果我理解正确的话,你想要的是相同的图片,但对于椭圆形,椭圆的圆周被分成 8 个等长的部分。如果这是你的目标,如果你想了解更多有关这方面的背景知识,请查看以下页面:

我假设这就是你的目标。首先,设置a为宽度的一半(半长轴),b设置为高度的一半(半短轴),假设宽度大于高度。设置c为椭圆的周长,使用上面的第一个链接,它是以下积分:

在此处输入图片描述

设为图表外部t_k节点的角度,其中。使用上面的第二个链接,由以下积分给出:kk=1,2,...,8t_k

在此处输入图片描述

现在剩下的就是(可能用数字方式)计算第一个积分并求第二个积分的逆,得到,然后将它们插入到 LaTeX 中。使用 Mathematica,根据上面第二个链接的解释,如果和t_k,我们可以得到类似下面的代码:a=5b=3

a = 5;
b = 3; 
c = 4*a*NIntegrate[Sqrt[1 - (1 - b^2/a^2)*Sin[t]^2], {t, 0, Pi/2}];
Theta[a_, b_, s_] := t /. FindRoot[b EllipticE[t, (b^2 - a^2)/b^2] == s, {t, 0}]; 
Table[Theta[a, b, c/16 + k*c/8]*180/Pi, {k, 0, 7}]

然后我们将上面代码生成的表格元素放入 LaTeX 中,首先只包含指向节点的箭头。代码如下:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}
\draw[dashed] (0,0) ellipse (5 and 3);
\foreach \ang\name in {28.5757/1, 71.5146/2, 108.485/3, 151.424/4, 208.576/5, 251.515/6, 288.485/7, 331.424/8}{
  \coordinate (\name) at ({5*cos(\ang)},{3*sin(\ang)});
}
\foreach \name\da\db in {1/180/270, 2/180/270, 3/270/0, 4/270/0, 5/0/90, 6/0/90, 7/90/180, 8/90/180}{
  \draw[<-] (\name)--++(\da:.5);
  \draw[<-] (\name)--++(\db:.5);
}
\end{tikzpicture}

\end{document}

请注意在和函数{}周围使用花括号,如果没有它们,代码将无法编译。我首先定义了坐标,因此代码不会太混乱。结果如下所示:cossin

在此处输入图片描述

接下来,我们将所有花哨的东西添加到您的图表中。对于不在圆圈中的数字,我们实际上需要再次运行 Mathematica 代码来获取它们之间的角度(或者我想您可以只取两个连续角度的差值)。为了使节点名称正常\rho工作,循环中还必须进行一些切换\foreach。无论哪种方式,都需要做更多的工作。

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{calc,arrows.meta}

\begin{document}

\begin{tikzpicture}
\draw[dashed] (0,0) ellipse (5 and 3);
\foreach \ang\name in {28.5757/1, 71.5146/2, 108.485/3, 151.424/4, 208.576/5, 251.515/6, 288.485/7, 331.424/8}{
  \coordinate (\name) at ({5*cos(\ang)},{3*sin(\ang)});
  \node[circle,draw] at ($(\name)+(\ang:.5)$) {\name};
}
\foreach \name\da\db in {1/180/270, 2/180/270, 3/0/270, 4/0/270, 5/0/90, 6/0/90, 7/180/90, 8/180/90}{
  \draw[{Triangle[angle=30:2pt 4]}-] (\name)--++(\da:.5) node[anchor=\da-180] {$\rho_{x_\name}$};
  \draw[{Triangle[angle=30:2pt 4]}-] (\name)--++(\db:.5) node[anchor=\db-180] {$\rho_{y_\name}$};
}
\foreach \ang\name in {0/1, 51.6959/2, 90/3, 128.304/4, 180/5, 231.696/6, 270/7, 308.304/8}{
  \draw ($({5*cos(\ang)},{3*sin(\ang)})+(\ang:.05)$)--++(\ang-180:.1);
  \node at ($({5*cos(\ang)},{3*sin(\ang)})+(\ang:.3)$) {\name};
}
\node at (0,0) {$+$};
\end{tikzpicture}

\end{document}

结果如下。很多参数,例如箭头的长度、箭头尖端的粗细、\rho节点的大小(用或类似更改scale=.8)、编号节点相对于椭圆的位置都可以轻松更改,具体取决于您的偏好。

在此处输入图片描述

答案2

如果需要将圆周分成相等的长度,那么装饰可以提供合理的近似值。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}[>=stealth]
\draw [dashed,
  preaction={decoration={markings,
    mark=between positions 0.0625 and 1 step 0.125 with { 
      \coordinate (m-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number});
    }
  }, decorate},
  preaction={decoration={markings,
    mark=between positions 0 and 1 step 0.125 with { 
      \coordinate (n-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number});
    }
  }, decorate}] ellipse [x radius=5, y radius=3];
\foreach \i [evaluate={
    \a=157.5+45*\i; \b=135+45*\i;
    \ya=floor((\i-1)/4)*180-90; \xa=floor((\i+1)/4+1)*180;}] 
    in {1,...,8}{
  \node [circle, draw, outer sep=5pt, anchor=\a] at (m-\i) {\i};
    \draw [<-] (m-\i) -- ++(\ya:1/2) node [anchor=\ya+180] {$\rho_{y_{\i}}$};
    \draw [<-] (m-\i) -- ++(\xa:1/2) node [anchor=\xa+180] {$\rho_{x_{\i}}$};
    \draw [shift={(n-\i)}] 
      (\b:-1/16) -- (\b:1/16) node [at end, circle, anchor=\b] {\i};
} 
\draw (180:1/16) -- (0:1/16) (90:1/16) -- (270:1/16);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容