Ich möchte den Wert einer Koordinate anzeigen. Bei Verwendung des Folgenden wird der Wert jedoch nicht genau ausgedruckt.
Der Maßstab wird mit folgendem Verfahren ermittelt:Skalierungsfaktor in TikZ wiederherstellenund verwenden Sie dann den Skalierungsfaktorwert wie inExtrahieren Sie die x- und y-Koordinate eines beliebigen Punkts in TikZ. Allerdings gibt @scalefactor in \xcoord und \ycoord immer 1 zurück, obwohl der tatsächliche Faktor angezeigt wird, wenn er im Tikz-Bild verwendet wird.
Irgendwelche Ideen zur Reparatur?
%!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}
Das Obige lässt sich kompilieren, allerdings stimmt die Koordinate in Magenta nicht mit dem Ende der schwarzen Linie überein, nämlich (120, 172).
Antwort1
Dies ist ein Problem bei der manuellen Beschriftung der Tics: Sie „berechnen“ die X-Beschriftungen, \tikzmath{int \value; \value = \i;};
wissen dabei aber nichts über die Skalierung, da es sich dabei nur um Zahlen und nicht um „Tikz-Koordinaten“ handelt.
Die Lösung besteht darin, die Skalierung manuell vorzunehmen, z. B. durch
\tikzmath{int \value; \value = \i * \scalefactor;};
Möglicherweise müssen Sie berücksichtigen, dass die Verwendung \value
als Ganzzahl zu Rundungsfehlern führt, aber das ist ein anderes Problem.
Antwort2
Wie man die ursprünglichen, nicht transformierten Koordinaten erhält, erfahren Sie hier.Zugriff auf die logischen Werte einer TikZ-Koordinate.
Verwenden des benutzerdefinierten Befehls
\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
Man kann eine Koordinate wie folgt anzeigen
\coordinate (A) at (120,172);
\extractcoord{\x}{\y}{A};
\node at (A) {Coordinates: \x, \y};
Dies wurde mit Skalierung, Einheitenänderungen sowohl in x als auch in y und Bereichsumgebungen getestet.