从圆外一点到圆的切线(tikz)

从圆外一点到圆的切线(tikz)

我正在尝试策划蒂克兹过给定点的固定圆的两条切线。

具体来说,给定一个C以 为圆心、半径 的任意圆r,以及圆外的一个点P。我想绘制从P到圆的两条切线。我的问题主要是:

  1. 我希望它绘制一个一般情况,即圆的中心和半径应该是任意的,外面的点也是任意的。
  2. 我提出的公式不太友好,涉及坐标的立方因子和平方根。

任何提示、建议、代码片段等都将受到欢迎!

结语:这个问题实际上是产生与庞赛莱的波里斯主义一方面,我觉得 TikZ 中与切线概念相关的内置方法对我来说太难使用了。另一方面,tkz-euclid法语中的 太多了 :) 最后,我恢复到了派脚本,这在我的脑海中更容易编程。这是我得到的结果之一(这是源代码,如果你有兴趣的话):

在此处输入图片描述

至于我选择的答案;它是以最简单的方式提出问题并提供解决方案的答案。谢谢大家的帮助!

答案1

在 pgf 手册第 130 页(版本 3.10)中,您有完全相同的示例。我只是从那里复制它以方便任何人需要。它需要\usetikzlibrary{calc}

\begin{tikzpicture}
\draw[help lines] (0,0) grid (3,2);
\coordinate (a) at (3,2);
\node [circle,draw] (c) at (1,1) [minimum size=40pt] {$c$};
\draw[red] (a) -- (tangent cs:node=c,point={(a)},solution=1) --
(c.center) -- (tangent cs:node=c,point={(a)},solution=2) -- cycle;
\end{tikzpicture}

答案2

下面是使用的示例tikz-eculide。我不是这方面的专家,也找不到这方面的英文文档,所以不得不求助于混合通常的tikz语法,但这似乎有效。

\begin{document} 
\begin{tikzpicture}
   \newcommand*{\Radius}{3cm}%
   \coordinate (Origin) at (0,0);
   \coordinate (P) at (4,4);% External point

   \node [right,blue] at (P) {P};
   \draw[thin,gray!30] (-5,-5) grid (5,5);

   \tkzDrawCircle[R,ultra thick](Origin,\Radius)
   \tkzTangent[from with R= P](Origin,\Radius)  \tkzGetPoints{D1}{D2} 

   \tkzDrawSegments[color=red,ultra thick](P,D1)% First tangent
   \tkzDrawSegments[color=red,ultra thick](P,D2)% Second tangent
\end{tikzpicture}     
\end{document}

在此处输入图片描述

答案3

tkz-eucide,基于是tikz一个可以大大简化此类问题的包。

为了获得随机点和半径,我建议使用以下代码:

\documentclass{minimal}

\usepackage{tkz-euclide}

\begin{document}
   \begin{tikzpicture}
      \tkzDefPoint(0,0){C}
      \tkzDefPoint(5,5){B}
      \tkzGetRandPointOn[rectangle = C and B]{A}
      \tkzDefPoint(10,10){Q}
      \tkzGetRandPointOn[rectangle = B and Q]{P}
      \tkzCalcLength[cm](C,A)\tkzGetLength{CRadius}
      \tkzDrawCircle[R](C,\CRadius cm)

      \tkzDefPointBy[rotation=center C angle 0](P)
      \tkzGetPoint{a}
      \tkzTangent[from with R = a](C,\CRadius cm)
      \tkzGetPoints{T_1}{T_2}
      \tkzDrawLines(a,T_1 a,T_2)
      \tkzDrawSegments(C,T_1 C,T_2)

      \tkzDrawPoints(C,P,T_1,T_2)
      \tkzLabelPoints(C,P,T_1,T_2)
   \end{tikzpicture}
\end{document}

由于文档只有法语,而且这是一个英语论坛,所以我将稍微解释一下其机制:

首先定义点CB,然后在矩形内生成一个随机点(A),定义给出圆半径的线段。然后定义另一个随机点(P),该点应位于圆外。这就是它在原始矩形之外的原因。

绘制圆,然后构造两个可能的切线以及与切点相关的半径。

最后绘制出点(小圆圈)并进行标记。

享受! :)

答案4

在对 PStricks 的强大功能印象深刻之后,我尝试为您的第二个问题提出一个 TikZ 解决方案,只是为了好玩,看看我是否可以(以一种相当简单的方式)复制该示例。 这是我所做的...

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,intersections}
\newcommand*{\Radius}{10cm}
\newcommand*{\gettang}[2]{
\path[name path = L] (#1) -- ($(#1)!\Radius!(tangent cs:node=c,point={(#1)},solution=1)$);
\path [name intersections={of=BIG and L}];
\draw (#1)  -- (intersection-1) node[inner sep=0cm] (#2) {};}

\begin{document}
\begin{tikzpicture}
\node[name path = BIG,circle,draw,minimum size=\Radius] (bc) at (0,0) {};
\node [circle,draw,minimum size=0.764cm] (c) at (1,1) {$c$};

\foreach \y in {90,89,...,84}{
\coordinate (a1) at (\y:5);
\coordinate (tangpoint) at (tangent cs:node=c,point={(a1)},solution=1);
\path[name path = L] (a1) -- ($(a1)!\Radius!(tangpoint)$);
\path [name intersections={of=BIG and L}];
\draw (a1) -- (intersection-1) node[inner sep=0cm] (a2) {};
\foreach \x [remember=\x as \lastx (initially 2)] in {3,4,...,21} {\gettang{a\lastx}{a\x}};}
\end{tikzpicture}
\end{document}

关于该算法的一点解释:

a) 我在圆上取一个点 (a1)。(为简单起见,本例中选择了北极)

b)我画一条通过切点的延长线(为了安全起见,长度为一个直径)

c) 将其与大圆相交。取其中一个解。

d) 从起始点到交点画一条线。

e)并重复给定的次数。

以下是不同迭代次数的结果。

在此处输入图片描述

我不明白如何获得这些重复性很好的线条,这样它在多次移动后会返回到初始点。因此我只能通过目测来获得这一点,但如果你告诉我怎么做,我想我们可以修改代码。

我还没有完整的代码。有一个错误阻止最后两个集合在初始点完成。我会尝试看看是否可以修复它。

相关内容