TikZ 我可以根据基向量而不是物理坐标提取点的坐标吗?

TikZ 我可以根据基向量而不是物理坐标提取点的坐标吗?

我有一个\drawanchor宏,用于在 TikZ 绘图中绘制并标记一个点。对于每个命名点,XI 想要提取其坐标,并能够在文档中稍后打印它们。

我已经让它工作了,除了坐标是以最终的维度坐标给出的,但我想要以xy基向量表示的坐标。(我将在下面澄清这一点。)

这是一个不太正确的结果:

    \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其中xy是指定的有维基向量,但这不是我想要的——我想要基向量的系数。

我可以改变的定义\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}

相关内容