在另一个问题中(见这里) 我问的是怎样将曲线的控制点放在特定曲线点的切线上。虽然给出的答案对于特定的点排列很有帮助,但我希望有一个更通用的解决方案来解决该问题。对我来说,重要的是曲线在任何给定点都不会改变方向。请考虑以下示例:
\documentclass[border=5pt,tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through}
\tikzset{point/.style={circle,inner sep=0pt,minimum size=3pt,fill=red}}
\begin{document}
\begin{tikzpicture}
\coordinate [label=left:$A$] (A) at (0,0);
\coordinate [label=left:$B$] (B) at (-.2,3);
\coordinate [label=left:$C$] (C) at (-.7,7);
\draw[thin,blue] plot [smooth] coordinates { (A) (B) (C) };
\node[point] at (A) {};
\node[point] at (B) {};
\node[point] at (C) {};
\end{tikzpicture}
\end{document}
这将生成一条通过点 A、B 和 C 的平滑曲线,如下图所示:
但是,我希望曲线以 90 度角离开 A 点,以 -45 度角到达 C 点,并顺利穿过 B 点在任何给定点都不会改变方向。因此,在这个例子中,曲线应该始终继续向左转。将上面的 \draw 语句更改为此
\draw[thin,green] (A) .. controls +(90:.3) and +(-85:.2) .. (B) .. controls +(95:.2) and +(-45:.3) .. (C);
产生接近我需要的曲线。
但是,我必须猜测 B 周围两个控制点的角度。从上面的蓝色图中,我发现这些角度分别接近 -85 和 95。但我宁愿计算这些角度,而不是目测它们。
那么有没有办法通过 B 确定贝塞尔曲线的输入和输出角度,以便曲线不会在任何地方改变其方向?
答案1
以下是使用hobby
包裹来自使用 Metapost 和 TikZ 通过一系列点绘制曲线。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/309388/86}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,hobby}
\tikzset{point/.style={circle,inner sep=0pt,minimum size=3pt,fill=red}}
\begin{document}
\begin{tikzpicture}[use Hobby shortcut]
\coordinate [label=left:$A$] (A) at (0,0);
\coordinate [label=left:$B$] (B) at (-.2,3);
\coordinate [label=left:$C$] (C) at (-.7,7);
\draw[thin,blue] plot [smooth] coordinates { (A) (B) (C) };
\node[point] at (A) {};
\node[point] at (B) {};
\node[point] at (C) {};
\draw[thin,green,out angle=90,in angle=-45] (A) .. (B) .. (C);
\draw[thin,red] (A) .. (B) .. (C);
\end{tikzpicture}
\end{document}
得出的结果为:
我不知道曲线上的坐标存在问题(如评论中所述)。我必须仔细研究一下才能知道发生了什么。