使用 pgf/tikz 创建欧元符号

发布于 2024-10-06 16:36:28 字数 4138 浏览 0 评论 0原文

我正在尝试在 TikZ 中重建欧元符号。我的基本指南是 http://upload.wikimedia.org/wikipedia/commons/5/ 57/Euro_Construction.svg

我遇到的问题是我可以计算到目前为止的所有交点,但是 我无法指示 tikz 绘制从 A 到 K 的弧线。虽然我可以绘制 据我所知,使用剪切的弧不会产生连接的 小路。我试图避免手动计算所有角度。

对于 SVG 支持,有 \pgfpatharcto,尽管这似乎有点矫枉过正, 它可能会完成这项工作,这导致我进入下一个问题:如何从 命名坐标,例如 (A) 在 \pgfpatharcto? 中使用它们?更好的是: 我如何在 svg 路径数据中使用命名坐标?这基本上会 将问题简化为写作 \draw ... (B) -- (A) svg "a 6 6 0 0 0 (K)" -- (O) ...;

我已经拥有的是:

替代文字
(来源:skitch.com

已上传Skitch

使用:

\begin{tikzpicture}
\draw[step=5mm, gray, very thin] (-7.5,-7.5) grid (7.5,7.5); % grid

% inner and outer circle to be used for the intersections
\path[name path=outer] (0,0) circle[radius=6];
\path[name path=inner] (0,0) circle[radius=5];

% upper, semi upper, semi lower and lower horizontal lines.
\path[name path=U] (-7.5,1.5) -- (4,1.5);
\path[name path=u] (-7.5,0.5) -- (4,0.5);
\path[name path=l] (-7.5,-0.5) -- (4,-0.5);
\path[name path=L] (-7.5,-1.5) -- (4,-1.5);

% the upwards slope and the vertical line at +-40 deg at 5 units.
\path[name path=slope] ($(0,-6)!0.25!(40:5)$) -- ($(0,-6)!1.25!(40:5)$);
\path[name path=fourty] ($(40:5)!0.5!(-40:5)$) -- ($(40:5)!1.25!(-40:5)$);

% naming all the intersections.
\path[name intersections={of=outer and slope, by={A}}];
\path[name intersections={of=inner and slope, by={B}}];

\path[name intersections={of=U and slope, by={C}}];
\path[name intersections={of=u and slope, by={D}}];
\path[name intersections={of=l and slope, by={E}}];
\path[name intersections={of=L and slope, by={F}}];

\path[name intersections={of=U and inner, by={G}}];
\path[name intersections={of=u and inner, by={H}}];
\path[name intersections={of=l and inner, by={I}}];
\path[name intersections={of=L and inner, by={J}}];

\path[name intersections={of=U and outer, by={K}}];
\path[name intersections={of=u and outer, by={L}}];
\path[name intersections={of=l and outer, by={M}}];
\path[name intersections={of=L and outer, by={N}}];

\coordinate (O) at ($(-7.5,0.5)+(C)-(D)$);
\coordinate (P) at (-7.5,0.5);
\coordinate (Q) at ($(-7.5,-1.5)+(E)-(F)$);
\coordinate (R) at (-7.5,-1.5);

\path[name intersections={of=fourty and inner, by={S}}];
\path[name intersections={of=fourty and outer, by={T}}];

% drawing the intersections
\foreach \p in {A,...,T} \fill[red] (\p) circle (2pt) node[above left,black] {\footnotesize\p};

% constructing the path
\draw (A) -- (B) (G) -- (C) -- (D) -- (H) (I) -- (E) -- (F) -- (J) (S) -- (T) (N) -- (R) -- (Q) -- (M) (L) -- (P) -- (O) -- (K);

% missing segments
\draw[gray,dashed] circle[radius=5] circle[radius=6];

\end{tikzpicture}

更新(在pgf maling list 我们得到了以下解决方案)

\draw[thick,fill] let \p1=(A), \p2=(K), \p3=(L), \p4=(M), \p5=(N), \p6=(T),
               \p7=(S), \p8=(J), \p9=(I), \p{10}=(H), \p{11}=(G), \p{12}=(B),
               \n{aA}={atan2(\x1,\y1)}, \n{aK}={atan2(\x2,\y2)},
               \n{aL}={atan2(\x3,\y3)}, \n{aM}={360+atan2(\x4,\y4)},
               \n{aN}={360+atan2(\x5,\y5)}, \n{aT}={360+atan2(\x6,\y6)},
               \n{aS}={360+atan2(\x7,\y7)}, \n{aJ}={360+atan2(\x8,\y8)},
               \n{aI}={360+atan2(\x9,\y9)}, \n{aH}={atan2(\x{10},\y{10})},
               \n{aG}={atan2(\x{11},\y{11})}, \n{aB}={atan2(\x{12},\y{12})}
               in (A) arc (\n{aA}:\n{aK}:6) -- (O) -- (P)
               -- (L) arc (\n{aL}:\n{aM}:6) -- (Q) -- (R)
               -- (N) arc (\n{aN}:\n{aT}:6)
               -- (S) arc (\n{aS}:\n{aJ}:5) -- (F) -- (E)
               -- (I) arc (\n{aI}:\n{aH}:5) -- (D) -- (C)
               -- (G) arc (\n{aG}:\n{aB}:5) -- cycle;

这让 TikZ 计算点的角度,然后简单地调用 arc. 对我来说最棘手的部分是数学引擎的使用。文档太多了 我错过了使用花括号通过数学引擎分配新值的部分。

I'm trying to reconstruct the euro sign in TikZ. My basic guide is
http://upload.wikimedia.org/wikipedia/commons/5/57/Euro_Construction.svg

The problem I've run into is that I can compute all the intersections so far, but
I am unable to instruct tikz to draw the arc from e.g. A to K. While I could draw
that arc using clipping, as far as I understand that would not yield a connected
path. I'm trying to avoid to compute all the angles by hand.

For the SVG support there is \pgfpatharcto, though that seems to be a little overkill,
it might do the job, which leads me to the next issue: how do I get \pgfpoints from
named coordinate e.g. (A) to use them in the \pgfpatharcto? Even better:
how could I use named coordinates in the svg path data? That would basically
reduce the issue to writing
\draw ... (B) -- (A) svg "a 6 6 0 0 0 (K)" -- (O) ...;

What I already have is this:

Alt text
(source: skitch.com)

Uploaded with Skitch

using:

\begin{tikzpicture}
\draw[step=5mm, gray, very thin] (-7.5,-7.5) grid (7.5,7.5); % grid

% inner and outer circle to be used for the intersections
\path[name path=outer] (0,0) circle[radius=6];
\path[name path=inner] (0,0) circle[radius=5];

% upper, semi upper, semi lower and lower horizontal lines.
\path[name path=U] (-7.5,1.5) -- (4,1.5);
\path[name path=u] (-7.5,0.5) -- (4,0.5);
\path[name path=l] (-7.5,-0.5) -- (4,-0.5);
\path[name path=L] (-7.5,-1.5) -- (4,-1.5);

% the upwards slope and the vertical line at +-40 deg at 5 units.
\path[name path=slope] ($(0,-6)!0.25!(40:5)$) -- ($(0,-6)!1.25!(40:5)$);
\path[name path=fourty] ($(40:5)!0.5!(-40:5)$) -- ($(40:5)!1.25!(-40:5)$);

% naming all the intersections.
\path[name intersections={of=outer and slope, by={A}}];
\path[name intersections={of=inner and slope, by={B}}];

\path[name intersections={of=U and slope, by={C}}];
\path[name intersections={of=u and slope, by={D}}];
\path[name intersections={of=l and slope, by={E}}];
\path[name intersections={of=L and slope, by={F}}];

\path[name intersections={of=U and inner, by={G}}];
\path[name intersections={of=u and inner, by={H}}];
\path[name intersections={of=l and inner, by={I}}];
\path[name intersections={of=L and inner, by={J}}];

\path[name intersections={of=U and outer, by={K}}];
\path[name intersections={of=u and outer, by={L}}];
\path[name intersections={of=l and outer, by={M}}];
\path[name intersections={of=L and outer, by={N}}];

\coordinate (O) at ($(-7.5,0.5)+(C)-(D)$);
\coordinate (P) at (-7.5,0.5);
\coordinate (Q) at ($(-7.5,-1.5)+(E)-(F)$);
\coordinate (R) at (-7.5,-1.5);

\path[name intersections={of=fourty and inner, by={S}}];
\path[name intersections={of=fourty and outer, by={T}}];

% drawing the intersections
\foreach \p in {A,...,T} \fill[red] (\p) circle (2pt) node[above left,black] {\footnotesize\p};

% constructing the path
\draw (A) -- (B) (G) -- (C) -- (D) -- (H) (I) -- (E) -- (F) -- (J) (S) -- (T) (N) -- (R) -- (Q) -- (M) (L) -- (P) -- (O) -- (K);

% missing segments
\draw[gray,dashed] circle[radius=5] circle[radius=6];

\end{tikzpicture}

UPDATE (with the help of the pgf maling list we arrived at the following solution)

\draw[thick,fill] let \p1=(A), \p2=(K), \p3=(L), \p4=(M), \p5=(N), \p6=(T),
               \p7=(S), \p8=(J), \p9=(I), \p{10}=(H), \p{11}=(G), \p{12}=(B),
               \n{aA}={atan2(\x1,\y1)}, \n{aK}={atan2(\x2,\y2)},
               \n{aL}={atan2(\x3,\y3)}, \n{aM}={360+atan2(\x4,\y4)},
               \n{aN}={360+atan2(\x5,\y5)}, \n{aT}={360+atan2(\x6,\y6)},
               \n{aS}={360+atan2(\x7,\y7)}, \n{aJ}={360+atan2(\x8,\y8)},
               \n{aI}={360+atan2(\x9,\y9)}, \n{aH}={atan2(\x{10},\y{10})},
               \n{aG}={atan2(\x{11},\y{11})}, \n{aB}={atan2(\x{12},\y{12})}
               in (A) arc (\n{aA}:\n{aK}:6) -- (O) -- (P)
               -- (L) arc (\n{aL}:\n{aM}:6) -- (Q) -- (R)
               -- (N) arc (\n{aN}:\n{aT}:6)
               -- (S) arc (\n{aS}:\n{aJ}:5) -- (F) -- (E)
               -- (I) arc (\n{aI}:\n{aH}:5) -- (D) -- (C)
               -- (G) arc (\n{aG}:\n{aB}:5) -- cycle;

This lets TikZ compute the angles of the points and from thereon it's a simple call to arc.
The tricky part to me was the usage of the math engine. The documentation was too overwhelming
and I missed the part where new values are assigned with the math engine using the curly braces.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

北音执念 2024-10-13 16:36:28

是有什么问题吗?

\draw (A) arc (Aangle:Kangle:outerRadius)

允许我在 TikZ 中只画过 1 个(数一数,一个)图形, outerRadius 似乎是 6 而 Aangle 似乎是 40 度,这 ,并且我没有立即在提供的数据中看到 Kangles (但该值完全受到限制......看起来像 arcsin(1.5/6) )。

Allowing that I've only ever drawn 1 (count it, one) figure in TikZ, what is wrong with

\draw (A) arc (Aangle:Kangle:outerRadius)

where outerRadius seems to be 6 and Aangle seems to be 40 degrees, and I don't instantly see Kangles in the supplied data (but the value is fully constrained...looks like arcsin(1.5/6) ).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文