Относительно показанного 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
делает это за вас, по крайней мере, для ситуации, которую вы здесь описываете.