我使用以下代码从点 a 和 o(从某个点出发的两条曲线上)绘制到 x 轴和 y 轴的切线。
点 strt 处的节点用于绘制其他曲线和直线;所以我需要从它开始画两条曲线。
是否有一个代码可以自动完成这个绘图,而不需要尝试从 x 和 y 轴上的不同点绘制线条,直到它们通过曲线上的指定点。
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{verbatim}
\usepackage{tikz}
\begin{document}
\begin{frame}[t]
\frametitle{tangent lines to x and y axes}
\begin{tikzpicture}[scale=1., transform shape]
\draw [thick] (0,0) -- (7,0);
\draw [thick] (0,0) -- (0,6);
\node at (2.5,2.) (strt){};
\draw [very thick, blue, looseness=.8] (strt.center) to [out=140,in=-80] node [pos=.3] (x){x} +(120.:3.cm) (strt.center) to [out=-40,in=170] node [pos=.25] (o){o} +(-20.:3.cm);
\draw [thick, red] (3.8,0) -- (0,5.2);
\draw [thick, red] (6.2,0) -- (0,3.2);
\end{tikzpicture}
\end{frame}
\end{document}
答案1
答案根据 Hany 的评论进行了更新,“我希望点 1 处的切线在 y 轴处结束,并且节点包含一些文本”。
有两种装饰tanget at
和tangent vector at
。主要的一种是前者,用于第 1 点和第 2 点。后者用于第 3 点,比较简单,表明 Ti 的意义钾Z 沿着曲线行进。
关于的一些评论tanget at
- 它有三个参数:
#1
是一个确定曲线上点的子单位浮点数;#2
是#3
乘法常数。 - 它在 处画一条切线(线段)
#1
。将其视为#1
以恒定速度描述曲线的时间坐标值。 - 切线的长度由两个乘法常数决定:
#2
表示负方向上切半线的长度(cm
默认为长度单位)。 同理#3
,但表示正方向上切半线的长度。 - 作为副作用,
tangent at
将以下名称设置为参与构造的点:
(point-k)
曲线上的点定义为#1
(tpoint-k)
切线上的点,使得(tpoint-k) - (point-k)
为正方向的单位切向量(另请参阅tangent vector at
)(A-k)
以及(B-k)
切线的端点。
整数k
代表 调用序列中点的索引tangent at
。在上图中k
为 1 或 2。
评论
你可以使用参数#2
和#3
来得到你想要的点处的切线#1
。然后使用(A-k)
和/或(B-k)
插入你需要的文本。(A-k)
在寻找完美的值之前,先画出点可能会更容易#2
。
代码
\documentclass[11pt, border=.4cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, math}
\usetikzlibrary{decorations.markings}
\begin{document}
\tikzset{
tangent vector at/.style={
decoration={
markings, % switch on markings
mark = at position #1 with {
\filldraw[red] (0, 0) circle (1.5pt) ++(0, 1.5ex)
node[scale=.8]
{\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}};
\draw[red, ->] (0, 0) -- (1, 0);
}
}, postaction=decorate
},
tangent at/.style args={#1;#2|#3}{%
decoration={
markings, % switch on markings
mark = at position #1 with {
\path (0, 0) coordinate
(point-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number});
\path (1, 0) coordinate (tpoint-%
\pgfkeysvalueof{/pgf/decoration/mark info/sequence number});
\filldraw[blue] (0, 0) circle (1.5pt) ++(0, 1.5ex)
node[scale=.8]
{\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}};
\draw[blue] (-#2, 0)
coordinate (A-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number})
-- (#3, 0)
coordinate (B-\pgfkeysvalueof{/pgf/decoration/mark info/sequence number});
}
}, postaction=decorate
}
}
\begin{tikzpicture}[every node/.style={scale=.8}]
\begin{scope}[gray, very thin, ->]
\draw (-1, 0) -- (5.5, 0) node[right] {$x$};
\draw (0, -1) -- (0, 3.5) node[above] {$y$};
\end{scope}
\draw[tangent at={.4; 1.92|2}, tangent at={.77; 1|1.1},
tangent vector at=.02]
(-1, 1) .. controls +(2, 2.3) and +(3, 3) .. ++(4.5, -1.5);
\filldraw (A-1) circle (1.5pt) node[above left] {Some text};
% a curve through the first point
\draw[red] (point-1) to[out=210, in=90] ++(0, -2);
\end{tikzpicture}
\end{document}
答案2
一个技巧(经过搜索,我认为这就是这个伎俩的起源) 绘制切线的方法是绘制一个具有和draw
的矩形节点,因此矩形实际上是一个线段。使用选项将把线绘制为切线。inner sep=0
minimum height=0
sloped
我设置了minimum width
以8cm
确保切线与轴相交。为了防止切线穿越我在坐标轴上clip
画了一个矩形scope
。
如果您想要x
和o
标记,您可以将它们添加为附加节点:\node at (x){x};
或者\node[blue, above right] at (x){x};
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\begin{scope} \clip(0,0)rectangle(7,6);
\node at (2.5,2.) (strt){};
\draw [very thick, blue, looseness=.8] (strt.center) to [out=140,in=-80]
node [pos=.3, sloped, inner sep=0, minimum height=0, minimum width=8cm, draw=red] (x){}
+(120.:3.cm) (strt.center) to [out=-40,in=170]
node [pos=.25, sloped, inner sep=0, minimum height=0, minimum width=8cm, draw=red] (o){} +(-20.:3.cm);
\end{scope}
\draw [thick] (0,0) -- (7,0);
\draw [thick] (0,0) -- (0,6);
\end{tikzpicture}
\end{document}
答案3
和tzplot
:
绘制给定曲线的切线:
\documentclass{standalone}
\usepackage{tzplot}
\begin{document}
\begin{tikzpicture}
\tzhelplines(8,7)
\tzaxes(8,7){$x$}{$y$}
\tzto[thick,blue,bend right=35]"curve"(1,5)(6,1){$u_0$}[r]
% clip: tangent lines extended to the axes
\begin{scope}
\settztangentlayer{main}
\clip (0,0) rectangle (8,7);
\tztangentat[semithick,red]{curve}{2}[0:5]
\tztangentat[semithick,red]{curve}{3}[0:6]
\tztangentat[dashed]{curve}{4}[0:8]
\end{scope}
\tzvXpointat*{curve}{2}(x)
\tzvXpointat{curve}{3}(o)
\tzdot(o)
\end{tikzpicture}
\end{document}