我正在尝试策划蒂克兹过给定点的固定圆的两条切线。
具体来说,给定一个C
以 为圆心、半径 的任意圆r
,以及圆外的一个点P
。我想绘制从P
到圆的两条切线。我的问题主要是:
- 我希望它绘制一个一般情况,即圆的中心和半径应该是任意的,外面的点也是任意的。
- 我提出的公式不太友好,涉及坐标的立方因子和平方根。
任何提示、建议、代码片段等都将受到欢迎!
结语:这个问题实际上是产生与庞赛莱的波里斯主义一方面,我觉得 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}
由于文档只有法语,而且这是一个英语论坛,所以我将稍微解释一下其机制:
首先定义点C
和B
,然后在矩形内生成一个随机点(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)并重复给定的次数。
以下是不同迭代次数的结果。
我不明白如何获得这些重复性很好的线条,这样它在多次移动后会返回到初始点。因此我只能通过目测来获得这一点,但如果你告诉我怎么做,我想我们可以修改代码。
我还没有完整的代码。有一个错误阻止最后两个集合在初始点完成。我会尝试看看是否可以修复它。