VS2010搭配OpenGL配置个人笔记

VS2010搭配OpenGL配置个人笔记

由于最近毕业论文要做平面块体切割程序需要判断多边形的凹凸性,因此在网上找了一段C++代码作为研究Open gl判断任意多边形的凹凸性。程序源代码如下:

/*  数学知识补充:
将向量用坐标表示(三维向量), 
若向量a=(a1,b1,c1),向量b=(a2,b2,c2), 
则 
向量a·向量b=a1a2+b1b2+c1c2    ------------向量点乘 
向量a×向量b=                  ------------向量叉乘
| i j k| 
|a1 b1 c1| 
|a2 b2 c2| 
=(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1) 
(i、j、k分别为空间中相互垂直的三条坐标轴的单位向量)。
*/
#include <iostream>
#include <vector>
#include <iterator>
#include "glut.h"
using namespace std;
struct vertex 
{
	vertex(GLint _x,GLint _y):x(_x),y(_y)
	{
	}
	GLint x;
	GLint y;
};

class side    
{
public:
	side(vertex _begin,vertex _end):begin(_begin),end(_end)
	{
		x=end.x-begin.x;
		y=end.y-begin.y;
		z=0;
	}

public:
	vertex begin;
	vertex end;

	GLint x;
	GLint y;
	GLint z;
};

// 一个全局函数,求2个边的差积
GLint getchajiZ(const side& left,const side& right)
{
	// (a1,b1,c1) (a2,b2,c2)
	// z=a1b2-a2b1
	return left.x * right.y - right.x * left.y;
}

vector<vertex> vecVertex;    // 因为顶点的数量不固定,由用户左击次数决定,所以采用vector向量容器
vector<side>   vecSide;
vector<int>    vecZ;

void init(void)
{

	glClearColor(0.0,0.0, 1.0, 1.0);

	glMatrixMode(GL_PROJECTION);//设置投影矩阵
	gluOrtho2D(0.0, 400.0, 0.0, 300.0);//二维视景区域

	glColor3f(1.0,0.0,0.0);
	glPointSize(13.0);//点的大小
}

void displayFcn(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POLYGON);                     // 绘制模式
	glColor3f(200.0f,270.0f,0.0f);

	vector<vertex>::iterator it=vecVertex.begin();
	int i=0;
	for(;it!=vecVertex.end();it++,i++)
	{

		if (it!=vecVertex.begin())     // 先取得每个边的向量保存到容器vecSide
		{
			side aSide(vecVertex[i-1],vecVertex[i]);
			vecSide.push_back(  aSide );                     
		}
		glVertex3i((*it).x,(*it).y,0);       // 画出一个顶点

		if (i == vecVertex.size() -1 )  
		{
			side aSide(vecVertex[i],vecVertex[0]);   // 还有一个首尾相连的边
			vecSide.push_back(  aSide ); 
		}
	}

	// 现在想办法得到chajiZ  ---差积的z
	int size=vecSide.size();
	for (i=0;i<size;i++)
	{
		int chajiZ;
		chajiZ=getchajiZ(vecSide[i],vecSide[(i+1)%size]);

		vecZ.push_back(chajiZ);
		cout<<chajiZ<<endl;                    // 打印出每个差积的z值
	}
	for (i=0;i<vecZ.size();i++)
	{
		if (vecZ[i]*vecZ[ (i+1) % vecZ.size() ] <0  )  // 有异号
		{
			cout<<"凹多边形!!!!!!!"<<endl;
			break;
		}

		if(i==vecZ.size()-1)
		{
			cout<<"凸多边形!!!"<<endl;
			break;
		}
	}

	glEnd();
	glFlush();
}

void plotpoint(GLint x, GLint y)
{
	// 画出临时的一个点
	glBegin(GL_POINTS);
	glVertex2i(x,y);
	glEnd();

	vecVertex.push_back(vertex(x,y));    // 不用new,全局vector容器保存局部对象可以的
}

void mouse(GLint button, GLint action, GLint x,GLint y)
{
	if (button==GLUT_LEFT_BUTTON && action==GLUT_DOWN)
	{
		plotpoint(x,300-y);
	}
	glFlush();

	if (button==GLUT_RIGHT_BUTTON && action==GLUT_DOWN)
	{
		glutPostRedisplay();//重绘窗口  
		//	vecVertex.clear();     // 发现一旦清除,就不能显示了
		//  这边顺便判断下是否为凸多边形(所有向量差积的z都同号)		
	}	
}

void main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowPosition(50, 100);
	glutInitWindowSize(400, 300);
	glutCreateWindow("mouse");

	init();
	glutDisplayFunc(displayFcn);
	glutMouseFunc(mouse);  
	glutMainLoop();

}

一、下载GLUT工具包

GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。

Windows环境下的GLUT下载地址:(大小约为150k)

http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip

该工具包包含了上述代码所需要的glut.h头文件,GLUT代表OpenGL应用工具包,英文全称为OpenGL Utility Toolkit,是一个和窗口系统无关的软件包,它由Mark Kilgard在SGI时写的。作为AUX库的功能更强大的替代品,用于隐藏不同窗口系统API的复杂性,是一个学习OpenGL编程的一个良好开端。

二、GLUT工具包在VS2010,WIN10 64系统下的安装配置

首先解压下载下来的GLUT安装包,出现以下5个文件:

将glut.h文件拷贝一份到VS2010的安装目录下的include文件夹中,在我的电脑中的路径为:D:\Apps\Microsoft Visual Studio 10.0\VC\include

将glut.lib,glut32.lib静态链接库拷贝到:D:\Apps\Microsoft Visual Studio 10.0\VC\lib

将glut.dll,glut32.dll动态链接库拷贝到:C:\Windows\SysWOW64(如果是32位电脑,则拷贝到:C:\Windows\System32)

(注:如在开发应用程序时用到OpenGL辅助库函数,则还需下载相应动态链接库,包含glaux.dll, glaux.lib, glaux.h,相应步骤同上)

三、第一个OpenGL程序的配置

在VS2010中先右击项目,选择属性,找到连接器标签,最后在输入中的附加依赖库加上opengl32.lib glut32.lib glu32.lib.(注意三者之间用分号连接)

编译,执行上述代码,得结果为:

       main函数中以glut开头的函数都包含在glut.h中。GLUT库的函数主要执行如处理多窗口绘制、处理回调驱动事件、生成层叠式弹出菜单、绘制位图字体和笔画字体,以及各种窗口管理等任务。

       glutInit用来初始化GLUT库并同窗口系统对话协商。

       glutInitDisplayMode用来确定所创建窗口的显示模式。参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。

       glutInitWindowSize 初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。

       glutInitWindowPosition 设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加。

       glutCreateWindow 创建顶层窗口,窗口的名字为扩号中的参数。

       glutDisplayFunc 注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时,GLUT将调用该窗口的的显示回调函数。在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。

       glutMainLoop 进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,此例中为glutDisplayFunc 。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值