Verwendung von pgfmathanglebetweenlines, Anfängerfrage

Verwendung von pgfmathanglebetweenlines, Anfängerfrage

Ich habe gerade angefangen, Tikz zu verwenden, und möchte es verwenden \pgfmathanglebetweenlines, aber ich verstehe es offensichtlich nicht. Ich habe erwartet, dass der folgende Code den Winkel in den \tryParametern meldet, aber er kommt jedes Mal als 0 o heraus (oder manchmal jedes Mal 45 o oder jedes Mal 90 o ). Was habe ich falsch gemacht?

%
% preamble
%
\documentclass[10pt]{article}
\usepackage{amssymb,amsmath}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}
%
% drawing.
%
\begin{document}
\def\try#1{
\begin{tikzpicture}[scale=4]
\coordinate[label=below:$O$](O)at(0,0);
\coordinate[label=$X$](X)at(1,0);
\coordinate[label=$Y$](Y)at({cos(#1)},{sin(#1)});
\draw(Y)--(O)--(X);
\pgfmathanglebetweenlines{(O)}{(Y)}{(O)}{(X)}                                                                
\coordinate[label=right:{$\angle YOX=\pgfmathresult^\circ$}](label)at(X);             
\end{tikzpicture}
\\} 
\try{20}\try{45}\try{60}\try{180}\try{405}\try{-45}
\end{document}   

Antwort1

Hier gibt es ein paar Probleme. Erstens \pgfmathanglebetweenlineserfordert es grundlegende Layer-Koordinatenspezifikationen (z. B. in diesem Fall \pgfpointanchor{Y}{center}). Zweitens \pgfmathresultwird es jedes Mal neu definiert, wenn die mathematische Engine verwendet wird, sodass die Winkelmessung beim Setzen verloren geht.

Unten sehen Sie eine Lösung. Beachten Sie, dass ich auch eine Korrektur für spitze Winkel hinzugefügt habe (ich glaube, die Dokumentation dazu \pgfmathanglebetweenlinesist nicht ganz richtig) und um den Winkel auf die nächste Ganzzahl zu runden.

\documentclass[varwidth,border=5]{standalone}
\usepackage{tikz}
\def\try#1{%
\begin{tikzpicture}[scale=4]
\coordinate[label=below:$O$] (O) at (0,0);
\coordinate[label=$X$]       (X) at (1,0);
\coordinate[label=$Y$]       (Y) at (cos #1, sin #1);
\draw (Y) -- (O) -- (X);
\pgfmathanglebetweenlines%
  {\pgfpointanchor{O}{center}}{\pgfpointanchor{Y}{center}}
  {\pgfpointanchor{O}{center}}{\pgfpointanchor{X}{center}}
\pgfmathparse{int(round(min(\pgfmathresult, 360-\pgfmathresult))}% Correction
\let\angleyox=\pgfmathresult                                                              
\coordinate [label=right:{$\angle YOX=\angleyox^\circ$}] (label) at (X);             
\end{tikzpicture}
\\}
\begin{document}
\foreach \a in {20, 45, 60, 180, 405,-45}{\try{\a}}
\end{document}  

Aber! Die grundlegenden Layer-Sachen sind nicht notwendig. Die calcBibliothek bietet alles, was Sie brauchen:

\documentclass[varwidth,border=5]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\try#1{%
\begin{tikzpicture}[scale=4]
\coordinate[label=below:$O$] (O) at (0,0);
\coordinate[label=$X$]       (X) at (1,0);
\coordinate[label=$Y$]       (Y) at (cos #1, sin #1);
\draw (Y) -- (O) -- (X);
\path let \p1=(O),\p2=(Y),\p3=(X),
   \n1={atan2(\y2-\y1,\x2-\x1)},
   \n2={atan2(\y3-\y1,\x3-\x1)} in
   node at (X) [right] {\pgfmathparse{int(abs(\n2-\n1))}% Correction
     $\angle YOX=\pgfmathresult^\circ$};
\end{tikzpicture}
\\}
\begin{document}
\foreach \a in {20, 45, 60, 180, 405,-45}{\try{\a}}
\end{document} 

Bildbeschreibung hier eingeben

verwandte Informationen