将两个范围居中对齐(水平、垂直)

将两个范围居中对齐(水平、垂直)

想象一下,我有两个完全不相关的范围:

  • 范围 1:具有精确尺寸(以毫米为单位)和总体缩放比例的几何图形
  • 范围 2:使用普通无量纲网格的 circuittikz 绘图

现在我想将两个示波器叠放在一起,但垂直和水平对齐。我尝试使用local bounding box第一个示波器的,但由于第二个示波器没有中间/中心锚点,我不知道如何对齐这两个示波器。

请假设:

  • 第一个范围的缩放因子是任意的,不应使用
  • 我确实知道第二个范围的中心点的坐标

您知道我该如何移动第二个示波器的内部坐标系,使原点位于中心吗?或者是否可以以某种方式自动确定第二个示波器的中心并将其用于对齐?

平均能量损失

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\begin{scope}[scale=2, local bounding box = scope1]
\draw[fill=blue, opacity = 0.5] (0,0) rectangle (1,1);
\end{scope}

\begin{scope}[scale=1.5, shift={(scope1.center)}]
\draw[fill=red, opacity = 0.5] (0,0) rectangle (1,1);
\end{scope}

\end{tikzpicture}

\end{document}

我得到了什么

在此处输入图片描述

我想要的是

在此处输入图片描述

非常感谢您的帮助!

更复杂的 MWE

想象一下,我想将电阻器置于矩形的中心:

\documentclass{article}

\usepackage{tikz}
\usepackage{circuitikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}

\begin{scope}[scale=1.5, local bounding box = scope1]
    % These are real dimensions of a more complex geometry
    \filldraw[thin, fill = gray!20!white] (0mm,0mm) 
    -- ++(0mm, 7mm) 
    -- ++(22mm, 0mm)  
    -- ++(0mm, -7mm) 
    -- cycle;
\end{scope}

\begin{scope}[scale=1.2]
    \draw
    (0,0) to [R=$R$] (2,0)
    ;
\end{scope}

\end{tikzpicture}

\end{document}

答案1

为了适当地移动第二幅画,您需要知道它的尺寸。一个允许您将第二幅画定位到您想要的位置的技巧是将其存储在图片中,然后使用矩阵来定位它,因为矩阵在绘制之前会“测量”里面的内容。

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\begin{scope}[scale=2, local bounding box = scope1]
\draw[fill=blue, opacity = 0.5] (0,0) rectangle (1,1);
\end{scope}

\tikzset{pics/centered/.style={code={
\draw[fill=red, opacity = 0.5] (0,0) rectangle (1,1);
}}}

\matrix[at={(scope1.center)}] {
\pic[scale=1.5] {centered};\\
};

\end{tikzpicture}

\end{document}

在此处输入图片描述

但也存在一些限制。例如,内部绘图不能包含矩阵。

答案2

以下是使用最近更新的解决方案tikzmark(链接到,github因为它尚未在 CTAN 上)引入了将范围定位在内部定义的锚点的代码,该锚点在范围构建后进行评估。它使用 tikzmark 来记住位置,这意味着它需要两个复杂功能才能工作。

\documentclass{article}
% \url{https://tex.stackexchange.com/q/517894/86}

\usepackage{tikz}
\usetikzlibrary{tikzmark}

\begin{document}

\begin{tikzpicture}

\begin{scope}[scale=2, local bounding box = scope1]
\draw[fill=blue, opacity = 0.5] (0,0) rectangle (1,1);
\end{scope}

\begin{scope}[
  scale=1.5,
  shift={(scope1.center)},
  anchor=center,
  scope anchor,
]
\draw[fill=red, opacity = 0.5] (0,0) rectangle (1,1);
\end{scope}

\end{tikzpicture}

\end{document}

覆盖范围

(注意:这是新代码,所以我仍在解决一些错误 - 在第一次编译时它会抱怨坐标,但在第二次编译时它可以正常工作。)

相关内容