C++でベジェ曲線のソースコード

bezier-code.png

アンカーポイントで傾き0でつなげてくれるベジェ曲線
曲線の山のとんがり具合はsun_intervalで調整してね★

void Bezeir(const vec2<float> _anchors[5],const float _time,unsigned char* _dst){
    //sun_intervalは制御点までの距離
    static float bezier_ratio=0.0f;//1.0-0.0のどの位置にあるのか
    static vec2<float> p0,p1,p2,p3,p10,p11,p12,p20,p21,p30;
    static float sun_interval=3.0;//制御点までの距離
        int topsat_index=floor(_time/6.0f);
        p0=_anchors[topsat_index];
        p1.set(_anchors[topsat_index].x+sun_interval,_anchors[topsat_index].y);
        p2.set(_anchors[(topsat_index+1)%4].x-sun_interval,_anchors[(topsat_index+1)%4].y);
        p3=_anchors[(topsat_index+1)%4];
        //step1 points
        bezier_ratio=_time/6.0f-(float)topsat_index;
        p10=(p0*(1.0f-bezier_ratio))+(p1*bezier_ratio);
        p11=(p1*(1.0f-bezier_ratio))+(p2*bezier_ratio);
        p12=(p2*(1.0f-bezier_ratio))+(p3*bezier_ratio);
        //step2 points
        p20=(p10*(1.0-bezier_ratio))+(p11*bezier_ratio);
        p21=(p11*(1.0-bezier_ratio))+(p12*bezier_ratio);
        //step3
        p30=(p20*(1.0-bezier_ratio))+(p21*bezier_ratio);
        *_dst=(unsigned char)(p30.y);
}

サポートサイト Wikidot.com