贝塞尔曲线
贝塞尔曲线(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室, 我爸叫胡英俊,我妈叫张小丽, 我叫胡图图
网友评论