⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 medit贝齐尔曲线.c

📁 用c语言编写的贝齐尔曲线
💻 C
字号:
#include "graphics.h"
#include "stdio.h"
float Bkn();
void main(void)
{
	typedef struct
	{
		float x; /* 点的横坐标 */
		float y; /* 点的纵坐标 */
	}point_type;
	point_type* point;
	int point_num,i,gdriver=DETECT,gmode=IBM8514HI,errorflag,k;
	char ch;
	float xx,yy,m=100.0,temp;
	do
	{
	/* do--while循环用来输入点数,并进行有效性检查*/
	do
	{
		printf("Please input the number of the points(>=1):\n");
		scanf("%d",&point_num);
		if(point_num<1)
			printf("The number you have input is invalid,please try again.\n");
	}while(point_num<1);
	/* 下面的malloc函数用来动态分配内存空间 */
	point=(point_type*)malloc(point_num*sizeof(point_type));
	/* 下面的for循环用来输入点的坐标。由于程序设置了坐标变换
	功能,用户只需把一般的坐标输入即可,不必考虑屏幕坐标*/
    printf("Please input the coordinate of the %d points:\n",point_num);
	for(i=0;i<point_num;i++)
	{   
		scanf("%f",&temp);
		point[i].x=temp;
		scanf("%f",&temp);
		point[i].y=temp;
	}
	/* 下面初始化图形系统,并进行错误检查*/
	initgraph(&gdriver,&gmode,"c:\\turboc2");
	errorflag=graphresult();
	if(errorflag!=grOk)
	{
		printf("fail to initialze the graphics.\n%s\n",grapherrormsg(errorflag));
		printf("Press any key to halt:");
		getch();
		exit(1);
	}
	/* 为了得到最佳的观察效果,将背景、坐标轴、控制多边形、Bezier曲线设置成不同的颜色*/
	setbkcolor(WHITE);
	setcolor(RED);
	line(50,240,550,240);
	line(320,50,320,430);
	setcolor(BLUE);
	/* 下面的for循环用来画控制多边形 */
	for(i=0;i<point_num;i++)
	{
		xx=point[i].x*100+320;
		yy=240-point[i].y*100;
		if(i==0)
			moveto(xx,yy);
		else
			lineto(xx,yy);
	}




	/* 下面的for循环用来画Bezier曲线 */
	setcolor(LIGHTGREEN);
	for(i=0;i<=(int)m;i++)
	{
		xx=0;
		yy=0;
		for(k=0;k<point_num;k++)
		{
			xx+=point[k].x*Bkn(point_num-1,k,i/m);
			yy+=point[k].y*Bkn(point_num-1,k,i/m);
		}
	/*  下面的两句用来将一般的坐标变换成屏幕坐标*/
		xx=xx*100+320;
		yy=240-yy*100;
		if(i==0)
			moveto(xx,yy);
		else
			lineto(xx,yy);
	}
	getch();
	closegraph();
	/* 询问用户是否继续 */
	printf("Continue(Y/N):");
	ch=getchar();
	ch=getchar();
    }while(ch=='Y' || ch=='y');
}
 
/* Bkn函数用来计算n次Bernstein多项式的基函数*/
float Bkn(n,k,t)
int n,k;
float t;
{
	int i;
	float temp_t=1.0,temp_n=1.0,temp_tt=1.0;
	for(i=1;i<=k;i++)
		temp_t*=t/i;
	for(i=n-k+1;i<=n;i++)
		temp_n*=i;
	for(i=1;i<=(n-k);i++)
		temp_tt*=(1-t);
	return(temp_n*temp_t*temp_tt);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -