剪裁

剪裁

我画了一个圆圈以及它的水平线和垂直线。

\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}

夹子

计算

您可以使用三角函数来计算直线起点和终点的坐标。使用极坐标,您需要找到这些点相对于圆心的角度。在这种情况下很容易,因为半径rx距离已知,所以角度将是 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 仅提供sincosatan,我们需要定义一个新的 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}

相关内容