我有一个\drawanchor
宏,用于在 TikZ 绘图中绘制并标记一个点。对于每个命名点,XI 想要提取其坐标,并能够在文档中稍后打印它们。
我已经让它工作了,除了坐标是以最终的维度坐标给出的,但我想要以x
和y
基向量表示的坐标。(我将在下面澄清这一点。)
这是一个不太正确的结果:
\documentclass[a4paper]{article}
%% Language and font encodings
\usepackage[english]{babel}
\usepackage{tikz}
\begin{document}
\def\spvec#1{\left(\vcenter{\halign{\hfil$##$\hfil\cr \spvecA#1;;}}\right)}
\def\spvecA#1;{\if;#1;\else #1\cr \expandafter \spvecA \fi}
Demo of \textbackslash spvec: $foo=\spvec{1;2;3}$.
\newcommand{\drawanchor}[4][black]% colour,labelposition,name,coordinate
{%
\coordinate (#3) at #4;%
\path (#3) node[#2]{\textcolor{#1}{$#3$}};%
\pgfgetlastxy{\XCoord}{\YCoord};%
\fill #4 circle (0.09);%
\expandafter\xdef\csname colvec#3\endcsname%
{%
\noexpand\spvec{\XCoord;\YCoord}%
}
}
\begin{tikzpicture}
\drawanchor{left}{A}{(1.2,1.3)}
\drawanchor{right}{B}{(2.1,2.2)}
\end{tikzpicture}
Coordinates are $A=\colvecA, B=\colvecB$.
\end{document}
期望的结果是
Coordinates are A=(1.2), B=(2.1)
(1.3) (2.2)
我知道 TikZ 将逻辑坐标(例如)转换\coordinate (3,4)
为物理坐标,3x+4y
其中x
和y
是指定的有维基向量,但这不是我想要的——我想要基向量的系数。
我可以改变的定义\drawanchor
以保留单独的坐标分量作为参数,但我感兴趣的是找出逻辑坐标是任意命名的点(例如,如果点(foo)
是通过交点计算的)
我怎样才能做到这一点?
答案1
这里提供一种利用的方法\pgftransforminvert
。
但是这个宏非常不准确,最好使用它自己的逆矩阵计算器。
\documentclass[border=9,tikz]{standalone}
\usepackage{}
\begin{document}
\makeatletter
\newdimen\pgf@xd
\newdimen\pgf@yd
% before this command, \pgf@x is the real x-coordinate
\def\pgfpointinbasis{
{ % not to ruin anything
\pgf@xd\pgf@x
\pgf@yd\pgf@y
\pgftransformreset
\pgftransformcm{\pgf@xx}{\pgf@xy}{\pgf@yx}{\pgf@yy}{\pgfpointorigin}
\message{^^J^^J\pgf@pt@aa,\pgf@pt@ba,\pgf@pt@ab,\pgf@pt@bb^^J^^J}
\pgftransforminvert
\message{^^J^^J\pgf@pt@aa,\pgf@pt@ba,\pgf@pt@ab,\pgf@pt@bb^^J^^J}
\pgfpointtransformed{\pgfpoint{\pgf@xd}{\pgf@yd}}
\pgfmathsetmacro\abs@x{\pgf@x}\xdef\abs@x{\abs@x}
\pgfmathsetmacro\abs@y{\pgf@y}\xdef\abs@y{\abs@y}
}
}
% after this command, \abs@x is the abstract x-coordinate
\tikz{
\pgfsetxvec{\pgfpoint{1.2cm}{0cm}}
\pgfsetyvec{\pgfpoint{.4cm}{.9cm}}
\draw[->](1.2,0)node{$x$}(0,0)->(1,0);
\draw[->](0,1.2)node{$y$}(0,0)->(0,1);
\fill
(3,3)coordinate(A)circle(.05)node[above left]{We put $A$ here $\searrow$};
\fill[rotate=70]
(3,3)coordinate(B)circle(.05)node[above left]{We put $B$ here $\searrow$};
\fill[rotate=30][xshift=100]
(3,3)coordinate(C)circle(.05)node[above left]{We put $C$ here $\searrow$};
\tikz@scan@one@point\pgfpointinbasis(A)
\draw(\abs@x,\abs@y)circle(.1)node[below right]{$\nwarrow$ The estimated coordinate is (\abs@x,\abs@y)};
\tikz@scan@one@point\pgfpointinbasis(B)
\draw(\abs@x,\abs@y)circle(.1)node[below right]{$\nwarrow$ The estimated coordinate is (\abs@x,\abs@y)};
\tikz@scan@one@point\pgfpointinbasis(C)
\draw(\abs@x,\abs@y)circle(.1)node[below right]{$\nwarrow$ The estimated coordinate is (\abs@x,\abs@y)};
}
\end{document}