![Tikz:椭圆形以与所附圆类似的方式进行划分](https://linux22.com/image/355097/Tikz%EF%BC%9A%E6%A4%AD%E5%9C%86%E5%BD%A2%E4%BB%A5%E4%B8%8E%E6%89%80%E9%99%84%E5%9C%86%E7%B1%BB%E4%BC%BC%E7%9A%84%E6%96%B9%E5%BC%8F%E8%BF%9B%E8%A1%8C%E5%88%92%E5%88%86.png)
我正在尝试生成一个类似于此处显示的圆形的椭圆。
感谢你的帮助。
我已经尝试过以下代码。
\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
节点的角度,其中。使用上面的第二个链接,由以下积分给出:k
k=1,2,...,8
t_k
现在剩下的就是(可能用数字方式)计算第一个积分并求第二个积分的逆,得到,然后将它们插入到 LaTeX 中。使用 Mathematica,根据上面第二个链接的解释,如果和t_k
,我们可以得到类似下面的代码:a=5
b=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}
请注意在和函数{}
周围使用花括号,如果没有它们,代码将无法编译。我首先定义了坐标,因此代码不会太混乱。结果如下所示:cos
sin
接下来,我们将所有花哨的东西添加到您的图表中。对于不在圆圈中的数字,我们实际上需要再次运行 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}