我画了一个圆圈以及它的水平线和垂直线。
\begin{tikzpicture}
\draw (0,0) node [above left] {O} circle (3); % circle of radius 3
\draw (0,3) node [above] {A} -- (0,-3) node [below] {B}; % vertical diameter
\draw (-3,0) node [left] {P} -- (3,0) node [right] {Q}; % hotizontal diameter
\end{tikzpicture}
现在,我想要一条与 AB 平行的线,它通过 (-2,0) 并且两端都终止于圆的圆周上。
答案1
两种不同的方法:
剪裁
您可以绘制一条比要求更长的线,但将其剪裁到圆圈:
\begin{tikzpicture}
\draw (0,0) node [above left] {O} circle (3); % circle of radius 3
\draw (0,3) node [above] {A} -- (0,-3) node [below] {B}; % vertical diameter
\draw (-3,0) node [left] {P} -- (3,0) node [right] {Q}; % hotizontal diameter
\clip (0,0) circle (3);
\draw[green] (-2,3) -- (-2,-3);
\end{tikzpicture}
计算
您可以使用三角函数来计算直线起点和终点的坐标。使用极坐标,您需要找到这些点相对于圆心的角度。在这种情况下很容易,因为半径r
和x
距离已知,所以角度将是 acos(x/r)。可以在let..in
构造中进行此计算。
通过这种方法,您还可以获得直线端点的坐标(极坐标形式),因此您也可以根据需要标记它们(如下面的示例所示)。
\usetikzlibrary{calc}
\begin{tikzpicture}
\draw (0,0) node [above left] {O} circle (3); % circle of radius 3
\draw (0,3) node [above] {A} -- (0,-3) node [below] {B}; % vertical diameter
\draw (-3,0) node [left] {P} -- (3,0) node [right] {Q}; % hotizontal diameter
\draw[red]
let \n1 = {acos(2/3)} % \n1 is the angle
in (180-\n1:3) node[above left] {A'} --
(180+\n1:3) node[below left] {B'};
% Polar form uses the syntax (angle:radius)
\end{tikzpicture}
答案2
intersections
您可以使用以下库来避免数学运算tikz
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\draw[name path=circle] (0,0) circle (3) node [above left] {$O$}; % circle of radius 3
\draw (0,3) node [above] {$A$} -- (0,-3) node [below] {$B$}; % vertical diameter
\draw (-3,0) node [left] {$P$} -- (3,0) node [right] {$Q$}; % horizontal diameter
\path[name path=transversal] (-2,-3) -- ++(0,6);
\draw[name intersections={of=circle and transversal,by={Q',P'}}]
(P') node[below] {$P'$} -- (Q') node[above] {$Q'$};
\end{tikzpicture}
\end{document}
这是一种非常灵活的方法,因为路径实际上可以是任何东西 - 圆形、直线、贝塞尔曲线等。
答案3
只需一点计算,就可以得到角度,然后得到对称点。
\begin{tikzpicture}
\draw (0,0) node [above left] {O} circle (3); % circle of radius 3
\draw (0,3) node [above] {A} -- (0,-3) node [below] {B}; % vertical diameter
\draw (-3,0) node [left] {P} -- (3,0) node [right] {Q}; % hotizontal diameter
\draw ({asin(-2/3)}:3) -- ({-180-asin(-2/3)}:3);
\end{tikzpicture}
答案4
使用 PSTricks。
路口
\documentclass[pstricks,border=15pt]{standalone}
\usepackage{pst-eucl}
\psset{CurveType=polyline}
\begin{document}
\begin{pspicture}(-3,-3)(3,3)
\pstGeonode[PosAngle={135,0,180}]{O}(3,0){Q}(-3,0){P}
\pstGeonode[PosAngle={90,-90}](0,3){A}(0,-3){B}
\pnode(-2,0|A){A'}
\pnode(-2,0|B){B'}
\pstInterLC[PosAngleA=90,PosAngleB=-90]{A'}{B'}{O}{A}{Q'}{P'}
\pstCircleOA{O}{A}
\psline(Q')(P')
\end{pspicture}
\end{document}
警告: 我刚知道
\pstInterLC[PosAngle={90,-90}]{A'}{B'}{O}{A}{Q'}{P'}
不管用!
逆三角函数
由于 PostScript 仅提供sin
、cos
和atan
,我们需要定义一个新的 RPN 运算符acos
为
\pstVerb{/acos {dup 2 exp 1 exch sub sqrt exch atan} bind def}
完整代码如下。
\documentclass[pstricks,border=15pt]{standalone}
\usepackage{pst-eucl}
\pstVerb{/acos {dup 2 exp 1 exch sub sqrt exch atan} bind def}
\psset{CurveType=polyline}
\begin{document}
\begin{pspicture}(-3,-3)(3,3)
\pstGeonode[PosAngle={135,0,180}]{O}(3,0){Q}(-3,0){P}
\pstGeonode[PosAngle={90,-90}](0,3){A}(0,-3){B}
\pstGeonode[PosAngle={90,-90}]
(!3 -2 3 div acos PtoC){Q'}
(!3 -2 3 div acos neg PtoC){P'}
\pstCircleOA{O}{A}
\end{pspicture}
\end{document}
剪裁
应避免使用剪辑(针对此问题),因为这会使我们难以放置P'
和Q'
标签(以及需要时的点)。
下面的例子使用节点P'
和Q'
(上面第二种方法中使用)来规避困难,但它看起来很有趣,因为
\pstGeonode[PosAngle={90,-90},CurveType=none]
(!3 -2 3 div acos PtoC){Q'}
(!3 -2 3 div acos neg PtoC){P'
\psclip{\pstCircleOA{O}{A}}
\psline([offset=1]Q')([offset=-1]P')
\endpsclip
实际上可以写成
\pstGeonode[PosAngle={90,-90}]
(!3 -2 3 div acos PtoC){Q'}
(!3 -2 3 div acos neg PtoC){P'}
好的,这是完整的代码!
\documentclass[pstricks,border=15pt]{standalone}
\usepackage{pst-eucl}
\pstVerb{/acos {dup 2 exp 1 exch sub sqrt exch atan} bind def}
\psset{CurveType=polyline}
\begin{document}
\begin{pspicture}(-3,-3)(3,3)
\pstGeonode[PosAngle={135,0,180}]{O}(3,0){Q}(-3,0){P}
\pstGeonode[PosAngle={90,-90}](0,3){A}(0,-3){B}
\pstGeonode[PosAngle={90,-90},CurveType=none]
(!3 -2 3 div acos PtoC){Q'}
(!3 -2 3 div acos neg PtoC){P'}
\psclip{\pstCircleOA{O}{A}}
\psline([offset=1]Q')([offset=-1]P')
\endpsclip
%\pstCircleOA{O}{A} <-- not needed!
\end{pspicture}
\end{document}
最新编辑:
显然,pstricks.pro
已经添加或定义Acos
如下,
/Acos {dup dup mul neg 1 add dup 0 lt {% arc cos, returns 0 when negative root
pop pop 0 }{ sqrt exch atan} ifelse } def
这样就可以减少更多的击键次数。
\documentclass[pstricks,border=15pt]{standalone}
\usepackage{pst-eucl}
\psset{CurveType=polyline}
\begin{document}
\begin{pspicture}(-3,-3)(3,3)
\pstGeonode[PosAngle={135,0,180}]{O}(3,0){Q}(-3,0){P}
\pstGeonode[PosAngle={90,-90}](0,3){A}(0,-3){B}
\pstGeonode[PosAngle={90,-90}]
(!3 -2 3 div Acos PtoC){Q'}
(!3 -2 3 div Acos neg PtoC){P'}
\pstCircleOA{O}{A}
\end{pspicture}
\end{document}