重绘中几何图形使用 TikZ 时,似乎 tkz-euclide 中的内切圆计算有误(下图中的红色部分)。命令
\tkzDrawCircle[in,color=red](A2,B2,C2)
当我改变顺序时,会给出不同的圆圈,例如 (C2,B2,A2)。此外,在 (A2,B2,C2) 之前有一个空白
\tkzDrawCircle[in,color=red] (A2,B2,C2)
结果出现错误。
你能给出一些解释/建议/改进吗?
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{calc}
\usepackage{tkz-euclide}
\usetkzobj{all}
\def\a{3} % side of the equilateral triangle
\pgfmathsetmacro{\d}{\a/sqrt(3)}
\begin{document}
\begin{tikzpicture}[line join=round]
\pagecolor{yellow!20}
\path
(210:\d) coordinate (A0)
(330:\d) coordinate (B0)
(90:\d) coordinate (C0)
($(C0)!.3!(B0)$) coordinate (A1)
($(A0)!.3!(C0)$) coordinate (B1)
($(B0)!.3!(A0)$) coordinate (C1)
(intersection of A0--A1 and B0--B1) coordinate (A2)
(intersection of B0--B1 and C0--C1) coordinate (B2)
(intersection of C0--C1 and A0--A1) coordinate (C2);
\clip (A0)--(B0)--(C0)--cycle;
\draw[cyan]
(A0)--(A1) (B0)--(B1) (C0)--(C1)
(A0)--(B0)--(C0)--cycle;
\draw (A2)--(B2)--(C2)--cycle;
\tkzDrawCircle[in,color=blue](A0,B0,A2)
\tkzDrawCircle[in,color=blue](B0,C0,B2)
\tkzDrawCircle[in,color=blue](C0,A0,C2)
\tkzDrawCircle[in,color=red](A2,B2,C2)
%\tkzDrawCircle[in,color=red](C2,B2,A2)
%\tkzDrawCircle[in,color=red](B2,A2,C2)
\end{tikzpicture}
\end{document}
答案1
在我看来,这几乎是先前的问题,答案还是我认为 tkz-euclide 中存在数值不稳定性。然而,令我尴尬的是,我不得不承认,这也是我在那里提出的解决方案之一。在我的解决方案中(我也认为 tkz-euclide 也是如此,但我的法语水平不足以肯定地说这一点),问题是必须找到正确的象限,我以为我做到了,但显然没有。所以我换了个方向,使用了根据笛卡尔坐标确定中心,似乎没有什么问题。
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{calc}
\tikzset{incircle/.style n args={3}{%
insert path={
let \p1=($(#2)-(#1)$), \p2=($(#3)-(#1)$),\p3=($(#2)-(#3)$),
\n1={0.5*(veclen(\x1,\y1)+veclen(\x2,\y2)+veclen(\x3,\y3))},
\n2={sqrt(((\n1-veclen(\x1,\y1))/\n1))*sqrt((\n1-veclen(\x2,\y2))*(\n1-veclen(\x3,\y3)))},
\n3={veclen(\x1,\y1)}, % length #1 -- #2
\n4={veclen(\x2,\y2)}, % length #1 -- #3
\n5={veclen(\x3,\y3)}, % length #2 -- #3
\n6={\n3+\n4+\n5}
in % \pgfextra{\typeout{\n1,\n2,\n3,\n4,\n5,\n6}}
(${(\n5/\n6)}*(#1)+{(\n4/\n6)}*(#2)+{(\n3/\n6)}*(#3)$) circle (\n2)
}}}
% \usepackage{tkz-euclide}
% \usetkzobj{all}
\begin{document}
\begin{tikzpicture}[line join=round]
\pgfmathsetmacro{\a}{3} % side of the equilateral triangle
\pgfmathsetmacro{\d}{\a/sqrt(3)}
\pagecolor{yellow!20}
\path
(210:\d) coordinate (A0)
(330:\d) coordinate (B0)
(90:\d) coordinate (C0)
($(C0)!.3!(B0)$) coordinate (A1)
($(A0)!.3!(C0)$) coordinate (B1)
($(B0)!.3!(A0)$) coordinate (C1)
(intersection cs:first line={(A0)--(A1)},second line={(B0)--(B1)}) coordinate (A2)
(intersection cs:first line={(B0)--(B1)},second line={(C0)--(C1)}) coordinate (B2)
(intersection cs:first line={(C0)--(C1)},second line={(A0)--(A1)}) coordinate (C2);
\begin{scope}
\clip (A0)--(B0)--(C0)--cycle;
\draw[cyan]
(A0)--(A1) (B0)--(B1) (C0)--(C1)
(A0)--(B0)--(C0)--cycle;
\draw (A2)--(B2)--(C2)--cycle;
\end{scope}
\draw[blue,incircle={A0}{B0}{A2}];
\draw[blue,incircle={B0}{C0}{B2}];
\draw[blue,incircle={C0}{A0}{C2}];
% \tkzDrawCircle[in,color=blue](A0,B0,A2)
% \tkzDrawCircle[in,color=blue](B0,C0,B2)
% \tkzDrawCircle[in,color=blue](C0,A0,C2)
\draw[red,incircle={A2}{B2}{C2}];
%\tkzDrawCircle[in,color=red](A2,B2,C2)
%\tkzDrawCircle[in,color=red](C2,B2,A2)
%\tkzDrawCircle[in,color=red](B2,A2,C2)
\end{tikzpicture}
\end{document}
答案2
tkz-eucide 的最新版本 1.16 中存在错误,使用下一个版本(实际上是测试版)即可获得结果。您需要在 texmf 树中安装 tkz-base 和 tkz-euclide。
\documentclass{article}
\usepackage{tkz-euclide}
\def\a{3} % side of the equilateral triangle
\pgfmathsetmacro{\d}{\a/sqrt(3)}
\begin{document}
\begin{tikzpicture}[scale=3]
\tkzDefPoint(210:\d){A0}
\tkzDefPoint(330:\d){B0}
\tkzDefPoint(90:\d){C0}
\tkzDefBarycentricPoint(C0=2,B0=1) \tkzGetPoint{A1}
\tkzDefBarycentricPoint(A0=2,C0=1) \tkzGetPoint{B1}
\tkzDefBarycentricPoint(B0=2,A0=1) \tkzGetPoint{C1}
\tkzInterLL(A0,A1)(B0,B1) \tkzGetPoint{A2}
\tkzInterLL(B0,B1)(C0,C1) \tkzGetPoint{B2}
\tkzInterLL(C0,C1)(A0,A1) \tkzGetPoint{C2}
%\clip (A0)--(B0)--(C0)--cycle;
\tkzDrawSegments(A0,A1 B0,B1 C0,C1)
\tkzDrawPolygon(A0,B0,C0)
\tkzDrawPolygon(A2,B2,C2)
\tkzDrawCircle[in,color=blue](A0,B0,A2)
\tkzDrawCircle[in,color=blue](B0,C0,B2)
\tkzDrawCircle[in,color=blue](C0,A0,C2)
\tkzDrawCircle[in,color=red](A2,B2,C2)
\tkzDrawCircle[in,color=red](C2,B2,A2)
\tkzDrawCircle[in,color=red](B2,A2,C2)
\end{tikzpicture}
\end{document}