📄 cube.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 + -