나는 표시된 각도와 그 안에 쓰여진 각도 값을 사용하여 여러 가지 다른 삼각형 ABC를 그리고 싶습니다. 다른 질문에 대한 답변 덕분에 다음 코드를 얻을 수 있었습니다.
\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}
문제는 C 지점이 A 지점보다 높은 버전 2에서 잘못된 각도를 취한다는 것입니다.
어떤 제안이 있으십니까?
답변1
\tkzFindAngle
에서 가 어떻게 정의되어 있는지 살펴보면 tkz-obj-angles.tex
각도를 계산하는 데 매우 간단한 방법을 사용한다는 것을 알 수 있습니다.
\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
}
마찬가지로 \tkz@LabelAngle
라벨을 어디에 둘 것인지 매우 간단하게 계산합니다.
\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
}
반면 에 각도를 표시하기 위해 \tkzMarkAngle
각도에 대해 훨씬 더 복잡한 계산을 사용합니다 .\tkzDrawArcRAN
\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
}
\tkzMarkAngle
아마도 당신이 추구하는 것과 동일한 각도 정규화를 사용하는 것입니다 .
\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