从同一点到同一直线的垂直线不同

从同一点到同一直线的垂直线不同

从点垂直线b使用$(a)!(b)!(c)$不同于$(c)!(b)!(a)$

\documentclass[tikz,border=12pt]{standalone}

\usetikzlibrary{calc}

\begin{document}
    \begin{tikzpicture}
        \coordinate [label=above : $A$](a) at (0,10);
        \coordinate [label=above : $B$](b) at (12,9);
        \coordinate [label=below : $C$](c) at (10,4);
        \draw (a)--(b)--(c)--cycle;
        \draw [blue] (b) -- ($(c)!(b)!(a)$) coordinate[label=left:$E$] (e);
        \draw [red] (b) -- ($(a)!(b)!(c)$) coordinate[label=right:$F$] (f);
    \end{tikzpicture}
\end{document}

在此处输入图片描述

这些线条不应该完全相同吗?

答案1

这些不准确之处是阿兰·马特斯创建了该tkz-euclide软件包,它不存在同样的问题。如果你经常处理这类几何图形,那么了解该软件包绝对值得。

\documentclass[border=12pt]{standalone}

\usepackage{tkz-euclide}
\usetkzobj{all}

\begin{document}    
    \begin{tikzpicture}
        % Define points
        \tkzDefPoint(0,10){A}
        \tkzDefPoint(12,9){B}
        \tkzDefPoint(10,4){C}

        % Calculate projection, don't update bounding box
        \begin{pgfinterruptboundingbox}
            \tkzDefPointBy[projection=onto A--C](B) \tkzGetPoint{E}
            \tkzDefPointBy[projection=onto C--A](B) \tkzGetPoint{F}   
        \end{pgfinterruptboundingbox}

        % Draw objects
        \tkzDrawPolygon(A,B,C)
        \tkzDrawSegment[blue](B,E)
        \tkzDrawSegment[red](B,F)
        \tkzDrawPoints(A,B,C, E, F)

        % Labels
        \tkzLabelPoint[anchor=30](E){E}
        \tkzLabelPoint[below](F){F}
        \tkzLabelPoint[left](A){A}
        \tkzLabelPoint[above right](B){B}
        \tkzLabelPoint[below right](C){C}

    \end{tikzpicture}
\end{document}

答案2

如果某个角落没有其他错误,那就是典型的 TeX 精度问题。calc 语法实际上会旋转事物并以不太相关的方式相应地获取角度。

但是由于三角函数与查找表一起工作,因此中间行为可能会导致不准确。例如,对于坐标,C尝试 x 坐标值9.659.81010.15,您将看到模式。

答案3

如果您在 Metapost 中绘制相同的图形(以与在 TikZ 中相同的方式从两个不同方向定义投影),您也会发现这些点并不相同。但是误差要小得多 - 通常小于 0.01 毫米,通常小到无法注意到。

在此处输入图片描述

prologues := 3;
outputtemplate := "%j%c.eps";

beginfig(1);
u := 1cm;
pair A, B, C, E, F;
A = (0,10u);
B = (12u,9u);
C = (10u,4u);

% define F back-to-front...
E = whatever[A,C]; B-E = whatever * (A-C) rotated 90;
F = whatever[C,A]; B-F = whatever * (A-C) rotated 90;

show E, F, abs(E-F);

draw A--B--C--cycle;
draw B--E withcolor blue;
draw B--F withcolor red;

label.top("A", A);
label.top("B", B);
label.bot("C", C);
label.llft("E", E) withcolor red;
label.lrt ("F", F) withcolor blue;
endfig;
end.

使用默认数字系统,该show命令生成以下内容:

>> (262.62154,125.88998)
>> (262.6223,125.89125)
>> 0.00148

因此 E 不等于 F,但非常接近。单位是点 72 = 1 英寸,因此距离为 0.00148 点,约为 0.5 µm,这很难看出。

如果你使用,-numbersystem=double你将获得:

>> (262.62152205882353,125.89158676470589)
>> (262.62152205882353,125.89158676470583)
>> 5.6843418860808015e-14 

这更接近,但仍然不完全相同。但-numbersystem=decimal你可以得到:

>> (262.6215220588235294117647058823529,125.8915867647058823529411764705883)
>> (262.6215220588235294117647058823529,125.8915867647058823529411764705883)
>> 0 

在这三种情况下,输出对我来说看起来完全相同。

答案4

运行xelatex

\documentclass[border=12pt,pstricks]{standalone}
\usepackage{pst-eucl}
\begin{document}    
\begin{pspicture}(-1,3)(13,11)
  \pstTriangle[linewidth=1.5pt](0,10){A}(12,9){B}(10,4){C}
  \pstProjection{C}{A}{B}[F]
  \psline(B)(F)
  \pstRightAngle[linecolor=red,RightAngleType=german]{C}{F}{B}
\end{pspicture}
\end{document}

在此处输入图片描述

相关内容