📄 bezier.c
字号:
#include "Conio.h"
#include "graphics.h"
#define closegr closegraph
#define X 0
#define Y 1
#define MAX 100
typedef float Vector[2];
/*-------------------三次Bezier曲线的矩阵表示及生成-----------------------*/
void DisplayCubicBezierCurve1(Vector P[4],int count)
{
float C[2][4],t,deltat;
Vector V,newV;
int i,j;
for(j=0;j<2;j++)
{
C[j][0]=P[0][j];
C[j][1]=-3*P[0][j]+3*P[1][j];
C[j][2]=3*P[0][j]-6*P[1][j]+3*P[2][j];
C[j][3]=-P[0][j]+3*P[1][j]-3*P[2][j]+P[3][j]; ;
}
V[X]=P[0][X],V[Y]=P[0][Y];
deltat=1.0/count;
t=0.0;
for(i=1;i<=count;i++)
{
t+=deltat;
newV[X]=C[X][0]+t*(C[X][1]+t*(C[X][2]+t*C[X][3]));
newV[Y]=C[Y][0]+t*(C[Y][1]+t*(C[Y][2]+t*C[Y][3]));
line(V[X],V[Y],newV[X],newV[Y]);
V[X]=newV[X],V[Y]=newV[Y];
}
}
/*------------------de casteljau算法-----------------------*/
void BezierCurveDeCasteljau(Vector P[4],int n,float t,Vector V)
{
Vector R[MAX];
int r,i;
float s;
for(i=0;i<=n;i++)
{
R[i][X]=P[i][X];
R[i][Y]=P[i][Y];
}
s=1.0-t;
for(r=1;r<=n;r++)
{
for(i=0;i<=n-r;i++)
{
R[i][X]=s*R[i][X]+t*R[i+1][X];
R[i][Y]=s*R[i][Y]+t*R[i+1][Y];
}
V[X]=R[0][X];V[Y]=R[0][Y];
}
}
void initgr(void) /* BGI初始化 */
{
int gd=DETECT,gm=0; /* 和gd=VGA,gm=VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd,&gm,"");
}
main()
{
Vector P[4],Q[4],V;
float t;
P[0][X]=600;P[0][Y]=100;
P[1][X]=300;P[1][Y]=200;
P[2][X]=200;P[2][Y]=400;
P[3][X]=100;P[3][Y]=400;
Q[0][X]=550;Q[0][Y]=150;
Q[1][X]=450;Q[1][Y]=350;
Q[2][X]=300;Q[2][Y]=450;
Q[3][X]=150;Q[3][Y]=450;
initgr(); /* BGI初始化 */
setcolor(RED);
line(P[0][X],P[0][Y],P[1][X],P[1][Y]);
line(P[1][X],P[1][Y],P[2][X],P[2][Y]);
line(P[2][X],P[2][Y],P[3][X],P[3][Y]);
setcolor(GREEN);
DisplayCubicBezierCurve1(Q,10000);
setcolor(BLUE);
putpixel(P[0][X],P[0][Y],BLUE);
outtextxy(P[0][X],P[0][Y],"P0");
putpixel(P[1][X],P[1][Y],BLUE);
outtextxy(P[1][X],P[1][Y],"P1");
putpixel(P[2][X],P[2][Y],BLUE);
outtextxy(P[2][X],P[2][Y],"P2");
putpixel(P[3][X],P[3][Y],BLUE);
outtextxy(P[3][X],P[3][Y],"P3");
for(t=0.0;t<=1;t+=0.0001)
{
BezierCurveDeCasteljau(P,3,t,V);
putpixel(V[X],V[Y],WHITE) ;
}
getch(); /* 暂停一下,看看前面绘图代码的运行结果 */
closegr(); /* 恢复TEXT屏幕模式 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -