这两天我一直在尝试画一个像下面这个草稿一样精确的图形。
在网上搜索后,我测试了很多软件和脚本语言。其中两种脚本语言很有前景。
- 技巧
- tkz-欧几里得
使用技巧我能够画出圆、圆心和切线。问题是我找不到表示直角的方法。我无法做到这一点,因为脚本psCircleTangents
不会返回两个点,而是返回一个点的标签,我无法使用此标签来构建直角标记,例如,使用psframe
。
\documentclass[11pt,a4paper,twoside]{article}
\usepackage{pstricks-add} % loads also pst-node
\begin{document}
\begin{pspicture}(0,3)(10,10)
\pscircle(8,0){2} %circle
\psdot(8,0) % circle center
\psdot(0,-3) % a random point
\psCircleTangents(0,-3)(8,0){2} % script that calculates two tangent points
\pcline[nodesep=0,linecolor=blue](0,-3)(CircleT1) % drawing the tangent line to the first calculated tangent
\pcline[nodesep=0,linecolor=blue](0,-3)(CircleT2) % same for the second tangent
\end{pspicture}
\end{document}
我第二次尝试是使用tkz-欧几里得包。由于文档只有法语,我无法完全理解包的动态。我能够模仿与第一个脚本生成的相同图片,但理解程度不高。
\documentclass[11pt,a4paper,twoside]{article}
\usepackage{tikz}
\usepackage{tkz-euclide}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}
\tkzInit
\tkzDefPoint(0,0){O}
\tkzDefPoint(6,6){E}
\tkzDefPoint(2,2){A}
\tkzDrawCircle(O,A)
\tkzTangent[from=E](O,A) \tkzGetPoints{e}{f}
\tkzGetPoints{k}{l}
\tkzDrawLines[](E,e E,l)
\end{tikzpicture}
\end{document}
看起来第一个 PSTricks 更优雅,但我无法分割我需要使用的点。
问题 1:可以这样吗?
问题2:有人知道如何在 tkz-Euclide 处取切线以及如何正确画直角吗?
问题 3:还有其他选项可以用来绘制此图形吗?我已经尝试了以下方法:
- Geogebra
- LaTeX绘图
- 欧氏藻
非常感谢,
答案1
参见“tikz & pgf 手册”,第 137 页顶部:
从手册中提取的代码:
\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
您快完成了。只需对您的代码进行轻微修改即可:
\documentclass{standalone}
\usepackage{tkz-euclide}
% \usetkzobj{all} % useless with the last version >= 3.01
\begin{document}
\begin{tikzpicture}
\tkzDefPoint(0,0){O}
\tkzDefPoint(12,0){E}
\tkzDefPoint(2,2){A}
\tkzDrawCircle(O,A)
\tkzLabelPoint(O){$O$}
\tkzTangent[from=E](O,A) \tkzGetPoints{e}{f}
\tkzDrawSegments(O,e O,f O,E)
\tkzMarkSegment[size=5pt,pos=.5,mark=|](e,E)
\tkzMarkSegment[size=5pt,pos=.5,mark=|](f,E)
\tkzMarkSegment[size=5pt,pos=.5,mark=||](O,E)
\tkzGetPoints{k}{l}
\tkzDrawSegments[](E,e E,l)
\tkzMarkRightAngle(O,e,E)
\tkzMarkRightAngle(O,f,E)
\end{tikzpicture}
\end{document}
一些评论。使用\usetkzobj
允许它识别圆和其他物体。在每个图表中都有它并没有坏处tkz-euclide
。首先,您定义点 O(中心)、点 E(用于构造切线)和点 A(圆上的点)。\tkzDrawCircle
绘制以 O 为中心经过点 A 的圆。然后我标记了点 O。宏\tkzTangent
计算从点 E 到以 O 为中心包含 A 的圆的切线。有两个可能的切点,它们被计算并放入变量 e 和 f 中。接下来,您想要绘制线段而不是线,以便线段在您要求的位置开始和停止。画一条线会在每一端在线段上添加一点。绘制段并使用创建标记\tkzMarkSegment
。大小决定标记的大小,0.5 表示它位于中间,并mark=|
设置要使用的标记。第 77 页的文档表示mark=|||
有效。\tkzMarkRightAngle
创建直角标记,其中中点是直角的顶点。
我不熟悉 pstricks。最初我几年前就研究过它,但发现tkz-euclide
它更容易使用。谷歌翻译可以帮助你了解基础知识。还有一些网站提供相关信息,例如这个页。请注意该网站也有圆形和三角形的页面。
答案3
我也不懂法语。
\documentclass[11pt,a4paper,twoside]{article}
\usepackage{tkz-euclide}
% \usetkzobj{all} % useless with version >= 3.01
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}
\tkzInit
\tkzDefPoint(0,0){O}
\tkzDefPoint(6,0){E}
\tkzDefPoint(2,2){A}
\tkzDrawCircle(O,A)
\tkzTangent[from=E](O,A) \tkzGetPoints{e}{f}
%\tkzDrawLines[](E,e E,l)
\draw[-,postaction={decorate},decoration = {markings,mark=at position 0.5 with
{\draw[-] (0pt,-3pt)--(0pt,3pt);}}](E)--(e);
\draw[-,postaction={decorate},decoration = {markings,mark=at position 0.5 with
{\draw[-] (0pt,-3pt)--(0pt,3pt);}}](E)--(f);
\tkzInterLC(E,O)(O,A) \tkzGetPoints{k}{l}
\draw[-,postaction={decorate},decoration = {markings,mark=at position 0.6 with
{\draw[-] (-2pt,-3pt)--(-2pt,3pt);
\draw[-] (0pt,-3pt)--(0pt,3pt);
\draw[-] (2pt,-3pt)--(2pt,3pt);}}](E)--(k);
\end{tikzpicture}
\end{document}
更新:我还注意到,单标记和双标记是内置的,但三标记不是内置的tkz-euclide
。
\documentclass[11pt,a4paper,twoside]{article}
\usepackage{tkz-euclide}
%\usetkzobj{all} % useless with version >= 3.01
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}
\tkzInit
\tkzDefPoint(0,0){O}
\tkzDefPoint(6,0){E}
\tkzDefPoint(2,2){A}
\tkzDrawCircle(O,A)
\tkzTangent[from=E](O,A) \tkzGetPoints{e}{f}
%\tkzDrawLines[](E,e E,l)
\draw[-](E)--(e);
\draw[-](E)--(f);
\tkzMarkSegments[mark=s|,mark size=6pt](E,e E,f)
\draw[-] (f) -- (O) -- (e);
\tkzInterLC(E,O)(O,A) \tkzGetPoints{k}{l}
\draw[-,postaction={decorate},decoration = {markings,mark=at position 0.6 with
{\draw[-] (-4pt,-3pt)--(-2pt,3pt);
\draw[-] (-1pt,-3pt)--(1pt,3pt);
\draw[-] (2pt,-3pt)--(4pt,3pt);}}](E)--(k);
% \tkzDrawSegment(E,k)
% \tkzMarkSegments[mark=s|||,mark size=6pt](E,k) %<- does not seem to work
\end{tikzpicture}
\end{document}
答案4
这是一个带有 的简码pst-eucl
,用于显示建造从一个点到一个圆的切线,直角标记为:
\documentclass[11pt, a4paper, twoside, svgnames]{standalone}
\usepackage{pstricks-add} % loads also pst-node
\usepackage{pst-eucl} % for plane geometry
\usepackage{auto-pst-pdf} % to compile with pdflatex --enable-write18 (MiKTeX) or pdflatex --shell-escape (TX Live, MacTeX))
\begin{document}
\begin{pspicture}(15,10)
\psset{PointSymbol=none, dotsize = 2.5pt, linejoin = 1, dimen = outer}
\pstGeonode[PosAngle = {0,90}](8, 0){O}(0,-3){M}
\pstCircleOA[Radius=\pstDistVal{2}, linecolor = IndianRed, linewidth = 1.2pt]{O}{}
\pstMiddleAB[ PointName=none]{O}{M}{I}
\psset{linewidth=0.6pt,}
\pstInterCC[RadiusA=\pstDistVal{2}, DiameterB=\pstDistAB{O}{M},
CodeFigB=true, CodeFigColor=Gold, PosAngleA = -45, PosAngleB=90]{O}{}{I}{}{A}{B}
\psset{linecolor=Tomato, linewidth=0.6pt, nodesep=-2}
\pstLineAB{M}{A}\pstLineAB{M}{B}
\psline(A)(O)(B)
\psset{linecolor = LightSalmon}
\pstRightAngle*{M}{A}{O}
\pstRightAngle{M}{B}{O}
\psdots[dotsize = 2.5pt, linecolor = black](O)(M)(A)(B)
\end{pspicture}
\end{document}