使用C语言绘制三次B样条曲线段

题目

编写程序,给定四个控制点,绘制三次B样条曲线段。并自己设计图形,给定多个控制点,编写程序绘制B-样条曲线构造图形。

程序

#include
#include
#include
#include
void b(int c, float p[4][2])
{
	int rate = 100, x, y;//x表示b样条曲线中每个点的横坐标。y表示b样条曲线中每个点的纵坐标
	float t, t2, t3;
	setcolor(c);
	//计算每个点的位置
	for (t = 0; t <= 1; t += 1.0 / rate)
	{
		t2 = pow(t,2);
		t3 = pow(t,3);
		//b样条计算公式
		x = ((1 - 3 * t + 3 * t2 - t3) * p[0][0] + (4 - 6 * t2 + 3 * t3) * p[1][0] + (1 + 3 * t + 3 * t2 - 3 * t3) * p[2][0] + t3 * p[3][0]) / 6;
		y = ((1 - 3 * t + 3 * t2 - t3) * p[0][1] + (4 - 6 * t2 + 3 * t3) * p[1][1] + (1 + 3 * t + 3 * t2 - 3 * t3) * p[2][1] + t3 * p[3][0]) / 6;
		if (t == 0) moveto(x, y);
		lineto(x, y);
	}
}
void main()
{
	int i;
	float p[4][2];
	printf("请输入第一个点的横坐标\n");
	scanf_s("%f", &p[0][0]);
	printf("请输入第一个点的纵坐标\n");
	scanf_s("%f", &p[0][1]);
	printf("请输入第二个点的横坐标\n");
	scanf_s("%f", &p[1][0]);
	printf("请输入第二个点的纵坐标\n");
	scanf_s("%f", &p[1][1]);
	printf("请输入第三个点的横坐标\n");
	scanf_s("%f", &p[2][0]);
	printf("请输入第三个点的纵坐标\n");
	scanf_s("%f", &p[2][1]);
	printf("请输入第四个点的横坐标\n");
	scanf_s("%f", &p[3][0]);
	printf("请输入第四个点的纵坐标\n");
	scanf_s("%f", &p[3][1]);
	initgraph(1000, 2000);
	setbkcolor(15);
	cleardevice();
	setcolor(BLUE);
	moveto(p[0][0], p[0][1]);
	for (i = 1; i <= 3; i++)
	{
		lineto(p[i][0], p[i][1]);
	}
	b(LIGHTRED, p);
	_getch();
}

结果

使用C语言绘制三次B样条曲线段_第1张图片
本题考察的知识为B样条曲线
使用C语言绘制三次B样条曲线段_第2张图片
使用C语言绘制三次B样条曲线段_第3张图片

你可能感兴趣的:(C语言基础)