![切线与圆的交点](https://linux22.com/image/468941/%E5%88%87%E7%BA%BF%E4%B8%8E%E5%9C%86%E7%9A%84%E4%BA%A4%E7%82%B9.png)
我试图定义给定方位角的圆的切线,然后使用此交点定义线段。此处的 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
都使用)在圆圈和绿线之间找到了两个交点:fillbetween
spath3
\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
解决方案。
这种方法并不是指定两个路径相交处之间需要哪些线段,而是恰恰相反:
- 在路径的交叉点处分割路径。
- 删除我们不想要的部分。
- 按照正确的顺序和方向连接路径。
在一个我最近的回答我提供(几乎)相同的图片,一次用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}