主にゲーム用のリアルタイムなアニメーション補間のために
0<=x<=1の範囲でf(0)=0,f(1)=1となり、斜め軸(y=1-x)で線対称になる式がほしいです
条件は
y=1-x上の通過点を1点指定し、
A(0,0)で傾き真上、(1,1)で傾き真右、の場合
B(0,0)で傾き真右、(1,1)で傾き真上、の場合
の2パターンの式がほしいです
画像を添付しておきます
また、計算速度に関する問題や妥協点などあれば教えていただけると助かります
(円の方程式に指数を与えるとかなり近いのですが、内側に変化させられないため断念しました)
C++での実装を想定しています
よろしくお願いいたします
追記です
図では紫のグラフ(条件A)の点を掴んでいますが、これがy=xをまたぐ際に緑(条件B)の方に切り替えて使用します
またアニメーション用途のため、xは時間を表していて線形変化を緩急のある変化に変えるために使います
(例としてスケール初期値100%~終端200%として線形ではなくいきなり180%くらいまでデカくなったのちゆっくりに落ち着くといった動きなどを表現)
そのためyの範囲は0~1で収まるものを想定しています
S字型のカーブをさせるための情報は
http://marupeke296.com/TIPS_No19_interpolation.html
が参考になったのですが今回のお椀型?の仕様に合う情報が欲しいです
更に追記
下記コードにて出力した点をプロットしたものが下記画像となります
a=0.1(緑)
a=0.25(赤)
a=0.4(水)
これが傾きの要件をみたしているのかはわからないのですが、これを線形補間で使えばもう十分かな感はあります
ただ、ソースのコメントにあるように分割時の右半分のYを求める係数がわからないため中央付近が異常に荒くなっています
struct f2 { float m_x; float m_y; }; f2 outf2[20]; int numout=0; void saiki(int div, f2 v0, f2 v1, float a) { if(div){ float sax = v1.m_x - v0.m_x;//差x float say = v1.m_y - v0.m_y;//差y f2 center_vec; center_vec.m_x = v0.m_x + sax*0.5f; //xは中間 center_vec.m_y = v0.m_y + say*(1.f-a); //yは1-aでブレンド saiki(div-1, v0, center_vec, a);//左半分の再帰呼び出し outf2[numout++] = center_vec; //motomu(div-1, center_vec, v1, a);//右側分割が上手く行かない } else{ return; } } void func() { float a = 0.25f;//掴んでいる点のx座標 f2 v0 = {0.f, 0.f};//原点 f2 v1 = {a, 1.f-a};//y=x上の点 saiki(5, v0, v1, a); outf2[numout++] = v1; //ここで出したoutf2は半分だけなのであとは手作業で鏡面写し }
回答7件
あなたの回答
tips
プレビュー