我正在尝试生成字形图。我的想法是,我有一个元素列表,其中包含 4 个值(0.0 .. 1.0),它们代表特定特征的值。我的目标是连接这些点,但我无法访问元素数组中的数据。我尝试了一些宏,但\pgfmathparse
没有成功。以下是我正在尝试执行的操作的示例:
\documentclass{standalone}
\usepackage{pgfmath,pgffor}
\begin{document}
\def\elements{{0.5,0.5,0.59,0.5}, {0.2,0.5,0.5,0.8} }% romboide and a diamond shape
\foreach \elementPoints [count=\i] in \elements {
\draw ({2.2*\i},0) ++(\elementPoints[1],0) node (a) {}
({2.2*\i},0) ++(0,\elementPoints[2]) node (b) {}
({2.2*\i},0) ++({-1*\elementPoints[3]},0) node (c) {}
({2.2*\i},0) ++(0,{-1*\elementPoints[4]}) node (d) {};
\draw (a) -- (b) -- (c) -- (d) -- (a);
}
\end{document}
谢谢
答案1
您的代码中存在一些错误:
您只加载了包pgfmath
和,pgffor
但没有加载tikz
,但您使用了\draw
和 TikZ 的路径语法。不过,它们还需要环境tikzpicture
(或\tikz
宏)。
PGFmath 数组的索引从0
not开始1
。
宏中的数组\elements
需要另一组括号{ }
才能表明它们实际上是数组,\foreach
将列表分成两个数组时,第一对括号会被剥离。
此外,您使用node
形状的默认 s rectangle
,具有垂直和水平尺寸。我相信这不是您想要的。coordinate
如果您只是想用名称保存坐标,请使用 s:
\foreach \elementPoints [count=\i] in \elements {
\path (2.2*\i,0) +( \elementPoints[0], 0) coordinate (a)
+( 0, \elementPoints[1]) coordinate (b)
+(-1*\elementPoints[2], 0) coordinate (c)
+( 0, -1*\elementPoints[3]) coordinate (d);
\draw (a) -- (b) -- (c) -- (d) -- cycle;
}
您不必保存坐标并稍后连接它们,也可以直接在路径上连接它们。
insert path
无论如何,也许您对使用样式和极坐标(也可以在您的示例中使用)的较短版本的代码感兴趣。
参考
- PGF 手册
+
和之间的差异++
(第 2.15 节“指定坐标”,第 31 页及以上)- 键
insert path
(第 14 章“路径规范的语法”,第 139 页) - 看一下
kite
第 62.3 节“几何形状”中的形状,第 623f 页。
原始方法
\documentclass[tikz,convert]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\def\elements{{{0.5,0.5,0.59,0.5}}, {{0.2,0.5,0.5,0.8}}}% romboide and a diamond shape
\foreach \elementPoints [count=\i] in \elements
\draw (2.2*\i,0) +( \elementPoints[0], 0)
-- +( 0, \elementPoints[1])
-- +(-1*\elementPoints[2], 0)
-- +( 0, -1*\elementPoints[3])
-- cycle;
\end{tikzpicture}
\end{document}
输出(原始)
不同的方法
\documentclass[tikz,convert]{standalone}
\usepackage{tikz}
\tikzset{
romb/.style args={#1:#2:#3:#4}{
insert path={ +(right:{#1}) -- +( up:{#2})
-- +( left:{#3}) -- +( down:{#4}) -- cycle
}
}
}
\begin{document}
\begin{tikzpicture}
\draw[ draw=blue, fill=red ] (0,0) [romb=.5:.5:.59:.5];
\draw[very thick, draw=green, fill=blue] (2,0) [romb=.2:.5:.5 :.8];
\end{tikzpicture}
\end{document}