三角形重心坐标加起来为一时出现错误

三角形重心坐标加起来为一时出现错误

我正在尝试使用面积坐标(重心坐标加起来为 1)绘制三角形上的点。但是,使用 TikZ 和重心坐标系,在某些情况下会给出错误的点,如下例所示:

\documentclass{minimal}
\usepackage[margin=2mm,papersize={55mm,50mm}]{geometry}
\usepackage{tikz}

\begin{document}                          
\noindent
\begin{tikzpicture}

\coordinate (L1) at (0:0);
\coordinate (L2) at (0:5);
\coordinate (L3) at (60:5);

\draw[thick] (L1) -- coordinate[midway](md3) (L2)
                  -- coordinate[midway](md1) (L3)
                  -- coordinate[midway](md2) (L1) -- cycle; 

\draw[very thin,dotted] (L1) -- (md1) (L2) -- (md2) (L3) -- (md3);

\fill[color=blue]  (barycentric cs:L1=8,L2=1,L3=1) circle (0.04);
\draw[color=red]   (barycentric cs:L1=0.8,L2=0.1,L3=0.1) circle (0.04);
\draw[color=green] (barycentric cs:L1=0.08,L2=0.01,L3=0.01) circle (0.04);

\fill[color=blue]  (barycentric cs:L1=1,L2=8,L3=1) circle (0.04);
\draw[color=red]   (barycentric cs:L1=0.1,L2=0.8,L3=0.1) circle (0.04);
\draw[color=green] (barycentric cs:L1=0.01,L2=0.08,L3=0.01) circle (0.04);

\fill[color=blue]  (barycentric cs:L1=1,L2=1,L3=8) circle (0.04);
\draw[color=red]   (barycentric cs:L1=0.1,L2=0.1,L3=0.8) circle (0.04);
\draw[color=green] (barycentric cs:L1=0.01,L2=0.01,L3=0.08) circle (0.04);

\end{tikzpicture}
\end{document}

结果是

使用重心坐标的点三角形

所有点都有两个相等的坐标,因此它们应该位于中位数上。当坐标加起来为 0.1 或 10 时,这些点绘制正确,但当它们加起来为 1 时,这些点显然是错误的(即使您排列坐标,错误的数量也不会相同)。这种情况只发生在某些点上,例如点 (0.6,0.2,0.2) 绘制正确。

有人能解释为什么会出现这种不准确吗?我试图了解\tikzdeclarecoordinatesystem{barycentric}tikz.code.tex 中发生了什么,其中的划分可能是罪魁祸首,但我并不清楚。

答案1

问题实际上在于坐标系所使用的 PGF 数学divide( ) 函数。/barycentric

在坐标系的过程中barycentric,会计算值的总和并将其存储在中\pgf@xb。这个总和10.0在蓝色案例中、1.00002红色案例中和0.09999绿色案例中都有。

然后使用以下公式评估该值

\pgfmathparse{1/\the\pgf@xb}

它只是计算1 / <sum>以供以后使用。使用错误版本,结果是

    x        1/x
10.0        0.0999
 1.00002    0.91
 0.09999   10.00099

显然这0.91不(几乎)正确。

PGF/TikZ 的 CVS 版本已修复此问题,计算结果为1.00002

有很多方法可以解决这个问题,比如直接使用 TeX 计算PGF mathreciprocal包含一个可以在这里使用的函数。如果您还不想更新到 CVS 版本(//的修复程序divide相当大),您可以使用这个简单的修复程序:

\makeatletter
\tikzdeclarecoordinatesystem{barycentric}{{%
  \pgf@xa=0pt% point
  \pgf@ya=0pt%
  \pgf@xb=0pt% sum
  \tikz@bary@dolist#1,=,%
  \pgfmathreciprocal@{\pgf@sys@tonumber\pgf@xb}%
  \global\pgf@x=\pgfmathresult\pgf@xa%
  \global\pgf@y=\pgfmathresult\pgf@ya}}
\makeatother

相关内容