Построение кривой с использованием «функции построения графика» против кривой Безье (метод касательных)

Построение кривой с использованием «функции построения графика» против кривой Безье (метод касательных)

Относительно показанного MWE мне необходимо построить параболу со следующими свойствами:

  • Парабола начинается в точке «А».
  • Парабола заканчивается в точке «B».
  • Вершина параболы находится в точке «F».
  • «AE» касается параболы в точке «A»
  • «BE» касается параболы в точке «B»
  • «II» касается параболы в точке «F»

Я построил эту параболу тремя способами:

  • Функция графика: правильная — та, что в пурпурной линии
  • Кривая Безье с 2 контрольными точками, где определены только начальная и конечная точки (красная кривая)
  • Кривая Безье с двумя контрольными точками, где определены начальная и конечная точки, а также вершина параболы (синяя кривая).

Проблема в том, как нарисовать параболу, используя метод касательных (контрольные точки, кривая Безье...), чтобы получить тот же результат, что и с помощью функции plot, поскольку я не всегда могу получить функцию кривой. Короче говоря:

  • Используя знание касательных и показанных контрольных точек: Как можно нарисовать кривую, используя метод кривых Безье (...контроллеры...), чтобы результат был таким же, как пурпурная кривая, полученная с помощью «функции построения графика» (которая является правильной)?
  • Если я знаю, что углы в точках (A) и (B) равны (14,036243468) градусов и (82,874983651) градусов соответственно (горизонтальная линия: угол = 0) (углы могут немного отличаться, это сделано только для того, чтобы подчеркнуть процесс), как я могу определить угол касательных, если я также знаю углы?
\documentclass{article}
\usepackage{amsmath} 
\usepackage{tikz}


\begin{document}


\begin{figure}[!htbp]
\begin{center}
\begin{tikzpicture}


%%%%%%%%%%%%%%GRID%%%%%%%%%%%%%%%%%%%%%%%%

\draw[help lines,step=0.5](0,2) grid(12,25);


\coordinate (a1) at (0,12.5);
\node[circle,inner sep=2pt,fill=none, draw=black] at (a1) (a1) {A};

\coordinate (b1) at (12,12.5);
\node[circle,inner sep=2pt,fill=none, draw=black] at (b1) (b1) {B};

\draw  [very thick] (a1) -- (b1);

\coordinate (V1) at (2*12/3,12.5-0.1*32);
\node[circle,inner sep=2pt,fill=none, draw=black] at (V1) (V1) {E};

\draw [dashed] (a1) -- (V1);
\draw [dashed] (V1) -- (b1);

\coordinate (ZS1) at (12/3^0.5,12.5-0.1*18.475);
\node[circle,inner sep=2pt,fill=none, draw=black] at (ZS1) (ZS1) {F};


\coordinate (V2L) at (0,12.5-0.1*18.475);
\node[circle,inner sep=2pt,fill=none, draw=black] at (V2L) (V2L) {I};

\coordinate (V2'L) at (04.6188,12.5-0.1*18.475);
\node[circle,inner sep=2pt,fill=none, draw=black] at (V2'L) (V2'L) {C};

\coordinate (V2R) at (12,12.5-0.1*18.475);
\node[circle,inner sep=2pt,fill=none,draw=black] at (V2R) (V2R) {I};


\coordinate (V2'R) at (12-2.3094,12.5-0.1*18.475);
\node[circle,inner sep=2pt,fill=none,draw=black] at (V2'R) (V2'R) {B};

\draw[dashed] (V2L) -- (V2R);

%RED CURVE
\draw[very thick,color=red] (a1) .. controls (V2'L) and  (V2'R) .. (b1);

%BLUE CURVE
\draw[very thick,color=blue] (a1) .. controls (V2'L) .. (ZS1) ..  controls (V2'R).. (b1);

%plot the function
\begin{scope}[shift={(0,12.5)}]
\draw[very thick,color=magenta, domain=0:12] plot (\x, {0.1*-(2*-1)*pow(\x,3)/(6*12)+\x*12*0.1*(2*-1)/6});
\end{scope}

\end{tikzpicture}
\end{center}
\end{figure} 
\end{document}

введите описание изображения здесь

решение1

Это более или менее взято из hobbyруководства.

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{hobby}
\begin{document}
\begin{tikzpicture}[tangent/.style={%
in angle={(180+#1)} ,
Hobby finish ,
designated Hobby path=next , out angle=#1,
}]
\draw[color=magenta,ultra thick, domain=0:12] plot 
(\x, {0.1*-(2*-1)*pow(\x,3)/(6*12)+\x*12*0.1*(2*-1)/6});

\draw[thick,use Hobby shortcut] ([tangent=-22]0,0) .. ([tangent=0]7,-1.85) .. 
([tangent=38]12,0);

\end{tikzpicture}
\end{document}

введите описание изображения здесь

И это стиль, который использует hobbyбиблиотеку для построения пути из входных данных: начальной точки, конечной точки, вершины и точки, определяющей наклоны.

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{calc,hobby}
\begin{document}
\begin{tikzpicture}[tangent/.style={%
    in angle={(180+#1)} ,
    Hobby finish ,
    designated Hobby path=next , out angle=#1},
   para/.code={\tikzset{/tikz/params/.cd,#1}
     \def\pv##1{\pgfkeysvalueof{/tikz/params/##1}}
     \tikzset{use Hobby shortcut,insert path={let \p1=($(\pv{S})-(\pv{start})$),
        \p2=($(\pv{end})-(\pv{S})$),\n1={atan2(\y1,\x1)},\n2={atan2(\y2,\x2)} in 
        ([tangent=\n1]\pv{start}) .. ([tangent=0]\pv{tip}) .. ([tangent=\n2]\pv{end})
        }}
   },params/.cd,start/.initial={-1,0},end/.initial={1,0},
    tip/.initial={0,-1},S/.initial={0,-2}]
 % define the coordinates in an intuitive way   
 \path (0,0) coordinate (A) (12,0) coordinate (B)
 (2*12/3,-0.1*32) coordinate (E)
 (12/3^0.5,-0.1*18.475) coordinate (F);
 % your plot 
 \draw[color=magenta,ultra thick, domain=0:12] plot 
    (\x, {0.1*-(2*-1)*pow(\x,3)/(6*12)+\x*12*0.1*(2*-1)/6});
 % your tangents
 \draw[dashed] (A) -- (E) (B) -- (E);
 % hobby-based path
 \draw[thick,para={start=A,end=B,tip=F,S=E}];
 % label the points
 \path foreach \X in {A,B,E,F}
 {(\X) node[circle,fill,inner sep=1pt,label=below:{$\X$}]{}};
\end{tikzpicture}
\end{document}

введите описание изображения здесь

Обратите внимание, что кубическая кривая Безье имеет 8 параметров. 3 из них — два параметра переноса и один угол. Таким образом, у вас есть 5 параметров, которые можно использовать для характеристики кривой. Вы можете работать в обратном направлении, чтобы построить вышеуказанную кривую, но hobbyделает это за вас, по крайней мере, для ситуации, которую вы здесь описываете.

Связанный контент