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

📄 cube.cpp

📁 这是我做的一个VC++小程序
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////////
//	
// Cube.cpp: implementation of the CCube class.
//
////////////////////////////////////////////////////////////////////////////////
// 版权所有(2002)
// Copyright(2002)
// 编写者: 向世明
// Author: Xiang Shiming


#include "stdafx.h"
#include "Cube.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CCube,CObject3d)

CCube::CCube()
{
	//空立方体
}

CCube::CCube(float fx, float fy, float fz) : m_fx(ABS(fx)), m_fy(ABS(fy)), m_fz(ABS(fz))
{
	//立方体的顶点个数为8,边数为12,小面数为6
	//立方体初始化
	m_vList.SetSize(8);
	m_eList.SetSize(12);
	m_sList.SetSize(6);
	
	//初始化几何拓扑
	InitGeom();
	//初始化小面法线
	InitFacetNormal();
	
}

//复制构造函数
CCube::CCube(const CCube& cube)
{
	//几何元素个数(8,12,6)
	
	//复制经过编辑后的立方体
	//编辑是指对几何拓扑的修改
	int nNumVertex = cube.GetVertexListSize();
	int nNumEdge = cube.GetEdgeListSize();
	int nNumFacet = cube.GetFacetListSize();
	
	//避免复制空对象
	ASSERT(nNumVertex > 2);
	ASSERT(nNumEdge > 2);
	//至少有一个面(一个面至少有三条边,三个顶点)
	ASSERT(nNumFacet > 0);

	m_vList.SetSize(nNumVertex);
	m_eList.SetSize(nNumEdge);
	m_sList.SetSize(nNumFacet);

	m_vList.Copy(cube.m_vList);
	m_eList.Copy(cube.m_eList);
	m_sList.Copy(cube.m_sList);

	m_vList.FreeExtra();
	m_eList.FreeExtra();
	m_sList.FreeExtra();

	m_mGeomTrans = cube.m_mGeomTrans;
	m_bAutoColor = cube.m_bAutoColor;

	m_fx = cube.m_fx;
	m_fy = cube.m_fy;
	m_fz = cube.m_fz;
}


CCube::~CCube()
{
	m_vList.RemoveAll();
	m_eList.RemoveAll();
	m_sList.RemoveAll();	
}

//克隆物体
CCube* CCube::Clone()
{
	
	CCube* pCubeCloned = new CCube();
	
	//克隆几何及属性
	//几何元素个数
	int nNumVertex = GetVertexListSize();
	int nNumEdge = GetEdgeListSize();
	int nNumFacet = GetFacetListSize();

	//避免克隆空对象
	ASSERT(nNumVertex > 2);
	ASSERT(nNumEdge > 2);
	ASSERT(nNumFacet > 0);

	pCubeCloned->m_vList.SetSize(nNumVertex);
	pCubeCloned->m_eList.SetSize(nNumEdge);
	pCubeCloned->m_sList.SetSize(nNumFacet);

	pCubeCloned->m_vList.Copy(m_vList);
	pCubeCloned->m_eList.Copy(m_eList);
	pCubeCloned->m_sList.Copy(m_sList);

	pCubeCloned->m_mGeomTrans = m_mGeomTrans;
	pCubeCloned->m_bAutoColor = m_bAutoColor;
	pCubeCloned->m_fx = m_fx;
	pCubeCloned->m_fy = m_fy;
	pCubeCloned->m_fz = m_fz;
	
	return pCubeCloned;
}

//初始化几何拓扑
void CCube::InitGeom()
{
	//将立方体的中心放置于世界坐标系的原点
	float x = m_fx / 2.0f, y = m_fy / 2.0f, z = m_fz / 2.0f; 
	
	//顶点坐标
	HOMOCOORD anCoords[8] = {
		{-x, -y, -z, 1.0f}, { x, -y, -z, 1.0f}, 
		{ x,  y, -z, 1.0f}, {-x,  y, -z, 1.0f},
		{-x, -y,  z, 1.0f}, { x, -y,  z, 1.0f}, 
		{ x,  y,  z, 1.0f}, {-x,  y,  z, 1.0f}};

	//顶点所在的小面序号
	int anInFacets[8][3] = {
		{0, 2, 3}, {0, 3, 4}, {1, 3, 4}, {1, 2, 3},
		{0, 2, 5}, {0, 4, 5}, {1, 4, 5}, {1, 2, 5}};

	//初始化顶点
	int i;
	for(i = 0; i < 8; i++)
	{
		m_vList[i].m_coord = anCoords[i];
		m_vList[i].DefineTopology(anInFacets[i],3);
	}

	//处理边
	//定义边的几何
	m_eList[0].DefineEdge(0, 1);
	m_eList[1].DefineEdge(1, 2);
	m_eList[2].DefineEdge(2, 3);
	m_eList[3].DefineEdge(3, 0);

	m_eList[4].DefineEdge(3, 7);
	m_eList[5].DefineEdge(2, 6);
	m_eList[6].DefineEdge(1, 5);
	m_eList[7].DefineEdge(0, 4);

	m_eList[8].DefineEdge(4, 5);
	m_eList[9].DefineEdge(5, 6);
	m_eList[10].DefineEdge(6, 7);
	m_eList[11].DefineEdge(7, 4);

	//与边相连的面
	int anEdgeInFacets[12][2] = {
		{0, 3}, {3, 4}, {1, 3}, {2, 3}, {1, 2}, {1, 4},
		{0, 4}, {0, 2}, {0, 5}, {4, 5}, {1, 5}, {2, 5}}; 
	
	//定义边的拓扑(共线小面)
	for(i = 0; i < 12; i++)
		m_eList[i].DefineTopology(anEdgeInFacets[i],2);	
	
	//定义面的拓扑
	int anVertices[6][4] = {
		{0, 1, 5, 4}, {3, 7, 6, 2}, {3, 0, 4, 7},	
		{0, 3, 2, 1}, {1, 2, 6, 5}, {4, 5, 6, 7}
	};

	//设置面拓扑(顶点)
	for(i = 0; i < 6; i++)
		m_sList[i].DefineTopology(anVertices[i], 4);

	//其它绘制属性采用初始化值.
}

//初始化面法线
void CCube::InitFacetNormal()
{
	VECTOR3D n[6] = {
		{0.0f, -1.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f},
		{0.0f, 0.0f, -1.0f}, {1.0f, 0.0f, 0.0f}, {0.0f,  0.0f, 1.0f}};
	for(int i = 0; i < 6; i++)
		m_sList[i].m_normal = n[i];
}

⌨️ 快捷键说明

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