使用可扩展形状进行绘图

使用可扩展形状进行绘图

序言:这不再是另一个“如何缩放节点形状?”的问题,而是在特定情况下对通常的答案(“你可以,但是这很尴尬,你可能不应该这样做”)的后续回答。


我正在研究由一维像素或任务行(主要用矩形表示)组成的一系列图表:

像素图

从 TikZ 教程开始,我开始使用样式化的nodes 来处理几乎所有内容:所有像素,以及像素组周围的边框,以及图形子区域周围的定位框。这使得定位(例如使用positioningfit库)相对简单。在节点之间绘制路径(在其边框上选择合适的位置)、自动偏移以补偿线宽(例如,绘制具有完美重叠共享笔划的矩形)等所有智能都right = of <last node>, node distance = 0非常有用。只需命名相应的节点,就可以绘制此处看到的蓝色依赖箭头之类的东西,这变得非常方便,因为这些只是经典的节点到节点路径。

这样做的结果是,这些像素矩形的大小是使用inner sep和/或指定的minimum size

然而,由于我有图形背景,我认为变换堆栈是一种非常有用的方法来编写简单且可组合的绘图代码。然而,一旦我开始尝试使用相对坐标(例如,,inner sep = 0.5因此每个像素的宽度/高度恰好是 1 个逻辑 PGF 单位,结合/tikz/x = 3mm, /tikz/y = 3mm,设置整个画布的单位大小)和坐标变换(设置scale一个范围以稍微缩小某个区域的像素;用于shift移动子绘图的位置),我就会发现 TikZ 将变换应用于所有内容节点内几何。

我知道这个transform shape选项,但(1)这似乎普遍不受欢迎(用一些关于这个主题的答案来解释,变换+节点=邪恶),(2)即使这样也不能使定义xy坐标向量到所需大小的简单示例与inner sep/一起正常工作minimum size,因为这些是总是解释为具有绝对单位的测量值。

绘制符合变换堆栈的形状的推荐方法似乎是仅使用路径。然后,像素可能类似于\draw[pixelstyle] (0,0) rectangle +(1,1);。这会按预期尊重变换上下文,但会失去节点定位和通过引用绘制连接路径的所有良好行为。

所以我的问题是一个设计问题:TikZ 专家将如何处理这种类型的绘图?

答案1

minimum width这是和键的基本定义minimum height(在/tikz名称空间中),每个键都接受一个参数,通过 PGFmath 对其进行解析,当它是无单位输入时,它会将其抛入 PGF 的坐标系(您可以使用 和 键更改的坐标系xy。对于宽度,X长度和高度长度被视为节点的宽度/高度。对于带有单位的参数,它将像以前一样运行。

如果你彻底改变坐标系,这个基本实现将停止工作。例如,我们设置x=(60:1cm),那么X向量的长度(1, 0)将仅为0.5cm(我们可以通过使用函数veclen(x, y)来评估此向量的真实长度来更改它)。此外,节点不会根据此进行旋转,我们可以通过旋转以下量来解决

\pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfpointxy{1}{0}}

计算结果为(在我们的例子中,这将是 60.00003°)。

不过,如果向量并不真正正交于X向量,这不会有什么好结果。那么我们如何变换(之前的)矩形节点呢?

代码

\documentclass[tikz,png={size=200},convert=false]{standalone}
\usetikzlibrary{backgrounds}
\makeatletter
\tikzset{
  minimum width/.code=%
    \pgfmathparse{#1}%
    \ifpgfmathunitsdeclared
      \pgfset{minimum width/.expanded=+\pgfmathresult pt}%
    \else
      \pgf@process{\pgfpointxy{\pgfmathresult}{0}}%
      \pgfset{minimum width/.expanded=+\the\pgf@x}
    \fi,
  minimum height/.code=%
    \pgfmathparse{#1}%
    \ifpgfmathunitsdeclared
      \pgfset{minimum height/.expanded=+\pgfmathresult pt}%
    \else
      \pgf@process{\expandafter\pgfpointxy\expandafter{\expandafter0%
        \expandafter}\expandafter{\pgfmathresult}}% or \edef
      \pgfset{minimum height/.expanded=+\the\pgf@y}
    \fi,
  minimum size/.style={
    /tikz/minimum width={#1},
    /tikz/minimum height={#1}}
}
\makeatother
\begin{document}
\tikz[gridded]
  \node[draw, above right, inner sep=+0pt, outer sep=+0pt, minimum size=1] {};

\tikz[gridded, x=(60:1cm)]{ 
  \node[draw, above right, inner sep=+0pt, outer sep=+0pt, minimum size=1] {}
                                                   [-latex] (0,0) edge (1,0) edge (0,1);
  \pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfpointxy{1}{0}}
  \node [below]{$\pgfmathresult^\circ$};
}
\end{document}

输出

在此处输入图片描述

在此处输入图片描述

相关内容