如何绘制三次 B 样条曲线

如何绘制三次 B 样条曲线

我想绘制二次和三次 B 样条曲线。 在此处输入图片描述 公式是 在此处输入图片描述

不幸的是,以下链接中的类似答案不起作用: 绘制具有条件基函数的递归定义函数集

我将非常感谢您的帮助。

答案1

Z 附带tikzmath库,允许人们递归定义函数。只需将其输入即可。在我的回答中,它使用了Christian Feuersänger 的精彩回答(顺便说一句,效果非常好),我使用了两种声明函数的方法:一种是 Christian 也使用的方法(尽管语法略有不同)用于定义N_{i1}=\chi,另一种是使用tikzmath。第二种方法允许递归定义函数。

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usetikzlibrary{math} % tikzmath, see p. 640 of the pgfmanual. 
\begin{document}
% based on https://tex.stackexchange.com/a/307032/121799
\def\tvalues{{0,1,3,4,6,9,10}}
\begin{tikzpicture}[evaluate={
        function myN(\i, \k, \t) {
            if \k == 1 then {
                return chi(\t,\i);
            } else {
                return myN(\i, \k-1, \t)*(\t-\tvalues[\i])/(\tvalues[\i+\k-1]-\tvalues[\i])
                +myN(\i+1, \k-1, \t)*(\tvalues[\i+\k]-\t)/(\tvalues[\i+\k]-\tvalues[\i+1]);
            };
        };
    },
declare function={chi(\t,\i)=and(\t >= \tvalues[\i] ,\t <=\tvalues[\i+1]);}]
\begin{axis}[samples=101,
    use fpu=false,
    xlabel=$x$,ylabel=$y$,
    ymax=2, ymin=0, xmin=0, xmax=10,
    domain=0:10,
    ] 
  \addplot [mark=none] {myN(2,1,x)}; 
  \addplot [mark=none,blue] {myN(2,2,x)}; 
  \addplot [mark=none,red] {myN(2,3,x)}; 
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

这也允许人们制作类似于您的屏幕截图的情节。

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\usetikzlibrary{math} % tikzmath, see p. 640 of the pgfmanual. 
\begin{document}
% based on https://tex.stackexchange.com/a/307032/121799
\def\tvalues{{-1,0,1,3,4,6,9,10,11,12,13}}
\tikzset{evaluate={
        function myN(\i, \k, \t) {
            if \k == 1 then {
                return chi(\t,\i);
            } else {
                return myN(\i, \k-1, \t)*(\t-\tvalues[\i])/(\tvalues[\i+\k-1]-\tvalues[\i])
                +myN(\i+1, \k-1, \t)*(\tvalues[\i+\k]-\t)/(\tvalues[\i+\k]-\tvalues[\i+1]);
            };
        };
    },
declare function={chi(\t,\i)=and(\t >= \tvalues[\i] ,\t <=\tvalues[\i+1]);}}

\begin{tikzpicture}
\begin{axis}[samples=101,
    use fpu=false,mark=none,
    xlabel=$x$,ylabel=$y$,
    ymax=pi/2, ymin=0, xmin=0, xmax=10,
    domain=0:10,
    ] 
  \addplot [mark=none] {myN(2,3,x)} node[pos=0.35,above] {$N_{23}$}; 
  \addplot+ [mark=none] {myN(3,3,x)} node[pos=0.51,above] {$N_{33}$}; 
  \addplot+ [mark=none] {myN(4,3,x)} node[pos=0.75,above] {$N_{43}$};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

顺便说一句,我认为你的问题从原则上来说相当不错。阻止我投票的原因是缺乏自己的尝试,以及对 Chritian Feuersänger 的好答案的令人恼火的声明。不过,如果你纠正了这个问题,我会考虑投票。

相关内容