切线与圆的交点

切线与圆的交点

我试图定义给定方位角的圆的切线,然后使用此交点定义线段。此处的 MWE 显示使用[turn]90:命令绘制切线时交点似乎计算得不好,因为它会与圆产生一些随机交点。因此,我无法填充切线和圆的交点定义的区域。

\documentclass[tikz,border=5]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{intersections,calc,positioning,quotes,fillbetween}
%
\begin{document}
\begin{tikzpicture}
    \def\R{1}
    \def\angle{30}
    \draw[name path=C,blue] circle[radius=\R];
    \node at (60:\R) {\tiny Fill here};
    \draw[name path=L,green] (30:\R) -- ([turn]90:\R) ;
    \draw[name path=L2,yellow] (90:\R) -- ([turn]-90:\R) ;
    \draw[red,ultra thick,intersection segments={of=L and C,
         sequence={B1}}];
\end{tikzpicture}
\end{document}

在此处输入图片描述

更新完整问题

我需要填充 2 个圆和 2 条内圆切线之间的区域。我曾经用它来intersection segments计算圆和线的交点,但由于库对切线的交点计算有误,我无法在不重复代码的情况下创建这样的图片。这是一个基于 @Qrrbrbirlbel 解决方案的示例,但填充区域必须通过计算第二个圆和切线的交点来减少。此外,我需要用与其他线条不同的颜色来intersections绘制内部。arc

\begin{tikzpicture}
    \def\RA{1} \def\RB{2} \def\angleA{75} \def\angleB{-65}
    \filldraw[red,fill opacity=0.3] (\angleA:\RA) coordinate (start)
      arc[start angle=\angleA, end angle=\angleB, radius=\RA] coordinate[at end] (end)
      -- (intersection of start--{$(start)+(\angleA+90:\RB)$}
                        and end--{$(end)  +(\angleB-90:\RB)$})
      -- cycle;
    \draw[red,overlay] (\angleA:\RB) arc[start angle=\angleA, end angle=\angleB, radius=\RB]; % this should limit the fill area and be drawn in red
    \draw[green] (start) arc[start angle=\angleA, end angle=\angleB, radius=\RA]; % this is because I need this segment to be in green
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

问题似乎是该库(和intersections都使用)在圆圈和绿线之间找到了两个交点:fillbetweenspath3

\documentclass[tikz, border=5pt]{standalone}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\draw[name path=C]circle[radius=1];
\draw[name path=L](30:1) -- ([turn]90:1);
\path[name intersections={of=C and L, total=\t}]
  node foreach \i in {1, ..., \t} at (intersection-\i) {x};
\end{tikzpicture}
\end{document}

在此处输入图片描述

这把一切都搞乱了。

在这种情况下,你真的不需要fillbetween。你知道角度(30° 和 60°)和交点直线之间的intersection of语法找到无需任何额外的库。不过,您也可以intersections在这里使用。

我正在使用该calc库来获得更短的语法

代码

\documentclass[tikz, border=5pt]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\R{1} \def\angle{30}

\fill[red] (\angle:\R) coordinate (start)
  arc[start angle=\angle, end angle=90, radius=\R] coordinate[at end] (end)
  -- (intersection of start--{$(start)+(\angle+90:1)$} and end--{$(end)+(0:1)$})
  -- cycle;
\end{tikzpicture}

\begin{tikzpicture}
\def\R{1} \def\angleA{75} \def\angleB{-75}

\fill[red] (\angleA:\R) coordinate (start)
  arc[start angle=\angleA, end angle=\angleB, radius=\R] coordinate[at end] (end)
  -- (intersection of start--{$(start)+(\angleA+90:1)$}
                    and end--{$(end)  +(\angleB-90:1)$})
  -- cycle;
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述
在此处输入图片描述


对于您更新的问题,我已经尝试过fillbetween- 但没有效果,所以这里有一个spath3解决方案。

这种方法并不是指定两个路径相交处之间需要哪些线段,而是恰恰相反:

  1. 在路径的交叉点处分割路径。
  2. 删除我们不想要的部分。
  3. 按照正确的顺序和方向连接路径。

在一个我最近的回答我提供(几乎)相同的图片,一次用fillbetween,一次用spath3

代码

\documentclass[tikz, border=5pt]{standalone}
\usetikzlibrary{calc, spath3, intersections}
\begin{document}
\begin{tikzpicture}[spath/save/.append style=overlay]
\def\RA{1} \def\RB{2} \def\angleA{-60} \def\angleB{85}

\path[spath/save=RA] (\angleA:\RA) coordinate (start)
  arc[start angle=\angleA, end angle=\angleB, radius=\RA] coordinate[at end] (end)
  -- (intersection of start--{$(start)+(\angleA+90:1)$}
                    and end--{$(end)  +(\angleB-90:1)$})
  -- cycle;
\path[spath/save=RB]
  (\angleA:\RB) arc[start angle=\angleA, end angle=\angleB, radius=\RB];

\fill[
  red, spath/.cd,
  split at intersections={RA}{RB},
  remove components={RB}{1, 3},
  remove components={RA}{1},
  use=RB,
  append reverse no move=RA];
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容