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

📄 figure.cpp

📁 基于NEHE第48课的程序,改为MFC下运行.运用轨迹球技术,初学者值得参考
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//Version 1.1c
//Code by Phil.Z
//Date 2007-12-28

#include "stdafx.h"
#include "Figure.h"
#include <cmath>

//==========PT类实现================
PT::PT(float x,float y,float z) : X(x),Y(y),Z(z)
{
}

PT::PT(float * CoordList) : X(*CoordList),Y(*(CoordList + 1)),Z(*(CoordList + 2))
{
}

//=========Figure类实现=============
Figure::Figure() : m_fXRot(0),m_fYRot(0),m_fZRot(0),
				   m_nName(-1),m_bCurFigure(false)
{
}

Figure::~Figure()
{

}

void Figure::GetRot(float CurRot[]) const
{
	CurRot[0] = m_fXRot;
	CurRot[1] = m_fYRot;
	CurRot[2] = m_fZRot;
}

void Figure::SetRot(float RotData[])
{
	m_fXRot = RotData[0];
	m_fYRot = RotData[1];
	m_fZRot = RotData[2];
}

bool Figure::GetCurStatue() const
{
	return m_bCurFigure;
}

void Figure::SetCurStatue(bool statue)
{
	m_bCurFigure = statue;
}

int Figure::GetName() const
{
	return m_nName;
}

void Figure::SetName(int newName)
{
	m_nName = newName;
}

void Figure::Display() const
{
	glRotatef(m_fXRot,1,0,0);
	glRotatef(m_fYRot,0,1,0);
	glRotatef(m_fZRot,0,0,1);
}

//========Figure2D类实现============
Figure2D::Figure2D() : m_vecMove(0,0,0)
{

}

Figure2D::~Figure2D()
{

}

void Figure2D::SetPos(float MoveVec[])
{
	m_vecMove.X = MoveVec[0];
	m_vecMove.Y = MoveVec[1];
	m_vecMove.Z = MoveVec[2];
}

void Figure2D::GetPos(float MoveVec[])
{
	MoveVec[0] = m_vecMove.X;
	MoveVec[1] = m_vecMove.Y;
	MoveVec[2] = m_vecMove.Z;
}

void Figure2D::Display() const
{
	glTranslatef(m_vecMove.X,m_vecMove.Y,m_vecMove.Z);
}

//========Figure3D类实现=============
Figure3D::Figure3D(float ptCenter[]) : m_ptCenter(ptCenter)
{

}

void Figure3D::GetPos(float ptPos[])
{
	ptPos[0] = m_ptCenter.X;
	ptPos[1] = m_ptCenter.Y;
	ptPos[2] = m_ptCenter.Z;
}

void Figure3D::SetPos(float ptPos[])
{
	m_ptCenter.X = ptPos[0];
	m_ptCenter.Y = ptPos[1];
	m_ptCenter.Z = ptPos[2];
}

void Figure3D::Display() const
{
	glTranslatef(m_ptCenter.X,m_ptCenter.Y,m_ptCenter.Z);
}

//=========Point类实现==============
Point::Point(float *initList) : m_Point(&initList[0]),
								m_fSize(initList[3])
{
	m_afColor[0] = initList[4];
	m_afColor[1] = initList[5];
	m_afColor[2] = initList[6];
}

Point::~Point()
{
}

void Point::Display() const
{
	Figure2D::Display();
	Figure::Display();
	glPointSize(m_fSize);
	glColor3fv(m_afColor);
	glBegin(GL_POINTS);
		glVertex3f(m_Point.X,m_Point.Y,m_Point.Z);
	glEnd();
	if (m_bCurFigure)
	{
		glPushAttrib(GL_LIGHTING_BIT);
			glDisable(GL_LIGHTING);
			glColor3f(1,1,1);
			glLineWidth(1);
			glBegin(GL_LINES);
				//右上
				glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X + m_fSize * 1.2,m_Point.Y + m_fSize * 1.5,m_Point.Z);
				
				glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y + m_fSize * 1.2,m_Point.Z);

				//右下
				glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y - m_fSize * 1.2,m_Point.Z);

				glVertex3f(m_Point.X + m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X + m_fSize * 1.2,m_Point.Y - m_fSize * 1.5,m_Point.Z);

				//左上
				glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y + m_fSize * 1.2,m_Point.Z);

				glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y + m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X - m_fSize * 1.2,m_Point.Y + m_fSize * 1.5,m_Point.Z);

				//左下
				glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y - m_fSize * 1.2,m_Point.Z);
				
				glVertex3f(m_Point.X - m_fSize * 1.5,m_Point.Y - m_fSize * 1.5,m_Point.Z);
				glVertex3f(m_Point.X - m_fSize * 1.2,m_Point.Y - m_fSize * 1.5,m_Point.Z);
			glEnd();
		glPopAttrib();
	}
}

//==========Line类实现===========
Line::Line(float *initList) : m_ptFrom(&initList[0]),
							  m_ptTo(&initList[3]),
							  m_fWidth(initList[6])
{
	m_afColor[0] = initList[7];
	m_afColor[1] = initList[8];
	m_afColor[2] = initList[9];
}

Line::~Line()
{
}

void Line::Display() const
{
	Figure2D::Display();
	Figure::Display();
	glLineWidth(m_fWidth);
	glColor3fv(m_afColor);
	glBegin(GL_LINES);
		glVertex3f(m_ptFrom.X,m_ptFrom.Y,m_ptFrom.Z);
		glVertex3f(m_ptTo.X,m_ptTo.Y,m_ptTo.Z);
	glEnd();
	if (m_bCurFigure)
	{
		glPushAttrib(GL_LIGHTING_BIT);
			glDisable(GL_LIGHTING);
			glColor3f(1,1,1);
			glLineWidth(1);
			glBegin(GL_LINES);
				//左上
				glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y + m_fWidth * 0.75,m_ptFrom.Z);
				glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y + m_fWidth * 0.25,m_ptFrom.Z);
				
				glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y + m_fWidth * 0.75,m_ptFrom.Z);
				glVertex3f(m_ptFrom.X + m_fWidth * 3,m_ptFrom.Y + m_fWidth * 0.75,m_ptFrom.Z);

				//左下
				glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y - m_fWidth * 0.75,m_ptFrom.Z);
				glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y - m_fWidth * 0.25,m_ptFrom.Z);

				glVertex3f(m_ptFrom.X - m_fWidth * 2,m_ptFrom.Y - m_fWidth * 0.75,m_ptFrom.Z);
				glVertex3f(m_ptFrom.X + m_fWidth * 3,m_ptFrom.Y - m_fWidth * 0.75,m_ptFrom.Z);

				//右上
				glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y + m_fWidth * 0.75,m_ptTo.Z);
				glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y + m_fWidth * 0.25,m_ptTo.Z);

				glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y + m_fWidth * 0.75,m_ptTo.Z);
				glVertex3f(m_ptTo.X - m_fWidth * 3,m_ptTo.Y + m_fWidth * 0.75,m_ptTo.Z);

				//右下
				glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y - m_fWidth * 0.75,m_ptTo.Z);
				glVertex3f(m_ptTo.X - m_fWidth * 3,m_ptTo.Y - m_fWidth * 0.75,m_ptTo.Z);

				glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y - m_fWidth * 0.75,m_ptTo.Z);
				glVertex3f(m_ptTo.X + m_fWidth * 2,m_ptTo.Y - m_fWidth * 0.25,m_ptTo.Z);
			glEnd();
		glPopAttrib();
	}
}

//=========Rect类实现==========
int Rect::m_nRectNum = 0;
unsigned int Rect::m_nDispList = 0;

Rect::Rect(float *initList) : m_ptCenter(&initList[0]),
							  m_fWidth(initList[3]),
							  m_fHeight(initList[4]),
							  m_nFillMode(initList[5])
{
	m_afColor[0] = initList[6];
	m_afColor[1] = initList[7];
	m_afColor[2] = initList[8];
	m_nRectNum++;									//引用计数,如果当前没有该类的对象创建显示列表
	if (m_nRectNum == 1)
	{
		m_nDispList = glGenLists(1);
		glNewList(m_nDispList,GL_COMPILE);
			glBegin(GL_QUADS);
				glVertex3f(-0.5,0.5,0);
				glVertex3f(-0.5,-0.5,0);
				glVertex3f(0.5,-0.5,0);
				glVertex3f(0.5,0.5,0);
			glEnd();
		glEndList();
	}
}

Rect::~Rect()
{
	m_nRectNum--;						//更新引用计数,在最后一个对象销毁时删除显示列表
	if (m_nRectNum == 0)
		glDeleteLists(m_nDispList,1);
}

void Rect::Display() const
{
	glPolygonMode(GL_FRONT,m_nFillMode);
	glPushMatrix();
		glTranslatef(m_ptCenter.X,m_ptCenter.Y,m_ptCenter.Z);
		Figure2D::Display();
		Figure::Display();
		glScalef(m_fWidth,m_fHeight,1);
		if (m_bCurFigure)
		{
			glPushAttrib(GL_LIGHTING_BIT);
				glDisable(GL_LIGHTING);
				glColor3f(1,1,1);
				glLineWidth(1);
				glBegin(GL_LINES);
					//左上
					glVertex3f(-0.6,0.6,0);
					glVertex3f(-0.4,0.6,0);
					
					glVertex3f(-0.6,0.6,0);
					glVertex3f(-0.6,0.4,0);

					//左下
					glVertex3f(-0.6,-0.6,0);
					glVertex3f(-0.4,-0.6,0);
					
					glVertex3f(-0.6,-0.6,0);
					glVertex3f(-0.6,-0.4,0);

					//右上
					glVertex3f(0.6,0.6,0);
					glVertex3f(0.4,0.6,0);

					glVertex3f(0.6,0.6,0);
					glVertex3f(0.6,0.4,0);

					//右下
					glVertex3f(0.6,-0.6,0);
					glVertex3f(0.4,-0.6,0);

					glVertex3f(0.6,-0.6,0);
					glVertex3f(0.6,-0.4,0);
				glEnd();
			glPopAttrib();
		}
		glColor3fv(m_afColor);
		glCallList(m_nDispList);
	glPopMatrix();
}

//========2D图形圆类实现==========
int Circle::m_nCircleNum = 0;
unsigned int Circle::m_nDispList = 0;

Circle::Circle(float *initList) : m_ptCenter(&initList[0]),
								  m_fXRadius(initList[3]),
								  m_fYRadius(initList[4])
{
	m_afColor[0] = initList[5];
	m_afColor[1] = initList[6];
	m_afColor[2] = initList[7];
	m_nCircleNum++;                        //引用计数,在创建第一个对象时创建显示列表
	if (m_nCircleNum == 1)
	{
		const double PI = 3.1415926;
		m_nDispList = glGenLists(1);
		glNewList(m_nDispList,GL_COMPILE);
			glBegin(GL_POLYGON);
				for (int i = 1000;i >= 0;i--)
					glVertex3f(cos(2 * i * PI / 1000),sin(2 * i * PI / 1000),0);
			glEnd();
		glEndList();
	}
}

Circle::~Circle()
{
	m_nCircleNum--;						//更新引用计数,在最后一个对象销毁时删除显示列表
	if (m_nCircleNum == 0)
		glDeleteLists(m_nDispList,1);
}

void Circle::Display() const
{
	glPushMatrix();
		glTranslatef(m_ptCenter.X,m_ptCenter.Y,m_ptCenter.Z);
		Figure2D::Display();
		Figure::Display();
		glScalef(m_fXRadius,m_fYRadius,1);
		if (m_bCurFigure)
		{
			glColor3f(1,1,1);
			glLineWidth(1);
			glBegin(GL_LINES);
				//左上
				glVertex3f(-1,1,0);
				glVertex3f(-0.5,1,0);

				glVertex3f(-1,1,0);
				glVertex3f(-1,0.5,0);

				//左下
				glVertex3f(-1,-1,0);
				glVertex3f(-0.5,-1,0);

				glVertex3f(-1,-1,0);
				glVertex3f(-1,-0.5,0);

				//右上
				glVertex3f(1,1,0);
				glVertex3f(0.5,1,0);

				glVertex3f(1,1,0);
				glVertex3f(1,0.5,0);

				//右下
				glVertex3f(1,-1,0);
				glVertex3f(0.5,-1,0);

				glVertex3f(1,-1,0);
				glVertex3f(1,-0.5,0);
			glEnd();
		}
		glColor3fv(m_afColor);
		glCallList(m_nDispList);
	glPopMatrix();
}

//=========立方体类实现==========
int Cube::m_nCubeNum = 0;
unsigned int Cube::m_nDispList = 0;

Cube::Cube(float *initList) : Figure3D(&initList[0]),
							  m_fXLength(initList[3]),
							  m_fYLength(initList[4]),
							  m_fZLength(initList[5])
{
	m_afColor[0] = initList[6];
	m_afColor[1] = initList[7];
	m_afColor[2] = initList[8];
	
	m_nCubeNum++;								//引用计数,在创建第一个对象时创建显示列表
	if (m_nCubeNum == 1)
	{
		m_nDispList = glGenLists(1);
		glNewList(m_nDispList,GL_COMPILE);
			glBegin(GL_QUADS);
				//Front
				glNormal3f(0,0,1);
				glVertex3f(-0.5,0.5,0.5);
				glVertex3f(-0.5,-0.5,0.5);
				glVertex3f(0.5,-0.5,0.5);
				glVertex3f(0.5,0.5,0.5);
				//Back
				glNormal3f(0,0,-1);
				glVertex3f(0.5,0.5,-0.5);
				glVertex3f(0.5,-0.5,-0.5);
				glVertex3f(-0.5,-0.5,-0.5);
				glVertex3f(-0.5,0.5,-0.5);
				//Left
				glNormal3f(-1,0,0);
				glVertex3f(-0.5,0.5,-0.5);
				glVertex3f(-0.5,-0.5,-0.5);
				glVertex3f(-0.5,-0.5,0.5);
				glVertex3f(-0.5,0.5,0.5);
				//Right
				glNormal3f(1,0,0);
				glVertex3f(0.5,0.5,0.5);
				glVertex3f(0.5,-0.5,0.5);
				glVertex3f(0.5,-0.5,-0.5);
				glVertex3f(0.5,0.5,-0.5);
				//Up
				glNormal3f(0,1,0);
				glVertex3f(-0.5,0.5,-0.5);
				glVertex3f(-0.5,0.5,0.5);
				glVertex3f(0.5,0.5,0.5);
				glVertex3f(0.5,0.5,-0.5);
				//Down
				glNormal3f(0,-1,0);
				glVertex3f(0.5,-0.5,-0.5);
				glVertex3f(0.5,-0.5,0.5);
				glVertex3f(-0.5,-0.5,0.5);
				glVertex3f(-0.5,-0.5,-0.5);
			glEnd();
		glEndList();
	}
}

Cube::~Cube()
{
	m_nCubeNum--;						//更新引用计数,在最后一个对象销毁时删除显示列表
	if (m_nCubeNum == 0)
		glDeleteLists(m_nDispList,1);
}

void Cube::Display() const
{

⌨️ 快捷键说明

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