Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I want to draw several different triangles ABC with the angles marked and the angle value written in it. Thanks to answers on on another question, I've managed to get this code:

\documentclass{article}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usetkzobj{all} %% om allerhande objecten te gebruiken zoals gradenboog...
\usetikzlibrary{calc,intersections,through,backgrounds,snakes}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepgfplotslibrary{statistics}


\begin{document}

\makeatletter
\newcommand\ddToddmmss[1]{%
\pgfmathtruncatemacro\deg@tmp{#1}%
\pgfmathsetmacro\min@tmp{(#1-\deg@tmp)*60}%
\pgfmathtruncatemacro\Min@tmp{\min@tmp}
\pgfmathtruncatemacro\sec@tmp{(\min@tmp-floor(\min@tmp))*60}%
\ensuremath{\deg@tmp^\circ \Min@tmp ' \sec@tmp ''}}
\makeatother


\begin{tikzpicture}
\tkzInit[ymin=0,ymax=9,xmin=0,xmax=15]
\tkzClip
\tkzGrid
\tkzDefPoints{1/3/A, 7/8/B, 12/1/C}
\tkzDrawPolygon(A,B,C) \tkzDrawPoints(A,B,C) \tkzLabelPoints(A,B,C)

\tkzMarkAngle[fill= red,size=1.5cm, opacity=.4](C,A,B);
\tkzFindAngle(C,A,B) \tkzGetAngle{angleCAB};
%\FPround\angleBAC\angleCAB{2}
\tkzLabelAngle[pos = 2.3](C,A,B){\ddToddmmss{\angleCAB}};  

\tkzMarkAngle[fill= red,size=1.5cm, opacity=.4](A,B,C);
\tkzFindAngle(A,B,C) \tkzGetAngle{angleABC};
%\FPround\angleABC\angleABC{2}
\tkzLabelAngle[pos = 2.3](A,B,C){\ddToddmmss{\angleABC}};

\tkzMarkAngle[fill= red,size=1.5cm, opacity=.4](B,C,A);
\tkzFindAngle(B,C,A) \tkzGetAngle{angleBCA};
%\FPround\angleBCA\angleBCA{2}
\tkzLabelAngle[pos = 2.3](B,C,A){\ddToddmmss{\angleBCA}};
\end{tikzpicture}


\begin{tikzpicture}
\tkzInit[ymin=0,ymax=9,xmin=0,xmax=15]
\tkzClip
\tkzGrid
\tkzDefPoints{1/3/A, 7/8/B, 12/5/C}
\tkzDrawPolygon(A,B,C) \tkzDrawPoints(A,B,C) \tkzLabelPoints(A,B,C)

\tkzMarkAngle[fill= red,size=1.5cm, opacity=.4](C,A,B);
\tkzFindAngle(C,A,B) \tkzGetAngle{angleCAB};
%\FPround\angleBAC\angleCAB{2}
\tkzLabelAngle[pos = 2.3](C,A,B){\ddToddmmss{\angleCAB}};  

\tkzMarkAngle[fill= red,size=1.5cm, opacity=.4](A,B,C);
\tkzFindAngle(A,B,C) \tkzGetAngle{angleABC};
%\FPround\angleABC\angleABC{2}
\tkzLabelAngle[pos = 2.3](A,B,C){\ddToddmmss{\angleABC}};

\tkzMarkAngle[fill= red,size=1.5cm, opacity=.4](B,C,A);
\tkzFindAngle(B,C,A) \tkzGetAngle{angleBCA};
%\FPround\angleBCA\angleBCA{2}
\tkzLabelAngle[pos = 2.3](B,C,A){\ddToddmmss{\angleBCA}};
\end{tikzpicture}

\end{document}

triangles 1 and 2

Problem is, in version 2, where point C is higher than point A, he takes the wrong angle.

Any suggestions?

share|improve this question

1 Answer 1

up vote 2 down vote accepted

If you look at how \tkzFindAngle is defined in tkz-obj-angles.tex, you will see that it uses quite simple way to calculate the angle.

\def\tkzFindAngle(#1,#2,#3){%
\begingroup
      \tkzFindSlopeAngle(#2,#1)\tkzGetAngle{tkz@FirstAngle}
      \tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@SecondAngle}
      \FPadd\tkz@Angle{\tkz@SecondAngle}{-\tkz@FirstAngle}
     \global\let\tkzAngleResult\tkz@Angle
\endgroup
}

Similarly \tkz@LabelAngle calculates quite simply where to put the label.

\def\tkz@LabelAngle[#1](#2,#3,#4)#5{%
\begingroup
\pgfkeys{tkzlabelangle/.cd,
         dist  = 1}
\pgfqkeys{/tkzlabelangle}{#1}
\tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}
\tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}
\FPeval\labelAngle{( \tkz@dirOne +\tkz@dirTwo)/2}
\path (#3) --+(\labelAngle:\labeldist) node[/tkzmkangle/.cd,#1] {#5};
\endgroup
}

Whereas \tkzMarkAngle uses a lot more complex calculation for the angle in \tkzDrawArcRAN to mark the angle.

\def\tkzDrawArcRAN[#1](#2,#3)(#4,#5){%
 \begingroup
 \pgfmathparse{#4}\edef\tkz@FirstAngle{\pgfmathresult}%
 \pgfmathparse{#5}\edef\tkz@SecondAngle{\pgfmathresult}%
  \pgfmathgreaterthan{\tkz@FirstAngle}{0}
  \ifdim\pgfmathresult pt=1 pt\relax%
    \pgfmathgreaterthan{\tkz@FirstAngle}{\tkz@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
     \pgfmathsubtract{\tkz@FirstAngle}{360}
     \edef\tkz@FirstAngle{\pgfmathresult}%
 \fi
 \else
     \pgfmathgreaterthan{\tkz@FirstAngle}{\tkz@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
     \pgfmathadd{\tkz@SecondAngle}{360}
     \edef\tkz@SecondAngle{\pgfmathresult}%
 \fi
 \fi
     \draw[shift = {(#2)},/drawarc/.cd,#1]%
       (\tkz@FirstAngle:#3) arc (\tkz@FirstAngle:\tkz@SecondAngle:#3);
\endgroup
}

Using the same angle normalization as \tkzMarkAngle is probably what you are after.

\makeatletter
\def\tkzFindAngle(#1,#2,#3){%
\begingroup
  \tkzFindSlopeAngle(#2,#1)\tkzGetAngle{tkz@FirstAngle}
  \tkzFindSlopeAngle(#2,#3)\tkzGetAngle{tkz@SecondAngle}
  \my@NormalizeAngle(\tkz@FirstAngle,\tkz@SecondAngle)
  \FPadd\tkz@Angle{\my@SecondAngle}{-\my@FirstAngle}
  \global\let\tkzAngleResult\tkz@Angle
\endgroup
}

\def\tkz@LabelAngle[#1](#2,#3,#4)#5{%
\begingroup
  \pgfkeys{tkzlabelangle/.cd,dist=1}
  \pgfqkeys{/tkzlabelangle}{#1}
  \tkzFindSlopeAngle(#3,#2)\tkzGetAngle{tkz@dirOne}
  \tkzFindSlopeAngle(#3,#4)\tkzGetAngle{tkz@dirTwo}
  \my@NormalizeAngle(\tkz@dirOne,\tkz@dirTwo)
  \FPeval\labelAngle{(\my@FirstAngle +\my@SecondAngle)/2}
  \path (#3) --+(\labelAngle:\labeldist) node[/tkzmkangle/.cd,#1] {#5};
\endgroup
}

\def\my@NormalizeAngle(#1,#2){%
\begingroup
  \pgfmathparse{#1}\xdef\my@FirstAngle{\pgfmathresult}%
  \pgfmathparse{#2}\xdef\my@SecondAngle{\pgfmathresult}%
  \pgfmathgreaterthan{\my@FirstAngle}{0}
  \ifdim\pgfmathresult pt=1 pt\relax%
    \pgfmathgreaterthan{\my@FirstAngle}{\my@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
      \pgfmathsubtract{\my@FirstAngle}{360}
      \xdef\my@FirstAngle{\pgfmathresult}%
    \fi
  \else
    \pgfmathgreaterthan{\my@FirstAngle}{\my@SecondAngle}
    \ifdim\pgfmathresult pt=1 pt\relax%
      \pgfmathadd{\my@SecondAngle}{360}
      \xdef\my@SecondAngle{\pgfmathresult}%
    \fi
  \fi
\endgroup
}
\makeatother

enter image description here

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.