我正在尝试编写一个 \newcommand 来在 PGF 中绘制一个小火柴人。它尚未完成,但现在看起来像这样:
\newcommand{\man}[1] {
% #1 : The position of the head of the stick man
\coordinate (X) at (#1);
\coordinate (Y) at ($(#1)+(0,1mm)$);
\draw [black,fill=green,thin] ($(#1)+(290:2mm)$) arc (-70:240:2mm)--++(-3mm,0)--++(0,-1mm)
--++(3mm,0)--++(0,-3mm)--++(225:3mm)--++(315:1mm)coordinate(A)--++(45:1mm)coordinate(B)--
(intersection of A--B and X--Y)--
(#1)--cycle;
}
函数输入 #1 是他头部的中心。路径从他头部的右侧开始,向左侧画一个弧线(他的头部),然后描出他的左臂和身体的左侧。当涉及到他的腿时,我切换到使用极坐标,因为我希望他的腿以 45 度延伸。问题出现在从绘制他的左腿回来的路上。我希望他的胯部(找不到更好的词)位于头部中心的正下方。所以我试图找到一种方法来定义位于通过(#1)的垂直线和通过(A)的 45 度线的交点上的点。
现在我必须提前定义坐标 (X) 和 (Y),它们定义了穿过他头部中心的垂直线。并且我必须在路径上定义 (A) 和 (B),以定义沿他腿部 45 度的线。然后我可以使用 (A-B 和 X-Y 的交点)。我的问题是,我是否可以更优雅地做到这一点,而无需定义这些无关的坐标 (X)、(Y) 和 (B)?
我尝试过类似
(intersection of A--$A+(45:1mm)$ and X--$X+(0,1mm)$)
但那没有用。
根据彼得的评论,这里有一个最低限度的工作示例:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\man}[1] {
% #1 : The position of the head of the stick man
\coordinate (X) at (#1);
\coordinate (Y) at ($(#1)+(0,1mm)$);
\draw [black,fill=green,thin] ($(#1)+(290:2mm)$) arc (-70:240:2mm)--++(-3mm,0)--++(0,-1mm)
--++(3mm,0)--++(0,-3mm)--++(225:3mm)--++(315:1mm)coordinate(A)--++(45:1mm)coordinate(B)--
(intersection of A--B and X--Y)--
(#1)--cycle;
}
\begin{document}
\tikz{\man{3,3}}
\end{document}
答案1
这是我所能得到的最优雅的结果(无需预先计算任何东西)。
首先:没有calc
库。($(#1)+(#2)$)
语法转换为([shift={(#1)}] #2)
= ([shift={(#2)}] #1)
。
骨盆区域已使用两个辅助坐标和intersection of
语法创建。
此外,我发现使用 TikZ 可能更优雅,并创建了一种insert path
风格。(当然,您可以简单地将其转换回自己的命令。
代码
\documentclass[tikz,convert=false]{standalone}
\tikzset{
man/.style={
insert path={
([shift={(+-60:+2mm)}]#1) arc[radius=+2mm, start angle=+-60, end angle=+240] --
++(left: +3mm) --
++(down: +1mm) --
++(right:+3mm) --
++(down: +3mm) --
++(225: +3mm) --
++(315: +1mm) coordinate (@aux1) --
++(45: +1mm) --
(intersection of #1--[shift={(down:+1cm)}] #1 and @aux1--[shift={(+45:+1cm)}]@aux1)
coordinate (@aux2) --
(intersection of @aux1--[shift={(right:+1cm)}]@aux1 and @aux2--[shift={(+-45:+1cm)}]@aux2) --
++(45: +1mm) --
++(135: +3mm) --
++(up: +3mm) --
++(right:+3mm) --
++(up: +1mm) -- cycle
}
}
}
\begin{document}
\tikz \path[draw=black,fill=green,thin,line join=round] [man={3,3}];
\end{document}