在 TikZ 中用圆弧填充角度

在 TikZ 中用圆弧填充角度

使用 TikZ,如何用彩色圆弧填充给定多边形的角度?例如,给定三角形

\filldraw[fill=yellow, draw=black] (10,0) -- (-2,9) -- (4,-3) -- (10,0);

我想要一个以 (10,0) 为中心、半径为 1 的蓝色圆弧,扫过三角形边所围成的角度。

编辑:我忘记了问题的一个重要部分,这(我认为)使得评论中提供的链接不够充分。

我怎样才能只填写一半带有阴影弧的角度?

答案1

这是使用基本 tikz 命令完成工作的方法。一位专家可能会做出一些不错的效果。一个主要问题是 tikz 计算中数字大小的限制。您询问的三角形的尺寸使得计算太大,tikz 无法正确处理(pstricks 不会有这个问题),这就是我使用另一个三角形的原因。

一旦给出了角的坐标,就会使用 let 操作自动计算角度。代码如下

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}

\coordinate (A) at (1,0);
\coordinate (B) at (-2,1);
\coordinate (C) at (2,3);

\filldraw[fill=yellow, draw=black] (A) node {$\bullet$} -- (B) -- (C) -- cycle;

\draw[->] let \p{AB} = ($(B)-(A)$),
          \p{AC} = ($(C)-(A)$),
          \n{lAB} = {veclen(\x{AB},\y{AB})},
          \n{lAC} = {veclen(\x{AC},\y{AC})},
          \n{angAB} = {atan2(\x{AB},\y{AB})},
          \n{cos} = {(\x{AB}*\x{AC}+\y{AB}*\y{AC})/(\n{lAB}*\n{lAC})},
          \n{angle} = {acos(\n{cos})} in
           ($(A)+0.2*(\p{AB})$) arc[radius={0.2*\n{lAB}},start angle=\n{angAB},delta angle=-\n{angle}];

\end{tikzpicture}

\end{document}

结果是

在此处输入图片描述

要真正获得(半)阴影弧,请用以下代码替换绘制命令

\shadedraw[fill=blue] let \p{AB} = ($(B)-(A)$),
          \p{AC} = ($(C)-(A)$),
          \n{lAB} = {veclen(\x{AB},\y{AB})},
          \n{lAC} = {veclen(\x{AC},\y{AC})},
          \n{angAB} = {atan2(\x{AB},\y{AB})},
          \n{cos} = {(\x{AB}*\x{AC}+\y{AB}*\y{AC})/(\n{lAB}*\n{lAC})},
          \n{angle} = {acos(\n{cos})} in
           (A) -- ++ ($0.2*(\p{AB})$) arc[radius={0.2*\n{lAB}},start angle=\n{angAB},delta angle={-\n{angle}/2}] -- cycle;

使用此代码,结果是

在此处输入图片描述

代码的另一个修改是不使用余弦和反余弦

\draw[->] let \p{AB} = ($(B)-(A)$),
          \p{AC} = ($(C)-(A)$),
          \n{lAB} = {veclen(\x{AB},\y{AB})},
          \n{lAC} = {veclen(\x{AC},\y{AC})},
          \n{angAB} = {atan2(\x{AB},\y{AB})},
          \n{angAC} = {atan2(\x{AC},\y{AC})},
          \n{angle} = {mod(\n{angAB}-\n{angAC},180)} in
           ($(A)+0.2*(\p{AB})$) arc[radius={0.2*\n{lAB}},start angle=\n{angAB},delta angle=-\n{angle}];

答案2

我可以举一个如何平分一个角的例子,但我觉得它可能不会通过你的清洁门槛,但要求也不高。无论如何,它在这里:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}
\coordinate (a) at (0,0);
\coordinate (c) at (2,2);
\coordinate (b) at (3,0);
\draw (a) node[left] {A} -- (b) node[right] {B} -- (c) node[above] {C} -- cycle;
\draw[fill=black!20] (c) -- ($(c)!8mm!(b)$) to[bend left] ($(c)!8mm!(a)$)  -- cycle;

\path ($(a)!1cm!(c)$) to coordinate [midway] (h) ($(a)!1cm!(b)$); %Get the bisector coord.
\shadedraw (a) -- (h) to[bend left=20] ($(a)!9mm!(b)$)  -- cycle; %Shade the result
\end{tikzpicture} 
\end{document}

由此得出以下结论:

带阴影角的三角形图像

我忘了使用您的坐标,但它只需要更改您的节点标签的位置。

答案3

您可以绘制整个圆圈并使用剪切将其限制在一个扇区内:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\def\radius{2cm}
\begin{tikzpicture}
   \coordinate (a) at (10,0);
   \coordinate (b) at (-2,9);
   \coordinate (c) at (4,-3);

   \filldraw[fill=yellow, draw=black] (a) -- (b) -- (c) -- cycle;

   \begin{scope}
      \clip (a) -- (b) -- (c) -- cycle;
      \draw[fill=blue] circle[at=(b),radius=\radius];
   \end{scope}

   %construct the clipping path for the half circle.  Make sure the whole arc
   %we need fits inside the path

   \coordinate (ab) at ($(a)!\radius!(b)$);
   \coordinate (ac) at ($(a)!\radius!(c)$);
   \coordinate (ab1) at ($(ab)!\radius!-90:(a)$);
   \coordinate (ac1) at ($(ac)!\radius!90:(a)$);
   %Is there any way how to make the choice of the 90 or -90 automatic here?

   \begin{scope}
      \clip (a) -- (ab) -- (ab1) -- ($(ab1)!.5!(ac1)$) -- cycle;
      \draw[fill=blue] circle[at=(a),radius=\radius];
   \end{scope}
\end{tikzpicture}
\end{document}

将产生

标有角度的三角形

答案4

这里有两个使用 tikz-euclide 的例子,我相信这个解决方案稍微简单一些

\documentclass{minimal} 
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}

\begin{tikzpicture}[scale=0.75] 
\tkzInit[xmax=11,xmin=1,ymax=10,ymin=-4] \tkzClip
\tkzDefPoint(10,0){A} 
\tkzDefPoint(2,9){B} 
\tkzDefPoint(4,-3){C}
\tkzDrawPolygon[color=black,fill=yellow](A,B,C)
\tkzDefLine[bisector](B,A,C) \tkzGetPoint{c}
\tkzInterLL(B,C)(A,c) \tkzGetPoint{P}
\tkzMarkAngle[color=black,scale=1](B,A,C)
\tkzDrawSector[fill = green!50,opacity=.3,scale=0.5,shade](A,P)(C)
\end{tikzpicture}

\begin{tikzpicture}[scale=0.75] 
\tkzInit[xmax=11,xmin=1,ymax=10,ymin=-4] \tkzClip
\tkzDefPoint(10,0){A} 
\tkzDefPoint(2,9){B} 
\tkzDefPoint(4,-3){C}
\tkzDrawPolygon[color=black,fill=yellow](A,B,C)
\tkzFindAngle(C,A,B) \tkzGetAngle{tkzang}
\tkzDefPointBy[rotation= center A angle {0.5*\tkzang+180} ](C) \tkzGetPoint{P}
\tkzMarkAngle[color=black,scale=1](B,A,C)
\tkzDrawSector[fill = green!50,opacity=.3,scale=0.5,shade](A,P)(C)
\end{tikzpicture}
\end{document}

虽然我认为将三角形变成黄色的选择并不是那么好。

相关内容