计算机辅助设计5.2

1、题目:根据以下Bezier控制顶点,取△t=0.01,按照线性计算方法,编制程序计算曲线上的点,并绘制出曲线和控制多边形。要求打印程序、图。
34.4507 64.8979 92.7423
53.2133 62.9103 78.7443
72.6174 58.5389 64.6679
90.4922 53.8726 51.7908
107.6262 50.2527 40.0300
124.3115 48.5382 29.7099

2、首先贴一个帖子来讲述一下贝塞尔三次拟合的原理,http://www.cnblogs.com/caster99/p/4743637.html

3、然后我们按老方法将数据点保存在一个名为“2.txt”的文档中,开始码代码。

#define _CRT_SECURE_NO_DEPRECATE		//防止容器越界报错
#include<iostream>
#include<vector>
#include <GL/glut.h>		//使用OPENGL;
#include<iomanip>
using namespace std;
struct point
{
	GLfloat x, y, z;
};

GLint winWidth = 600, winHeight = 600; //定义窗口大小
GLfloat x0 = 0.0, b0 = 0.0, z0 = 100.0;
GLfloat xref = 0.0, yref = 0.0, zref = 0.0; // Look-at point.视点
GLfloat Vx = 0.0, Vy = 1.0, Vz = 0.0; // View-up vector
GLfloat xwMin = 0.0, ywMin = 0.0, xwMax = 150.0, ywMax = 150.0;
GLfloat dnear = 0.0, dfar = 100.0;
vector<point>P;		//直接定义为全局参数,免去传参的麻烦(其实是本人不会传参hhh)
vector<point>Q;
void init(void)
{
	glClearColor(1.0, 1.0, 1.0, 0.0); //Set display window to white 视窗背景颜色
	glMatrixMode(GL_MODELVIEW); //Set projectio parameters 项目参数
	gluLookAt(x0, b0, z0, xref, yref, zref, Vx, Vy, Vz);
	glMatrixMode(GL_PROJECTION); //设置投影变换
	glOrtho(xwMin, xwMax, ywMin, ywMax, dnear, dfar);
}
void show()
{
	glClear(GL_COLOR_BUFFER_BIT); // Show the clolor with display window color
	glColor3f(1.0, 0.0, 0.0); // 物体颜色red
	
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glLineWidth(2.0);
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i < Q.size(); i++) {
		glVertex3f(Q[i].x, Q[i].y, Q[i].z);
	}
	glEnd();
	glColor3f(0.0, 0.0, 1.0); // 物体颜色blue
	glBegin(GL_LINE_STRIP);
	for (int i = 0; i < P.size(); i++) {
		glVertex3f(P[i].x, P[i].y, P[i].z);
	}
	glEnd();
	glFlush();
}
int main(int argc,char** argv)
{
	point pt;
	vector<point>::iterator it;
	int num = 0;
	float t = 0.01;
	FILE *fp;
	fp = fopen("2.txt", "r");		//将所有的数据点都保存在这个txt文档里
	while (!feof(fp)) {
		fscanf_s(fp, "%f %f %f", &pt.x, &pt.y, &pt.z);
		Q.push_back(pt);
		num++;
	}
	fclose(fp);
	/*计算控制点坐标*/
	for (int i = 0; i < num - 3; i++) {
		pt.x = Q[i].x * pow(1 - t, 3) + Q[i + 1].x * 3 * t*pow(1 - t, 2) + Q[i + 2].x * 3 * pow(t, 2)*(1 - t) + Q[i + 3].x * pow(t, 3);
		pt.y = Q[i].y * pow(1 - t, 3) + Q[i + 1].y * 3 * t*pow(1 - t, 2) + Q[i + 2].y * 3 * pow(t, 2)*(1 - t) + Q[i + 3].y * pow(t, 3);
		pt.z = Q[i].z * pow(1 - t, 3) + Q[i + 1].z * 3 * t*pow(1 - t, 2) + Q[i + 2].z * 3 * pow(t, 2)*(1 - t) + Q[i + 3].z * pow(t, 3);
		P.push_back(pt);
		
	}
	it = P.begin();
	P.insert(it,Q[0]);		//插入起始点
	it = P.end();
	P.insert(it,Q[num-1]);	//插入末尾点
	for (int i = 0; i < num; i++) {
		cout << Q[i].x << "\t" << Q[i].y << "\t" << Q[i].z << endl;
	}
	cout << endl;
	//输出三次贝塞尔曲线的控制点
	for (int i = 0; i < P.size(); i++) {
		cout << P[i].x << "\t" << P[i].y << "\t" << P[i].z << endl;
	}
	//接下来打印图形
	glutInit(&argc, argv); //Initial GLUT	初始化
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //Set display mode, default set	
	glutInitWindowPosition(50, 50); //Set left-top display window position 窗口定位
	glutInitWindowSize(winWidth, winHeight); //Set display window width and length	窗口大小
	glutCreateWindow("三次贝塞尔曲线拟合如下:"); //Creat display window
	init();
	glutDisplayFunc(show);
	glutMainLoop();
	return 0;
}

4、运行结果:
在这里插入图片描述蓝色的为拟合之后的曲线,红色的为原曲线。(视角不同,观察到的曲线也略有差异)

5、最后
以上仅为个人见解,不妥之处请多多指教。欢迎交流

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值