这是角度绘制不准确的插图。
我想知道是否有更简单的方法可以在圆内绘制精确的角度,比如说$\angle ABD = 15^\circ$
。
从一开始我就做了以下事情:
\begin{tikzpicture}[scale=2]
\coordinate (O) at (0,0);
\draw (O) circle (1);
\coordinate [label=above left:$A$] (A) at (105:1);
\coordinate [label=below left:$B$] (B) at (225:1);
\draw (A) -- (B);
\end{tikzpicture}
接下来的步骤是从线段 AB 画出 15 度和 30 度的角,以确定 C 和 D(在圆上)。
我想知道是否可以使用任何 Ti 轻松完成此操作钾Z 包?
答案1
对于圆规和量角器的构造,实际上只需使用through
库、calc
库和intersection cs
。turn
键可以帮助找到相对极坐标。
该through
库仅提供一个键,必须与node
:一起使用circle through
。
它创建一个圆形节点,其中心位于at
节点的部分,并经过分配给键的点。我使用的点(right:1)
是 的罗盘方向版本(0:1)
(即 的极地版本(1, 0)
)。
这样,我就可以创建一个尺寸随值缩放的圆,scale
而无需事先使用transform shape
或计算内容(这基本上由库处理through
)。对于不同的x scale
和y scale
或其他转换(例如设置x
和/或y
向量),无论如何都很可能会失败,您需要使用circle
/ellipse
路径运算符。但是,intersection cs
只能使用circle
节点和线(或两条线或两个圆形节点)。它确实是用于指南针和量角器的东西。
如果圆心(如我们的例子)不在原点,则需要使用circle through={([shift={(<center>)}]0:<radius>)}
。
节点命名ci
需要
- 使用 with
intersection cs
因为它需要一个(循环)节点的名称和 - 使用锚边框时可以使用任意角度。
如果您不使用循环节点,则(ci.<angle>)
可以用(<angle>:<radius>)
或来代替([shift={(<center>)}]<angle>:<radius>)
。
然后可以使用以下方法找到这些点:
\usetikzlibrary{through, calc} % preamble
\begin{tikzpicture}[scale=2]
\coordinate (O) at (0,0);
\node[draw] (ci) at (O) [circle through=(right:1)] {};
\coordinate [label=above left:$A$] (A) at (ci.105);
\coordinate [label=below left:$B$] (B) at (ci.225);
\path (A) -- (B) -- ([turn]-15:-1) coordinate (B')
(B) -- (A) -- ([turn]30:-1) coordinate (A');
\path (intersection cs: first node=ci, second line={(B)--(B')})
coordinate[label=above:$C$] (C)
(intersection cs: first node=ci, second line={(A)--(A')})
coordinate[label=below right:$D$] (D);
\draw (A) -- (B) -- (C) -- (D) -- cycle [line join=bevel];
\end{tikzpicture}
不幸的是,当涉及到圆圈时,这并不十分准确:
该intersections
库可以找到任意路径之间的交点,而不仅仅是圆和直线。然而,还需要做更多的工作,因为路径需要命名,而且使用的路径实际上需要相交。
\usetikzlibrary{through, intersections} % preamble
\begin{tikzpicture}[scale=2]
\coordinate (O) at (0,0);
\node[draw, name path=ci] (ci) at (O) [circle through=(right:1)] {};
% or \draw [name path=ci] (O) circle[radius=1];
\coordinate [label=above left:$A$] (A) at (ci.105);
\coordinate [label=below left:$B$] (B) at (ci.225);
\path[overlay] (A) -- (B) -- ([turn]-15:-3) coordinate (B');
\path[overlay] (B) -- (A) -- ([turn]30:-3) coordinate (A');
\path[overlay, name path=A] (A) -- (A');
\path[overlay, name path=B] (B) -- (B');
\path[name intersections=
{of=A and ci, by={@,[label=below right:$D$]D}}]; % @ is not used (equals A)
\path[name intersections={of=B and ci, by={[label=above:$C$]C}}];
\draw (A) -- (B) -- (C) -- (D) -- cycle [line join=bevel];
\end{tikzpicture}
更正确的解决方法是:
你也可以预先进行计算
并仅使用 TikZ 进行绘图:
\begin{tikzpicture}[scale=2]
\coordinate (O) at (0,0);
\node[draw] (ci) at (O) [circle through=(right:1)] {};
\coordinate [label=above left:$A$] (A) at (ci.105);
\coordinate [label=below left:$B$] (B) at (ci.225);
\coordinate [label= above:$C$] (C) at (ci.225-150);
\coordinate [label=below right:$D$] (D) at (ci.105-180);
\draw (A) -- (B) -- (C) -- (D) -- cycle [line join=bevel];
\end{tikzpicture}
答案2
利用圆的基本几何形状,我们也可以很好地画出元帖子。
prologues := 3;
outputtemplate := "%j%c.eps";
vardef angle_mark(expr a,b,c,s) =
fullcircle scaled s rotated angle (a-b) shifted b cutafter (b--c)
enddef;
beginfig(1);
pair A, B, C, D;
path circle;
circle = fullcircle scaled 144;
A = point 2.818 of circle; % a random point on the circle
D = A rotated -30;
B = A rotated (132); % this one can be an arbitrary amount
C = B rotated 60;
label(btex $A$ etex, A scaled 1.1);
label(btex $B$ etex, B scaled 1.1);
label(btex $C$ etex, C scaled 1.1);
label(btex $D$ etex, D scaled 1.1);
dotlabel.bot(btex $O$ etex, origin);
path a[];
a1 = angle_mark(B,A,C,40);
a2 = angle_mark(D,B,A,70);
a3 = angle_mark(B,D,C,40);
draw a1 withcolor .7 white;
draw a2 withcolor .7 white;
draw a3 withcolor .7 white;
label.lrt(btex $30^\circ$ etex scaled 0.6, point 0.3 of a1);
label.top(btex $15^\circ$ etex scaled 0.6, point 0.55 of a2);
label.lrt(btex $x^\circ$ etex scaled 0.6, point 0.25 of a3);
draw A -- B -- D -- C -- cycle;
draw circle withcolor .67 red;
endfig;
end.
该构造依赖于以下事实:如果角度 ∠AOD 为 30°,则 ∠ABD=∠ACD=15°,如果角度 ∠BOC 为 60°,则 ∠BAC=∠BDC=30°。从 A 到 B 的相对旋转无关紧要。它简化了 Metapost 中的构造以将中心保持在原点,以便rotate
可以以自然的方式使用。
答案3
该解决方案使用
- 该
intercections
库计算直线AC和BD与圆的交点。 calc
角度库:含义($(A)!2!30:(B)$)
。($(A)!<length>!<angle>:(B)$)
注意:半径为 1,因此直径为 2。这就是为什么长度为 2 一定会与圆相交。clip
圈外的一切。
代码:
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{calc,intersections}
\begin{document}
\begin{tikzpicture}[scale=2]
\coordinate[label=above left:$A$] (A) at (105:1);
\coordinate[label=below left:$B$] (B) at (225:1);
\draw[name path=circ] (0,0) circle (1);
\begin{scope}
\clip (0,0) circle (1);
\path[name path=AC] (A) -- ($(A)!2!30:(B)$);
\path[name path=BD] (B) -- ($(B)!2!-15:(A)$);
\path[name intersections={of=AC and circ, by=C}];
\path[name intersections={of=BD and circ, by=D}];
\draw (A) -- (B) -- (D) -- (C) -- cycle;
\end{scope}
\node[below right] at (C) {$C$};
\node[above right] at (D) {$D$};
\end{tikzpicture}
\end{document}
编辑:无需裁剪(Heiko Oberdiek 建议)
无需裁剪,line join=bevel
需要使用。此外,路径 AC 和 BD 的长度需要大于 2。1.2 似乎是更好的选择。
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{calc,intersections}
\begin{document}
\begin{tikzpicture}[scale=2]
\coordinate[label=above left:$A$] (A) at (105:1);
\coordinate[label=below left:$B$] (B) at (225:1);
\draw[name path=circ] (0,0) circle (1);
\path[name path=AC] (A) -- ($(A)!1.2!30:(B)$);
\path[name path=BD] (B) -- ($(B)!1.2!-15:(A)$);
\path[name intersections={of=AC and circ, by={[label=below right:$C$]C}}];
\path[name intersections={of=BD and circ, by={[label=above right:$D$]D}}];
\draw[line join=bevel] (A) -- (B) -- (D) -- (C) -- cycle;
\end{tikzpicture}
\end{document}
编辑2:设置(A)
(130:1)
如果将\path
AC 和 BD 的 改为,则\draw
可以看到实际的交点。因此,AC 和 BD 的适当长度值分别为 1.3 和 1.4。要找到交点 C,我们需要获取 AC 和圆的第二个交点,因此我们将一个虚拟参数作为第一个交点:
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{calc,intersections}
\begin{document}
\begin{tikzpicture}[scale=2]
\coordinate[label=above left:$A$] (A) at (130:1);
\coordinate[label=below left:$B$] (B) at (225:1);
\draw[name path=circ] (0,0) circle (1);
\path[name path=AC] (A) -- ($(A)!1.4!30:(B)$);
\path[name path=BD] (B) -- ($(B)!1.3!-15:(A)$);
\path[name intersections={of=AC and circ, by={dummy,[label=below right:$C$]C}}];
\path[name intersections={of=BD and circ, by={[label=above right:$D$]D}}];
\draw[line join=bevel] (A) -- (B) -- (D) -- (C) -- cycle;
\end{tikzpicture}
\end{document}
答案4
另一个 MetaPost 解决方案。Thruston 比我更快 :-)。我自己的解决方案虽然遵循了放置 C 和 D 的相同基本原则,但略有不同:它使用了现成的宏元乐趣格式来绘制角度(anglebetween
和anglelength
)并将标签整齐地放置在圆圈周围(freelabel
)。所以我认为发布所有内容还是很有用的。
包含在LuaLaTeX程序中,方便排版:
\documentclass[border=2mm]{standalone}
\usepackage{luamplib, gensymb}
\mplibsetformat{metafun}
\mplibtextextlabel{enable}
\begin{document}
\begin{mplibcode}
u = 3.5cm;
path circle; circle = fullcircle scaled 2u;
pair A, B, C, D;
A = u*dir 105;
B = u*dir 225;
C = B rotated 60;
D = A rotated -30;
beginfig(1);
draw circle;
draw A--B--D--C--cycle;
forsuffixes M = A, B, C, D: freelabel("$" & str M & "$", M, origin); endfor
anglelength := cm;
draw anglebetween(A--B, A--C, "$30\degree$");
draw anglebetween(D--B, D--C, "$x\degree$");
anglelength := 2cm;
draw anglebetween(B--A, B--D, "$15\degree$");
endfig;
\end{mplibcode}
\end{document}
输出: