获取贝塞尔曲线上的100个点

#include <stdio.h>


typedef struct

{

    float x;

    float y;

}Point2D;


void ComputeBezier (Point2D *cp, int numberOfPoints, Point2D *curve);


int main(int argc, const char * argv[])

{

    Point2D cp[] = {{10,100},{30,20},{120,20},{200,100}};

    int number = 100;

    Point2D curve[number];

    

    ComputeBezier(cp, number, curve); //因为是数组,所以不用加星号。

    

    for (int i=0; i<number; i++) {

        printf("curve[%d].x=%f,curve[%d].y=%f\n",i,curve[i].x,i,curve[i].y);

    }

    

    return 0;

}


Point2D PointOnCubicBezier (Point2D *cp, float t)

{

    float ax, bx, cx;

    float ay, by, cy;

    float tSquared, tCubed;

    Point2D result;

    

    /*計算多項式係數*/

    

    cx = 3.0 * (cp[1].x - cp[0].x);

    bx = 3.0 * (cp[2].x - cp[1].x) - cx;

    ax = cp[3].x - cp[0].x - cx - bx;

    

    cy = 3.0 * (cp[1].y - cp[0].y);

    by = 3.0 * (cp[2].y - cp[1].y) - cy;

    ay = cp[3].y - cp[0].y - cy - by;

    

    /*計算位於參數值t的曲線點*/

    

    tSquared = t * t;

    tCubed = tSquared * t;

    

    result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;

    result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;

    

    return result;

}


void ComputeBezier (Point2D *cp, int numberOfPoints, Point2D *curve)

{

    float   dt;

    int     i;

    

    dt = 1.0 / ( numberOfPoints - 1 );

    

    for( i = 0; i < numberOfPoints; i++)

        curve[i] = PointOnCubicBezier( cp, i*dt );

}


新建一个c工程可以直接运行。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值