过标准椭圆外一定点,引椭圆的两条切线,绘制切线

发布于 2024-10-17 22:10:05
\documentclass[tikz,border=2pt]{standalone}
\begin{document}
\begin{tikzpicture}

    \draw [gray!70] (-4,-4) grid (4,4);

    \draw [->] (-4,0) -- (4,0) node [below left] {$x$};
    \draw [->] (0,-4) -- (0,4) node [below left] {$y$};

    \draw [thick] (2,0) arc (0:360:2 and 1);

    \coordinate (O) at (0,0);
    \node at (O) [below left] {$O$};

    \coordinate (P) at (1,2);
    \fill (P) circle (1pt) node [above right] {$P$};
    
    \coordinate (M) at (-2.75,0);%%手动模拟坐标,让它看起来
    \coordinate (N) at (2.075,0);%%像是相切,像那么回事!!
    \draw [red] (M) -- (P) -- (N);

\end{tikzpicture}
\end{document}

如题,在群里看见有网友提问:如何绘制过椭圆外的定点的两条切线。考虑到他认为TeX拥有强大的计算能力,在此请教!

查看更多

关注者
0
被浏览
127
3 个回答
Sagittarius Rover
Sagittarius Rover 11小时前
不喜欢LaTeX!!!

我是不懂这个代码的,both 数学原理 and LaTeX Tikz实现
我只是个轮子的搬运工

参考(copy)自下面的链接John Kormylo‘s brilliant solution on TSE

\documentclass[tikz,border=2pt]{standalone}
\usetikzlibrary{calc,intersections}
\newlength{\bigenough}
\newcount\total
% locates both points on a closed shape tangent to a point outside the shape.
% \tangent{pathname}{center}{point}{first}{second}
\newcommand{\tangent}[5]% #1=path name for shape, #2=coordinate name for center, #3=cordinate name for outside point
{\begingroup% #4=coordinate name for first tangent point, #5=coordinate name for second coordinate point
\setlength{\bigenough}{1cm}
\loop% loop until big enough
  \path[name path=temp]  ($(#2)!\bigenough!-90:(#3)$)--($(#2)!\bigenough!90:(#3)$);
  \path[name intersections={of = #1 and temp, total=\t}]%
    \pgfextra{\global\total=\t};%
  \ifnum\total<2 \global\bigenough=2\bigenough\repeat%
\endgroup
\coordinate (#4) at (intersection-1);% initial guess
\coordinate (#5) at (intersection-2);%
\tangentsearch{#1}{#2}{#3}{#4}%
\tangentsearch{#1}{#2}{#3}{#5}}

% find tangent using binary search
\newcommand{\tangentsearch}[4]% #1=path name for shape, #2=coordinate name for center, #3=cordinate name for outside point
{\begingroup% #4=coordinate name for tangent point (initail guess -> final)
\loop% loop until only 1 intersection
  \path[name path=temp] (#3)--($(#4)!-\bigenough!(#3)$);
  \path[name intersections={of = #1 and temp, total=\t}]%
    \pgfextra{\global\total=\t};%
\ifnum\total=2 \coordinate (#4) at ($(intersection-1)!0.5!(intersection-2)$);
  %\draw[pink] (intersection-1)--(intersection-2);% included only for debugging purposes
  \path[name path=temp] (#4)--($(#4)!-\bigenough!(#2)$);
  \path[name intersections={of = #1 and temp}];%
  \coordinate (#4) at (intersection-1);%
  \repeat%
\endgroup}

\begin{document}
    \begin{tikzpicture}
        \draw [gray!70] (-4,-4) grid (4,4);
        \draw [->] (-4,0) -- (4,0) node [below left] {$x$};
        \draw [->] (0,-4) -- (0,4) node [below left] {$y$};
        \draw[name path=ellipse,thick,fill=gray!30,opacity=0.5] (0,0) ellipse (2 and 1);
        % \draw [thick] (2,0) arc (0:360:2 and 1);
        %\coordinate (O) at (0,0);
        %\node at (O) [below left] {$O$};
        %这里可以缩行
        \coordinate[label={below left:$O$}] (O);
        % \coordinate (P) at (1,2);
        % \fill (P) at (1,2) circle (1pt) node [above right] {$P$};
        %这里也可以缩行
        \node[label={above right:$P$},circle, fill, inner sep=1pt] (P) at (1,2) {};
        \tangent{ellipse}{O}{P}{X}{Y}
        \draw (X)--(P)--(Y);
    \end{tikzpicture}
\end{document}

image.png

远方不远
远方不远 9小时前
这家伙很懒,什么也没写!

感谢群友@香港-小狮子提出了一种较为简单的几何画法!其余参与讨论的大家,一并感谢您们的指导!
方法肯定不止这一种,后续我将继续整理讨论结果,同时十分欢迎提出新的回答!

\documentclass[tikz,border=2pt]{standalone}
\usetikzlibrary{calc,intersections}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}[scale=2]

    \draw [->] (-3,0) -- (3,0) node [below left] {$x$};
    \draw [->] (0,-3) -- (0,3) node [below left] {$y$};
    \draw [help lines] (-3,-3) grid (3,3);
    \clip (-3.1,-3.1) rectangle (3.1,3.1);
    \draw [thick] (2,0) arc (0:360:2 and 1) node at (-2,-2) {$\dfrac{x^2}{4}+y^2=1$};

    \node (O) at (0,0) [below left] {$O$};
    \fill (1,2)                circle (1pt) coordinate (P)  node [above right] {$P(1,2)$};
    \fill ({-sqrt(3)*1cm},0cm) circle (1pt) coordinate (F1) node [below]       {$F_1$};
    \fill ({sqrt(3)*1cm},0cm)  circle (1pt) coordinate (F2) node [below]       {$F_2$};

    \path let \p1=($(P)-(F2)$),\n1={veclen(\x1,\y1)}
          in [dotted,name path=cirP] (P) circle (\n1);

    \path [dotted,name path=cirF1] (F1) circle (4);

    \path [name intersections={of=cirP and cirF1,by={J1,J2}},dashed] (J1)--(F2) (J2)--(F2);

    \draw let \p1=(J1),\p2=(F2),\n1={\y2-\y1},\n2={\x2-\x1},\n3={atan{\n1/\n2}-90}
          in [ultra thick,red] (P)--++(\n3:4cm);

    \draw let \p1=(J2),\p2=(F2),\n1={\y2-\y1},\n2={\x2-\x1},\n3={atan{\n1/\n2}-90}
          in [ultra thick,red] (P)--++(\n3:3cm);

\end{tikzpicture}
\end{document}
越来越少
越来越少 25分钟前
这家伙很懒,什么也没写!

电脑的计算几乎都是近似计算, 只要近似地还行, 不是切线也是切线.

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览