从点垂直线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.65
、9.8
、10
和10.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}