Tikz 在圆圈内绘制精确的角度

Tikz 在圆圈内绘制精确的角度

在此处输入图片描述

这是角度绘制不准确的插图。

我想知道是否有更简单的方法可以在圆内绘制精确的角度,比如说$\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 csturn键可以帮助找到相对极坐标。

through库仅提供一个键,必须与node:一起使用circle through

它创建一个圆形节点,其中心位于at节点的部分,并经过分配给键的点。我使用的点(right:1)是 的罗盘方向版本(0:1)(即 的极地版本(1, 0))。

这样,我就可以创建一个尺寸随值缩放的圆,scale而无需事先使用transform shape或计算内容(这基本上由库处理through)。对于不同的x scaley scale或其他转换(例如设置x和/或y向量),无论如何都很可能会失败,您需要使用circle/ellipse路径运算符。但是,intersection cs只能使用circle节点和线(或两条线或两个圆形节点)。它确实是用于指南针和量角器的东西。

如果圆心(如我们的例子)不在原点,则需要使用circle through={([shift={(<center>)}]0:<radius>)}


节点命名ci需要

  • 使用 withintersection 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)

如果将\pathAC 和 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 的相同基本原则,但略有不同:它使用了现成的宏元乐趣格式来绘制角度(anglebetweenanglelength)并将标签整齐地放置在圆圈周围(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}

输出:

在此处输入图片描述

相关内容