Tikz Отображение координат в тексте узла на масштабированном изображении

Tikz Отображение координат в тексте узла на масштабированном изображении

Пытаюсь отобразить значение координаты, однако при использовании приведенного ниже метода значение выводится неточно.

Шкала пытается быть извлечена с помощьюВосстановить коэффициент масштабирования в TikZа затем используйте значение масштабного коэффициента, как вИзвлечь координаты x, y произвольной точки в TikZ. Однако @scalefactor всегда возвращает 1 в \xcoord и \ycoord, несмотря на то, что показывает фактический коэффициент, если он используется на рисунке Tikz.

Есть идеи, как это исправить?

%!TeX program = lualatex
\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{math, calc}

%% https://tex.stackexchange.com/questions/86897/recover-scaling-factor-in-tikz
\newcommand*\getscale[1]{%
\begingroup
\pgfgettransformentries{\scaleA}{\scaleB}{\scaleC}{\scaleD}{\whatevs}{\whatevs}%
\pgfmathsetmacro{#1}{sqrt(abs(\scaleA*\scaleD-\scaleB*\scaleC))}%
\expandafter
\endgroup
\expandafter\def\expandafter#1\expandafter{#1}%
}

% for printing out coordinates in Tikz coordinate variable
\makeatletter
\newcommand\xcoord[1]{{%
    \getscale{\@scalefactor}%
    \pgfpointanchor{#1}{center}%
    \pgfmathparse{\pgf@x/\pgf@xx/\@scalefactor}%
    \pgfmathprintnumber{\pgfmathresult}%    
}}
\newcommand\ycoord[1]{{%
        \getscale{\@scalefactor}%
        \pgfpointanchor{#1}{center}%
        \pgfmathparse{\pgf@y/\pgf@yy/\@scalefactor}%
        \pgfmathprintnumber{\pgfmathresult}%
}}
\makeatother

\begin{document}

\begin{figure}
    \centering
    
    \begin{tikzpicture}[scale=1/10]
        % GRID - X
        \foreach \i in {0,24,...,120}{
            \draw[gray, thin] (\i,-12) -- (\i,184);
            \tikzmath{int \value; \value = \i;}; 
            \node[gray, below] at (\i,-12) {\value};
        }
        
        % GRID - Y
        \foreach \i in {0,24,...,168}{
            \draw[gray, thin] (-12,\i) -- (132,\i);
            \tikzmath{int \value; \value = \i;};
            \node[gray, left] at (-12,\i) {\value};
        }
    
        % Draw some lines with relative coordinates
        \draw[thick] (0,0) -- ++(12,0) coordinate (c);
        \draw[thick] (0,0) -- ++(0,60) coordinate (c);
        \draw[thick] (c) -- ++(0,36) coordinate (c);
        \draw[thick] (c) -- ++(0,76) coordinate (c);
        \draw[thick] (c) -- ++(120,0) coordinate (c);
        
        % Display coordinate
        \getscale{\scalefactor};
        \node[fill=white, text=blue] at (60,60) {Scale = \scalefactor};
        \node[fill=white, text=magenta, yshift=-15pt] at (c) {(\xcoord{c}, \ycoord{c})};            
    \end{tikzpicture}
\end{figure}
\end{document}

Вышеприведенный код компилируется, однако координата в пурпурном цвете не совпадает с точкой окончания черной линии, которая находится в точке (120, 172).

введите описание изображения здесь

решение1

Это проблема ручной маркировки делений: вы «вычисляете» x-метки, \tikzmath{int \value; \value = \i;};но при этом ничего не известно о масштабировании, поскольку это просто числа, а не «координаты tikz».

Решение — выполнить масштабирование вручную, например,

\tikzmath{int \value; \value = \i * \scalefactor;}; 

Возможно, вам придется учесть, что использование \valueцелого числа приводит к некоторым ошибкам округления, но это уже другая проблема.

решение2

Способ получения исходной, не преобразованной координаты можно найти здесь.Доступ к логическим значениям координаты TikZ.

Использование пользовательской команды

\makeatletter
\def\extractcoord#1#2#3{
  \path let \p1=(#3) in \pgfextra{
    \pgfmathsetmacro#1{\x{1}/\pgf@xx}
    \pgfmathsetmacro#2{\y{1}/\pgf@yy}
    \xdef#1{#1} \xdef#2{#2}
  };
}
\makeatother

можно отобразить координату так

\coordinate (A) at (120,172);
\extractcoord{\x}{\y}{A};
\node at (A) {Coordinates: \x, \y};

Это было протестировано с масштабированием, изменением единиц измерения по осям x и y, а также с изменением области действия.

Связанный контент