交叉坐标系

交叉坐标系

我正在尝试编写一个 \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}

在此处输入图片描述

相关内容