我正在尝试使用面积坐标(重心坐标加起来为 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