我想在平滑的循环中绘制法线和切线。到目前为止,我有以下内容:
正如您所看到的,正常情况下做得很好,但切线却不行,那么它的良好设置是什么?
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\begin{tikzpicture} %[allow upside down]
\draw plot [smooth cycle, tension=0.8] coordinates {(2.5,0) (0,0) (0,2) (3,2)}
node[sloped,inner sep=0cm,below,pos=0,
anchor=south west,
minimum height=1cm,minimum width=1cm](N){};
\path[->] (N.south west) edge node[left] {$\vec{ n}$} (N.north east);
\path[->] (N.south west) edge node[left] {$\vec{ t}$} (N.south east);
\end{tikzpicture}
\end{document}
答案1
如果不需要对曲线上的任意点执行此操作,您可以选择一个用于构造平滑曲线的点,然后使用三个后续的这样的点来导出切线和法线calc
:
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{calc}
\newcommand{\normtang}[3]{
\draw[->, red] (#2) -- ($(#1)!(#2)!(#3)!.5!(#2)$);
\draw[->, red] (#2) -- ($(#1)!(#2)!90:(#3)!.5!(#2)$);
}
\begin{document}
\begin{tikzpicture} %[allow upside down]
\path[font={\tiny}]
(2.5 , 0) coordinate (A)
(0 , 0) coordinate (B)
(0 , 2) coordinate (C)
(3 , 2) coordinate (D)
%...
;
\draw plot [smooth cycle, tension=0.8] coordinates {(A) (B) (C) (D)};
\normtang{D}{A}{B}
\normtang{A}{B}{C}
\normtang{B}{C}{D}
\normtang{C}{D}{A}
\end{tikzpicture}
\end{document}
这使:
答案2
这种方法不太令人满意,但它可以稍微伪造一点。
\documentclass[11pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\begin{document}
\begin{tikzpicture}
\draw plot [smooth cycle, tension=0.8] coordinates {(2.5,0) (0,0) (0,2) (3,2)}
node[sloped,inner sep=0cm,below,
anchor=center,draw, %% anchor changed. remove draw
minimum height=1cm,minimum width=1cm](N){};
\draw[->] (N.center) -- (N.north east) node[left=3pt] {$\vec{n}$};
\draw[->] (N.center) -- (N.south east) node[left=3pt] {$\vec{t}$};
\end{tikzpicture}
\end{document}
答案3
我不得不指出,使用 Asymptote 可以很容易地做到这一点;有一个dir(path,real)
命令可以在给定时间内为给定路径提供单位切向量。(例如,2 到 3 之间的路径时间给出用于构建它的第二个和第三个节点之间的路径上的点。)
\documentclass[margin=10pt]{standalone}
\usepackage{asymptote}
\begin{document}
\begin{asy}
unitsize(2cm);
path g = reverse((2.5,0)..tension 1.5 .. (0,0) .. (0,2) .. tension 1.5 .. (3,2) .. cycle);
draw(g);
real[] times = new real[] {0, 0.6, 0.9, 1.7, 2.9, 3.4};
for (real t : times) {
pair tangent = 0.7*dir(g,t);
pair normal = rotate(90)*tangent;
draw(shift(point(g,t)) * ((0,0)--tangent), arrow=Arrow(TeXHead), L="$\vec{t}$");
draw(shift(point(g,t)) * ((0,0)--normal), arrow=Arrow(TeXHead), L="$\vec{n}$");
}
\end{asy}
\end{document}