20 利用tangent绘图系统画切线失败

发布于 2025-07-27 19:32:49
\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{math,calc,intersections,through,angles,arrows.meta,shapes.geometric,shadows,quotes,spy,datavisualization,datavisualization.formats.functions,plotmarks}
\tikzset{every picture/.style={samples=300,smooth,line join=round,thick,>=Stealth,font=\small}}

\begin{document}

   \begin{tikzpicture}[scale=.4]
      \draw[->](-2,0)--(5.5,0)node[below]{$x$};
      \draw[->](0,-4.5)--(0,4.5)node[right]{$y$};
      \coordinate[label=-135:$O$](O)at(0,0);
      \draw[cyan,domain=-4.5:4.5]plot(\x*\x/4,\x);
      \coordinate[label=left:$C$](C)at(2,1);
      \draw[red](C)circle(2);
      \coordinate[label=above:$P$](P)at(4,4);
      \draw[cyan,domain=-4.5:4.5]plot(-1,\x);
      \draw (P)--(tangent cs:node=C,point={(P)},solution=1)--(C.center)--cycle;
  \end{tikzpicture}    
    
\end{document}

111.tex
111.pdf
111.jpg

不知道问题出在哪了,求助,谢谢!

查看更多

关注者
0
被浏览
134
Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~

预期的目标效果是什么呢?

image.png

这个图中的c是一个node,圆周是node的边界,而你代码中:

\coordinate[label=left:$C$](C)at(2,1);
\draw[red](C)circle(2);
\draw(P)--(tangent cs:node=C,point={(P)},solution=1)--(C.center)--cycle;

圆周是一个path,你用tangent cs绘制的是对coordinateC的切线,而点是没有半径的,所以重合了...

BTW,下面这些包只有calc和你的问题有关。

\usetikzlibrary{
    % math,
    calc,
    % intersections,
    % through,
    % angles,
    arrows.meta,
    % shapes.geometric,
    % shadows,
    % quotes,
    % spy,
    % datavisualization,
    % datavisualization.formats.functions,
    % plotmarks
}
2 个回答
Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~

我认为的最佳实践,当涉及「圆锥曲线」时,比较系统化的作图方式是基于tkz-elements,下面的代码虽然较长,但是逻辑清晰可拓展性强,方便多次复用。

\documentclass[tikz,border=2pt]{standalone}
\usepackage{tkz-euclide,tkz-elements}
\directlua{
    init_elements()
    z.O = point(0, 0)
    z.C = point(2, 1)
    z.P = point(4, 4)
    % -- 准线
    z.L1 = point(-1,-4.5)
    z.L2 = point(-1,4.5)
    L.line = line(z.L1, z.L2)
    % -- 抛物线
    z.F = point(1, 0)
    CO.PA = conic(z.F, L.line, 1)
    PA.PA = CO.PA:points(-4.5, 4.5, 300)
    % -- 定义圆
    z.c = point(0, 1)
    C.Cc = circle(z.C, z.c) 
    % -- 定义过P做圆C的切线
    L.T1,L.T2 = C.Cc:tangent_from(z.P)
    z.T1 = L.T1.pb
    z.T2 = L.T2.pb
}
\begin{document}
    \begin{tikzpicture}[scale=.4,smooth,line cap=round]
        \tkzGetNodes
        \tkzInit[xmin=-2,xmax=5.5,ymin=-4.5,ymax=4.5] 
        \tkzDrawX[noticks]\tkzDrawY[noticks]
        \tkzDrawCircle[red,thick](C,c)
        \tkzDrawPoints(O,P,C,T1,T2)
        \tkzLabelPoints[below left](O,P,C)
        \tkzDrawSegment[cyan,thick](L1,L2)
        \tkzDrawCoordinates[smooth,cyan,thick](PA.PA)
        \tkzDrawSegments[violet,thick](P,T1 T1,C C,T2 T2,P)
    \end{tikzpicture}
\end{document}

image.png

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览