「プロット関数」を使用した曲線のプロットとベジェ曲線(接線法)の比較

「プロット関数」を使用した曲線のプロットとベジェ曲線(接線法)の比較

示された MWE に関しては、次の特性を持つ放物線をプロットする必要があります。

  • 放物線は点「A」から始まります。
  • 放物線は点「B」で終わります。
  • 放物線の頂点は点「F」にあります
  • 「AE」は点「A」で放物線に接する
  • 「BE」は点「B」で放物線に接する
  • 「II」は点「F」で放物線に接する

私は次の 3 つの方法を使用してこの放物線をプロットしました。

  • プロット機能: マゼンタ色の線で示されたものが正解です
  • 開始点と終了点のみが定義されている 2 つの制御点を持つベジェ曲線 (赤い曲線)
  • 2 つの制御点を持つベジェ曲線。ここでは、放物線の始点と終点、およびピークが定義されます (青い曲線)。

問題は、曲線の関数を常に取得できるとは限らないため、プロット関数で達成されるのと同じ結果を得るために、接線法 (制御点、ベジェ曲線など) を使用して放物線を描くにはどうすればよいかということです。つまり、簡単に言うと次のようになります。

  • 示されている接線と制御点の知識を通じて、ベジェ曲線法 (... コントロール ...) を使用して、結果が「プロット関数」によって取得されるマゼンタ曲線 (正しいもの) と同じになるように曲線を描くにはどうすればよいですか。
  • (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}

ここに画像の説明を入力してください

3 次ベジェ曲線には 8 つのパラメータがあることに注意してください。そのうち 3 つは、2 つの移動パラメータと 1 つの角度です。つまり、曲線を特徴付けるために使用できるパラメータは 5 つあります。上記の曲線を逆方向に構築することもできますが、hobby少なくともここで説明している状況では、 が自動的にそれを行います。

関連情報