题目
编写程序,给定四个控制点,绘制三次B样条曲线段。并自己设计图形,给定多个控制点,编写程序绘制B-样条曲线构造图形。
程序
#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<stdio.h>
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();
}
结果
本题考察的知识为B样条曲线