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

📄 figure.cpp

📁 基于NEHE第48课的程序,改为MFC下运行.运用轨迹球技术,初学者值得参考
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	glEnable(GL_NORMALIZE);
	glPushMatrix();
		Figure3D::Display();
		Figure::Display();
		glScalef(m_fXLength,m_fYLength,m_fZLength);
		if (m_bCurFigure)
		{
			glPushAttrib(GL_LIGHTING_BIT);
				glDisable(GL_LIGHTING);
				glLineWidth(1);
				glColor3f(1,1,1);
				glBegin(GL_LINES);
					//左上前
					glVertex3f(-0.6,0.6,0.6);
					glVertex3f(-0.3,0.6,0.6);

					glVertex3f(-0.6,0.6,0.6);
					glVertex3f(-0.6,0.3,0.6);

					glVertex3f(-0.6,0.6,0.6);
					glVertex3f(-0.6,0.6,0.3);

					//左下前
					glVertex3f(-0.6,-0.6,0.6);
					glVertex3f(-0.3,-0.6,0.6);

					glVertex3f(-0.6,-0.6,0.6);
					glVertex3f(-0.6,-0.3,0.6);

					glVertex3f(-0.6,-0.6,0.6);
					glVertex3f(-0.6,-0.6,0.3);

					//右下前
					glVertex3f(0.6,-0.6,0.6);
					glVertex3f(0.3,-0.6,0.6);
					
					glVertex3f(0.6,-0.6,0.6);
					glVertex3f(0.6,-0.3,0.6);

					glVertex3f(0.6,-0.6,0.6);
					glVertex3f(0.6,-0.6,0.3);

					//右上前
					glVertex3f(0.6,0.6,0.6);
					glVertex3f(0.3,0.6,0.6);

					glVertex3f(0.6,0.6,0.6);
					glVertex3f(0.6,0.3,0.6);

					glVertex3f(0.6,0.6,0.6);
					glVertex3f(0.6,0.6,0.3);

					//左上后
					glVertex3f(-0.6,0.6,-0.6);
					glVertex3f(-0.3,0.6,-0.6);

					glVertex3f(-0.6,0.6,-0.6);
					glVertex3f(-0.6,0.3,-0.6);

					glVertex3f(-0.6,0.6,-0.6);
					glVertex3f(-0.6,0.6,-0.3);

					//左下后
					glVertex3f(-0.6,-0.6,-0.6);
					glVertex3f(-0.3,-0.6,-0.6);

					glVertex3f(-0.6,-0.6,-0.6);
					glVertex3f(-0.6,-0.3,-0.6);

					glVertex3f(-0.6,-0.6,-0.6);
					glVertex3f(-0.6,-0.6,-0.3);

					//右下后
					glVertex3f(0.6,-0.6,-0.6);
					glVertex3f(0.3,-0.6,-0.6);

					glVertex3f(0.6,-0.6,-0.6);
					glVertex3f(0.6,-0.3,-0.6);

					glVertex3f(0.6,-0.6,-0.6);
					glVertex3f(0.6,-0.6,-0.3);

					//右上后
					glVertex3f(0.6,0.6,-0.6);
					glVertex3f(0.3,0.6,-0.6);

					glVertex3f(0.6,0.6,-0.6);
					glVertex3f(0.6,0.3,-0.6);

					glVertex3f(0.6,0.6,-0.6);
					glVertex3f(0.6,0.6,-0.3);
				glEnd();
			glPopAttrib();
		}
		glColor3fv(m_afColor);
		glCallList(m_nDispList);
	glPopMatrix();
	glDisable(GL_NORMALIZE);
}

//========二次对象图形实现=========
Quadric::Quadric(float precision,float *CenterPos) : m_fPrecision(precision),
													 Figure3D(CenterPos)
{
	m_qObj = gluNewQuadric();
	gluQuadricNormals(m_qObj,GLU_SMOOTH);
}

Quadric::~Quadric()
{
	gluDeleteQuadric(m_qObj);
}

//=======3D球形类实现=========
Sphere::Sphere(float *initList) : Quadric(initList[4],&initList[0]),
								  m_fRadius(initList[3])
{
	m_afColor[0] = initList[5];
	m_afColor[1] = initList[6];
	m_afColor[2] = initList[7];
}

Sphere::~Sphere()
{
}

void Sphere::Display() const
{
	glPushMatrix();
		Figure3D::Display();
		Figure::Display();
		if (m_bCurFigure)
		{
			glPushAttrib(GL_LIGHTING_BIT);
				glDisable(GL_LIGHTING);
				glLineWidth(1);
				glColor3f(1,1,1);
				glBegin(GL_LINES);
					//左上前
					glVertex3f(-m_fRadius,m_fRadius,m_fRadius);
					glVertex3f(-m_fRadius / 2,m_fRadius,m_fRadius);
		
					glVertex3f(-m_fRadius,m_fRadius,m_fRadius);
					glVertex3f(-m_fRadius,m_fRadius / 2,m_fRadius);

					glVertex3f(-m_fRadius,m_fRadius,m_fRadius);
					glVertex3f(-m_fRadius,m_fRadius,m_fRadius / 2);

					//左下前
					glVertex3f(-m_fRadius,-m_fRadius,m_fRadius);
					glVertex3f(-m_fRadius / 2,-m_fRadius,m_fRadius);

					glVertex3f(-m_fRadius,-m_fRadius,m_fRadius);
					glVertex3f(-m_fRadius,-m_fRadius / 2,m_fRadius);

					glVertex3f(-m_fRadius,-m_fRadius,m_fRadius);
					glVertex3f(-m_fRadius,-m_fRadius,m_fRadius / 2);

					//右下前
					glVertex3f(m_fRadius,-m_fRadius,m_fRadius);
					glVertex3f(m_fRadius / 2,-m_fRadius,m_fRadius);
		
					glVertex3f(m_fRadius,-m_fRadius,m_fRadius);
					glVertex3f(m_fRadius,-m_fRadius / 2,m_fRadius);

					glVertex3f(m_fRadius,-m_fRadius,m_fRadius);
					glVertex3f(m_fRadius,-m_fRadius,m_fRadius / 2);

					//右上前
					glVertex3f(m_fRadius,m_fRadius,m_fRadius);
					glVertex3f(m_fRadius / 2,m_fRadius,m_fRadius);
		
					glVertex3f(m_fRadius,m_fRadius,m_fRadius);
					glVertex3f(m_fRadius,m_fRadius / 2,m_fRadius);

					glVertex3f(m_fRadius,m_fRadius,m_fRadius);
					glVertex3f(m_fRadius,m_fRadius,m_fRadius / 2);

					//左上后
					glVertex3f(-m_fRadius,m_fRadius,-m_fRadius);
					glVertex3f(-m_fRadius / 2,m_fRadius,-m_fRadius);

					glVertex3f(-m_fRadius,m_fRadius,-m_fRadius);
					glVertex3f(-m_fRadius,m_fRadius / 2,-m_fRadius);

					glVertex3f(-m_fRadius,m_fRadius,-m_fRadius);
					glVertex3f(-m_fRadius,m_fRadius,-m_fRadius / 2);
		
					//左下后
					glVertex3f(-m_fRadius,-m_fRadius,-m_fRadius);
					glVertex3f(-m_fRadius / 2,-m_fRadius,-m_fRadius);

					glVertex3f(-m_fRadius,-m_fRadius,-m_fRadius);
					glVertex3f(-m_fRadius,-m_fRadius / 2,-m_fRadius);

					glVertex3f(-m_fRadius,-m_fRadius,-m_fRadius);
					glVertex3f(-m_fRadius,-m_fRadius,-m_fRadius / 2);

					//右下后
					glVertex3f(m_fRadius,-m_fRadius,-m_fRadius);
					glVertex3f(m_fRadius / 2,-m_fRadius,-m_fRadius);

					glVertex3f(m_fRadius,-m_fRadius,-m_fRadius);
					glVertex3f(m_fRadius,-m_fRadius / 2,-m_fRadius);

					glVertex3f(m_fRadius,-m_fRadius,-m_fRadius);
					glVertex3f(m_fRadius,-m_fRadius,-m_fRadius / 2);

					//右上后
					glVertex3f(m_fRadius,m_fRadius,-m_fRadius);
					glVertex3f(m_fRadius / 2,m_fRadius,-m_fRadius);

					glVertex3f(m_fRadius,m_fRadius,-m_fRadius);
					glVertex3f(m_fRadius,m_fRadius / 2,-m_fRadius);

					glVertex3f(m_fRadius,m_fRadius,-m_fRadius);
					glVertex3f(m_fRadius,m_fRadius,-m_fRadius / 2);
				glEnd();
			glPopAttrib();
		}
		glColor3fv(m_afColor);
		gluSphere(m_qObj,m_fRadius,m_fPrecision,m_fPrecision * 10);
	glPopMatrix();
}

//========3D圆柱体实现========
Cylinder::Cylinder(float *initList) : Quadric(initList[6],&initList[0]),
									  m_fTopRadius(initList[3]),
									  m_fBaseRadius(initList[4]),
									  m_fHeight(initList[5])
{
	m_afColor[0] = initList[7];
	m_afColor[1] = initList[8];
	m_afColor[2] = initList[9];
}

Cylinder::~Cylinder()
{
}

void Cylinder::Display() const
{
	glColor3fv(m_afColor);
	glPushMatrix();
		Figure3D::Display();
		Figure::Display();
		glTranslatef(0,0,-m_fHeight / 2);
		gluCylinder(m_qObj,m_fBaseRadius,m_fTopRadius,m_fHeight,m_fPrecision,m_fPrecision);
		glPushMatrix();
			glTranslatef(0,0,m_fHeight);
			gluDisk(m_qObj,0,m_fTopRadius,30,30);
		glPopMatrix();
		glPushMatrix();
			glRotatef(180,0,1,0);
			gluDisk(m_qObj,0,m_fBaseRadius,30,30);
		glPopMatrix();
		if (m_bCurFigure)
		{
			glPushAttrib(GL_LIGHTING_BIT);
				glDisable(GL_LIGHTING);
				glPushMatrix();
					glTranslatef(0,0,m_fHeight / 2);
					float width = (m_fBaseRadius > m_fTopRadius) ? m_fBaseRadius : m_fTopRadius;
					glColor3f(1,1,1);
					glLineWidth(1);
					glBegin(GL_LINES);
						//左上前
						glVertex3f(-width,width,m_fHeight / 2);
						glVertex3f(-width / 2,width,m_fHeight / 2);
					
						glVertex3f(-width,width,m_fHeight / 2);
						glVertex3f(-width,width / 2,m_fHeight / 2);

						glVertex3f(-width,width,m_fHeight / 2);
						glVertex3f(-width,width,m_fHeight / 4);

						//左下前
						glVertex3f(-width,-width,m_fHeight / 2);
						glVertex3f(-width / 2,-width,m_fHeight / 2);

						glVertex3f(-width,-width,m_fHeight / 2);
						glVertex3f(-width,-width / 2,m_fHeight / 2);

						glVertex3f(-width,-width,m_fHeight / 2);
						glVertex3f(-width,-width,m_fHeight / 4);

						//右下前
						glVertex3f(width,-width,m_fHeight / 2);
						glVertex3f(width / 2,-width,m_fHeight / 2);

						glVertex3f(width,-width,m_fHeight / 2);
						glVertex3f(width,-width / 2,m_fHeight / 2);

						glVertex3f(width,-width,m_fHeight / 2);
						glVertex3f(width,-width,m_fHeight / 4);

						//右上前
						glVertex3f(width,width,m_fHeight / 2);
						glVertex3f(width / 2,width,m_fHeight / 2);

						glVertex3f(width,width,m_fHeight / 2);
						glVertex3f(width,width / 2,m_fHeight / 2);

						glVertex3f(width,width,m_fHeight / 2);
						glVertex3f(width,width,m_fHeight / 4);

						//左上后
						glVertex3f(-width,width,-m_fHeight / 2);
						glVertex3f(-width / 2,width,-m_fHeight / 2);

						glVertex3f(-width,width,-m_fHeight / 2);
						glVertex3f(-width,width / 2,-m_fHeight / 2);

						glVertex3f(-width,width,-m_fHeight / 2);
						glVertex3f(-width,width,-m_fHeight / 4);

						//左下后
						glVertex3f(-width,-width,-m_fHeight / 2);
						glVertex3f(-width / 2,-width,-m_fHeight / 2);

						glVertex3f(-width,-width,-m_fHeight / 2);
						glVertex3f(-width,-width / 2,-m_fHeight / 2);
						
						glVertex3f(-width,-width,-m_fHeight / 2);
						glVertex3f(-width,-width,-m_fHeight / 4);

						//右下后
						glVertex3f(width,-width,-m_fHeight / 2);
						glVertex3f(width / 2,-width,-m_fHeight / 2);

						glVertex3f(width,-width,-m_fHeight / 2);
						glVertex3f(width,-width / 2,-m_fHeight / 2);

						glVertex3f(width,-width,-m_fHeight / 2);
						glVertex3f(width,-width,-m_fHeight / 4);

						//右上后
						glVertex3f(width,width,-m_fHeight / 2);
						glVertex3f(width / 2,width,-m_fHeight / 2);

						glVertex3f(width,width,-m_fHeight / 2);
						glVertex3f(width,width / 2,-m_fHeight / 2);

						glVertex3f(width,width,-m_fHeight / 2);
						glVertex3f(width,width,-m_fHeight / 4);
					glEnd();
				glPopMatrix();
			glPopAttrib();
		}
	glPopMatrix();
}

//========Disk类实现=========
Disk::Disk(float *initList) : Quadric(initList[6],&initList[0]),
							  m_fInRadius(initList[3]),
							  m_fOutRadius(initList[4]),
							  m_fHeight(initList[5])
{
	m_afColor[0] = initList[7];
	m_afColor[1] = initList[8];
	m_afColor[2] = initList[9];
}

Disk::~Disk()
{
}

void Disk::Display() const
{
	glColor3fv(m_afColor);
	glPushMatrix();
		Figure3D::Display();
		Figure::Display();
		glPushMatrix();
			glRotatef(180,0,1,0);
			glTranslatef(0,0,m_fHeight / 2);
			gluDisk(m_qObj,m_fInRadius,m_fOutRadius,m_fPrecision,m_fPrecision);
		glPopMatrix();
		glPushMatrix();
			glTranslatef(0,0,m_fHeight / 2);
			gluDisk(m_qObj,m_fInRadius,m_fOutRadius,m_fPrecision,m_fPrecision);
		glPopMatrix();
		glPushMatrix();
			glTranslatef(0,0,-m_fHeight / 2);
			gluCylinder(m_qObj,m_fInRadius,m_fInRadius,m_fHeight,m_fPrecision,m_fPrecision);
			gluCylinder(m_qObj,m_fOutRadius,m_fOutRadius,m_fHeight,m_fPrecision,m_fPrecision);
		glPopMatrix();
		if (m_bCurFigure)
		{
			glPushAttrib(GL_LIGHTING_BIT);
				glDisable(GL_LIGHTING);
				glColor3f(1,1,1);
				glLineWidth(1);
				glBegin(GL_LINES);
					//左上前
					glVertex3f(-m_fOutRadius,m_fOutRadius,m_fHeight / 2);
					glVertex3f(-m_fOutRadius / 2,m_fOutRadius,m_fHeight / 2);
		
					glVertex3f(-m_fOutRadius,m_fOutRadius,m_fHeight / 2);
					glVertex3f(-m_fOutRadius,m_fOutRadius / 2,m_fHeight / 2);

					glVertex3f(-m_fOutRadius,m_fOutRadius,m_fHeight / 2);
					glVertex3f(-m_fOutRadius,m_fOutRadius,m_fHeight / 4);

					//左下前
					glVertex3f(-m_fOutRadius,-m_fOutRadius,m_fHeight / 2);
					glVertex3f(-m_fOutRadius / 2,-m_fOutRadius,m_fHeight / 2);

					glVertex3f(-m_fOutRadius,-m_fOutRadius,m_fHeight / 2);
					glVertex3f(-m_fOutRadius,-m_fOutRadius / 2,m_fHeight / 2);

					glVertex3f(-m_fOutRadius,-m_fOutRadius,m_fHeight / 2);
					glVertex3f(-m_fOutRadius,-m_fOutRadius,m_fHeight / 4);

					//右下前
					glVertex3f(m_fOutRadius,-m_fOutRadius,m_fHeight / 2);
					glVertex3f(m_fOutRadius / 2,-m_fOutRadius,m_fHeight / 2);

					glVertex3f(m_fOutRadius,-m_fOutRadius,m_fHeight / 2);
					glVertex3f(m_fOutRadius,-m_fOutRadius / 2,m_fHeight / 2);

					glVertex3f(m_fOutRadius,-m_fOutRadius,m_fHeight / 2);
					glVertex3f(m_fOutRadius,-m_fOutRadius,m_fHeight / 4);

					//右上前
					glVertex3f(m_fOutRadius,m_fOutRadius,m_fHeight / 2);
					glVertex3f(m_fOutRadius / 2,m_fOutRadius,m_fHeight / 2);

					glVertex3f(m_fOutRadius,m_fOutRadius,m_fHeight / 2);
					glVertex3f(m_fOutRadius,m_fOutRadius / 2,m_fHeight / 2);

					glVertex3f(m_fOutRadius,m_fOutRadius,m_fHeight / 2);
					glVertex3f(m_fOutRadius,m_fOutRadius,m_fHeight / 4);

					//左上后
					glVertex3f(-m_fOutRadius,m_fOutRadius,-m_fHeight / 2);
					glVertex3f(-m_fOutRadius / 2,m_fOutRadius,-m_fHeight / 2);

					glVertex3f(-m_fOutRadius,m_fOutRadius,-m_fHeight / 2);
					glVertex3f(-m_fOutRadius,m_fOutRadius / 2,-m_fHeight / 2);

					glVertex3f(-m_fOutRadius,m_fOutRadius,-m_fHeight / 2);
					glVertex3f(-m_fOutRadius,m_fOutRadius,-m_fHeight / 4);

					//左下后
					glVertex3f(-m_fOutRadius,-m_fOutRadius,-m_fHeight / 2);
					glVertex3f(-m_fOutRadius / 2,-m_fOutRadius,-m_fHeight / 2);

					glVertex3f(-m_fOutRadius,-m_fOutRadius,-m_fHeight / 2);
					glVertex3f(-m_fOutRadius,-m_fOutRadius / 2,-m_fHeight / 2);

					glVertex3f(-m_fOutRadius,-m_fOutRadius,-m_fHeight / 2);
					glVertex3f(-m_fOutRadius,-m_fOutRadius,-m_fHeight / 4);

					//右下后
					glVertex3f(m_fOutRadius,-m_fOutRadius,-m_fHeight / 2);
					glVertex3f(m_fOutRadius / 2,-m_fOutRadius,-m_fHeight / 2);

					glVertex3f(m_fOutRadius,-m_fOutRadius,-m_fHeight / 2);
					glVertex3f(m_fOutRadius,-m_fOutRadius / 2,-m_fHeight / 2);

					glVertex3f(m_fOutRadius,-m_fOutRadius,-m_fHeight / 2);
					glVertex3f(m_fOutRadius,-m_fOutRadius,-m_fHeight / 4);

					//右上后
					glVertex3f(m_fOutRadius,m_fOutRadius,-m_fHeight / 2);
					glVertex3f(m_fOutRadius / 2,m_fOutRadius,-m_fHeight / 2);

					glVertex3f(m_fOutRadius,m_fOutRadius,-m_fHeight / 2);
					glVertex3f(m_fOutRadius,m_fOutRadius / 2,-m_fHeight / 2);

					glVertex3f(m_fOutRadius,m_fOutRadius,-m_fHeight / 2);
					glVertex3f(m_fOutRadius,m_fOutRadius,-m_fHeight / 4);
				glEnd();
			glPopAttrib();
		}
	glPopMatrix();
}

⌨️ 快捷键说明

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