c语言打印贝塞尔曲线坐标(三阶)

作者: 菠萝头咯 | 来源:发表于2019-02-17 22:12 被阅读2次

    贝塞尔曲线

    贝塞尔曲线(Bézier curve),是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝赛尔曲线由线段节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等,模拟鼠标移动轨迹过验证码的时候也会用到。


    屁话不多说 直接上代码鸭!

    控制点控制曲线

    #include<stdio.h>

    typedef struct Point

    {

        int x;

        int y;

    }Point;

    int main()

    {

        Point p0, p1, p2, p3 ,pot;//起始点 控制点1 控制点2 终止点3 绘制点

        float k,b;//斜率 和 截距

        p0.x = 100;//比如这是起始点x

        p0.y = 400;//比如这是起始点y

        p1.x = 100;//控制点坐标可以随便整数

        p1.y = 800;//控制点坐标可以随便整数

        p2.x = 800;//控制点坐标可以随便整数

        p2.y = 100;//控制点坐标可以随便整数

        p3.x = 1100;//比如这是起终点x

        p3.y = 600;//比如这是起终点y

        printf("打印控制点坐标p1=%d,%d    p2=%d,%d\n",p1.x,p1.y,p2.x,p2.y);

        float  t = 0.01;//曲线参数t

        float temp = 1 - t;

        printf("输出轨迹\nx = [");

        for(t=0;t<1;t+=0.01)

        {

            temp = 1 - t;

            pot.x = p0.x * temp * temp * temp + 3 * p1.x * t * temp * temp + 3 * p2.x * t * t * temp + p3.x * t * t * t;

            printf("%d,",pot.x);

        }

        printf("]\ny = [");

        for(t=0;t<1;t+=0.01)

        {

            temp = 1 - t;

            pot.y = p0.y * temp * temp * temp + 3 * p1.y * t * temp * temp + 3 * p2.y * t * t * temp + p3.y * t * t * t;

            printf("%d,",pot.y);

        }

        printf("]\n");

        return 0;

    }


    还有模拟鼠标行为的轨迹代码 每次坐标会不一样

    /*

        模拟鼠标移动轨迹

    */

    #include<stdio.h>/

    #include<stdlib.h>

    #include<time.h>

    typedef struct Point

    {

        int x;

        int y;

    }Point;

    int main()

    {

        srand(time(NULL));

        Point p0, p1, p2, p3 ,pot;//起始点 控制点1 控制点2 终止点3 绘制点

        float k,b;//斜率 和 截距

        p0.x = 100;//比如这是起始点x

        p0.y = 400;//比如这是起始点y

        p1.x = rand()%1399;//控制点坐标可以随便整数

        p1.y = -1;//控制点坐标可以随便整数

        p2.x = rand()%1399;//控制点坐标可以随便整数

        p2.y=-1;//控制点坐标可以随便整数

        p3.x = 1100;//比如这是起终点x

        p3.y = 600;//比如这是起终点y

        k = (p3.y*1.0-p0.y*1.0)/(p3.x*1.0-p0.x*1.0);

        b = p0.y*1.0 - k * p0.x*1.0;

        //printf("k,b = %f, %f\n",k,b);

        while(p1.y>1399 || p1.y<0){//改变控制点的y值不要偏的太离谱 可以改动300越小波动越小

            p1.y = k*p1.x*1.0+b+(rand()%300-150)*1.0;

            //printf("打印控制点坐标p1.x = %d  p1.y = %d %f \n",p1.x,p1.y,k*p1.x*1.0+b);

        }

        while(p2.y>1399 || p2.y<0){

            p2.y = k*p2.x*1.0+b+(rand()%300-150)*1.0;

            //printf("p2.x = %d  p2.y = %d %f \n",p2.x,p2.y,k*p1.x*1.0+b);

        }

        printf("打印控制点坐标p1=%d,%d    p2=%d,%d\n",p1.x,p1.y,p2.x,p2.y);

        float  t = 0.01;//曲线参数t

        float temp = 1 - t;

        printf("输出轨迹\nx = [");

        for(t=0;t<1;t+=0.01)

        {

            temp = 1 - t;

            pot.x = p0.x * temp * temp * temp + 3 * p1.x * t * temp * temp + 3 * p2.x * t * t * temp + p3.x * t * t * t;

            printf("%d,",pot.x);

        }

        printf("]\ny = [");

        for(t=0;t<1;t+=0.01)

        {

            temp = 1 - t;

            pot.y = p0.y * temp * temp * temp + 3 * p1.y * t * temp * temp + 3 * p2.y * t * t * temp + p3.y * t * t * t;

            printf("%d,",pot.y);

        }

        printf("]\n");

        return 0;

    }

    还有

    图用python画了 ,c语言太麻烦了 就直接打印坐标啦 凑活看吧 嘻嘻嘻 不服来找我 我家住番斗大街番斗花园2号楼1001室, 我爸叫胡英俊,我妈叫张小丽, 我叫胡图图

    相关文章

      网友评论

        本文标题:c语言打印贝塞尔曲线坐标(三阶)

        本文链接:https://www.haomeiwen.com/subject/ogebjqtx.html