我得到了环境中的点 A、B 和 X tikzpicture
,如下所示:
\begin{tikzpicture}
\coordinate (A) at (0,0);
\coordinate (B) at (3.6,0);
\coordinate (X) at (2,0);
\end{tikzpicture}
现在我想构建坐标 C,如下图所示:
使用圆和直尺,我将在 X 方向上在 AB 上画一条垂线,并将其与以 AB 为直径的圆相交。我确信在 TikZ 中有一种简洁的方法可以做到这一点(无需手动进行任何坐标计算)。然而,浏览(大量)文档后,我找不到直接的答案。
为了可移植性,我希望有一个纯 TikZ 解决方案(不带tkz-euclide
包)。
编辑
为了澄清:我试图用“干净的方式”来表达我想告诉 TikZ“我的意思”。例如:引入线段 [AB] 的中点 O 是可以的,同时说 C 和 O 的距离应该与 A 和 O 的距离相同。但直接计算坐标,例如基于几何平均定理或三角函数应避免。
快速检查:如果您的代码中有一些函数,如sqrt
或atan
等,那么它可能不是我要找的。此外,如果我改变 A、B 和 X 的起始坐标,您的代码应该仍然有效(尽管它们应该仍然在一条公共线上,但这条线可能不再是水平的。)
答案1
这里有一个解决方案intersections
。图像的边框用 固定clip
。我仍在寻找没有辅助线的解决方案,找到后会通知您。
目前您必须使用clip
并手动进行调整。
\documentclass[tikz, border=0mm]{standalone}
\usetikzlibrary{calc, intersections, through}
\begin{document}
\begin{tikzpicture}
\coordinate (a) at (0,0);
\coordinate (b) at (3.6,0);
\coordinate (x) at (2,0);
\begin{scope}
\clip (0,-.01) rectangle (3.6,1.8);
\path [name path=px] (x) -- ++(90:2cm);
\node at ($(a)!.5!(b)$) [name path=pc, circle through={(a)}] {};
\draw [name intersections={of=px and pc}] (a) -- (intersection-1) -- (b) -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}
更新:
这里是另一段使用该let
命令结合的代码intersections
:
\documentclass[tikz, border=6mm]{standalone}
\usetikzlibrary{calc, intersections}
\begin{document}
\begin{tikzpicture}
\coordinate [label={180:$A$}] (a) at (0,0);
\coordinate [label={0:$B$}] (b) at (3.6,0);
\coordinate [label={-90:$X$}] (x) at (2,0);
\draw [dashed] let \p1 = ($(b)-(a)$) in [name path=pa] (a) arc (180:0:\x1/2);
\draw [dashed] let \p1 = ($(b)-(a)$) in [name path=px] (x) |- ($(x)+(90:\x1/2)$);
\draw [name intersections={of=pa and px}] (a) -- (intersection-1) node [label={90:$C$}] {} -- (b) -- cycle;
\end{tikzpicture}
\end{document}
更新:
根据要求提供更多信息:
let
命令
使用let
命令,您可以使用点寄存器(\p[n]
) 或者数字寄存器(\n[n]
)用于绘制路径。我使用\p1
现有点的路径计算来计算点(),并在命令的绘图部分(之后)重用x
和y
坐标(\x1
, ) 。\y1
in
该let
命令还在14.15
(第 161 页)中进行了描述pgfmanual 3.0。
协调
(c)
调整最后一个\draw
命令,使其coordinate
在交叉点处添加一个(intersection-1)
名为(c)
。这样,您就可以获得坐标,并可以在代码中通过调用它来访问它。
\draw [name intersections={of=pa and px}] (a) -- (intersection-1) coordinate (c) node [label={90:$C$}] {} -- (b) -- cycle;
答案2
calc
另一种疯狂的选择
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate[label=180:$A$] (A) at (0,0);
\coordinate[label=0:$B$] (B) at (3.6,0);
\coordinate[label=270:$X$] (X) at (0.5,0);
\coordinate (O) at ($(A)!0.5!(B)$);
\draw (A) let \p1=($(B)-(A)$),\p2=($(O)-(X)$),\n1={acos(2*\x2/\x1)} in
arc (180:0:0.5*\x1) ($(O)!1!-\n1:(A)$)
coordinate[label=90:$C$] (C) --(X);
\draw (A) -- (B) -- (C) -- cycle;
\end{tikzpicture}
\end{document}
答案3
虽然 OP 需要一个不使用的解决方案tkz-euclide
,我认为这可能对其他人有用:
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}
% Initial points A,B, X, O
\tkzDefPoint(0,0){A}
\tkzDefPoint(2,0){X}
\tkzDefPoint(8,0){B}
\tkzDefPoint(4,0){O}
% The arc
\tkzDrawArc[dashed,color=gray!60,thin](O,B)(A)
% Finding C
\tkzDefLine[orthogonal=through X](A,X){O}
\tkzInterLC[R](X,tkzPointResult)(O,4cm)
\tkzGetSecondPoint{C}
% Drawing lines
\tkzDrawSegments(X,C A,B A,C C,B)
% Adding labels
\tkzDrawPoints(A,B,X,O,C)
\tkzLabelPoints(A,B,X,O)
\tkzLabelPoints[above](C)
\end{tikzpicture}
\end{document}
答案4
编辑:警告已删除。如果两者欧几里得和埃格雷格说这是真的,这一定是真的。
这是一个不需要额外库的解决方案。
我的解决方案利用了这样一个事实:AB 是圆的直径,而 C 是圆周上的一个点。这意味着角 CAB 等于角 BCX,因为 ACB 是直角。所以 tan CAB 等于 CX/AX,而 tan BCX 等于 (AB-AX)/CX。因此 CX/AX = (AB-AX)/CX。由于 AB 和 AX 已知,我们可以解出 CX = AX(AB-AX) 的根。
\documentclass[tikz,border=5pt]{standalone}
\begin{document}
\begin{tikzpicture}
[circle radius/.store in=\myradius, circle radius=1.8, my length/.store in=\myl, my length=2]
\coordinate (A) at (0,0);
\coordinate (B) at (2*\myradius,0);
\coordinate (X) at (\myl,0);
\coordinate (C) at (\myl,{sqrt(\myl*(2*\myradius - \myl))});
\draw [densely dashed, gray] (A) arc (180:0:\myradius);
\draw (A) node [left] {$A$} -- (B) node [right] {$B$} -- (C) node [above] {$C$} edge node [below, pos=1] {$X$} (X) -- cycle;
\end{tikzpicture}
\end{document}