📄 spheretessellation.cpp
字号:
rkTetra.m_apkTriangle[3].m_apkEdge[0] = &rkTetra.m_apkEdge[3];
rkTetra.m_apkTriangle[3].m_apkEdge[1] = &rkTetra.m_apkEdge[5];
rkTetra.m_apkTriangle[3].m_apkEdge[2] = &rkTetra.m_apkEdge[2];
rkTetra.m_apkTriangle[3].m_apkAdjacent[0] = &rkTetra.m_apkTriangle[1];
rkTetra.m_apkTriangle[3].m_apkAdjacent[1] = &rkTetra.m_apkTriangle[2];
rkTetra.m_apkTriangle[3].m_apkAdjacent[2] = &rkTetra.m_apkTriangle[0];
// For testing purposes, but not necessary for the algorithm. This
// allows the display program to show the subdivision structure.
for (int i = 0; i < 6; i++)
rkTetra.m_apkEdge[i].m_iStep = 0;
}
//----------------------------------------------------------------------------
void SphereTessellation::CreateOctahedron (
QuadricSurfacef::ConvexPolyhedron& rkOct)
{
rkOct.m_iNumVertices = 6;
rkOct.m_apkVertex = new QuadricSurfacef::Vertex[6];
rkOct.m_iNumEdges = 12;
rkOct.m_apkEdge = new QuadricSurfacef::Edge[12];
rkOct.m_iNumTriangles = 8;
rkOct.m_apkTriangle = new QuadricSurfacef::Triangle[8];
// vertices
rkOct.m_apkVertex[0].m_pkPoint = new Vector3f;
rkOct.m_apkVertex[0].m_pkPoint->X() = 0.0f;
rkOct.m_apkVertex[0].m_pkPoint->Y() = 0.0f;
rkOct.m_apkVertex[0].m_pkPoint->Z() = 1.0f;
rkOct.m_apkVertex[0].m_iNumEdges = 4;
rkOct.m_apkVertex[0].m_apkEdge = new QuadricSurfacef::Edge*[4];
rkOct.m_apkVertex[0].m_apkEdge[0] = &rkOct.m_apkEdge[0];
rkOct.m_apkVertex[0].m_apkEdge[1] = &rkOct.m_apkEdge[1];
rkOct.m_apkVertex[0].m_apkEdge[2] = &rkOct.m_apkEdge[2];
rkOct.m_apkVertex[0].m_apkEdge[3] = &rkOct.m_apkEdge[3];
rkOct.m_apkVertex[1].m_pkPoint = new Vector3f;
rkOct.m_apkVertex[1].m_pkPoint->X() = 1.0f;
rkOct.m_apkVertex[1].m_pkPoint->Y() = 0.0f;
rkOct.m_apkVertex[1].m_pkPoint->Z() = 0.0f;
rkOct.m_apkVertex[1].m_iNumEdges = 4;
rkOct.m_apkVertex[1].m_apkEdge = new QuadricSurfacef::Edge*[4];
rkOct.m_apkVertex[1].m_apkEdge[0] = &rkOct.m_apkEdge[0];
rkOct.m_apkVertex[1].m_apkEdge[1] = &rkOct.m_apkEdge[4];
rkOct.m_apkVertex[1].m_apkEdge[2] = &rkOct.m_apkEdge[7];
rkOct.m_apkVertex[1].m_apkEdge[3] = &rkOct.m_apkEdge[8];
rkOct.m_apkVertex[2].m_pkPoint = new Vector3f;
rkOct.m_apkVertex[2].m_pkPoint->X() = 0.0f;
rkOct.m_apkVertex[2].m_pkPoint->Y() = 1.0f;
rkOct.m_apkVertex[2].m_pkPoint->Z() = 0.0f;
rkOct.m_apkVertex[2].m_iNumEdges = 4;
rkOct.m_apkVertex[2].m_apkEdge = new QuadricSurfacef::Edge*[4];
rkOct.m_apkVertex[2].m_apkEdge[0] = &rkOct.m_apkEdge[1];
rkOct.m_apkVertex[2].m_apkEdge[1] = &rkOct.m_apkEdge[4];
rkOct.m_apkVertex[2].m_apkEdge[2] = &rkOct.m_apkEdge[5];
rkOct.m_apkVertex[2].m_apkEdge[3] = &rkOct.m_apkEdge[9];
rkOct.m_apkVertex[3].m_pkPoint = new Vector3f;
rkOct.m_apkVertex[3].m_pkPoint->X() = -1.0f;
rkOct.m_apkVertex[3].m_pkPoint->Y() = 0.0f;
rkOct.m_apkVertex[3].m_pkPoint->Z() = 0.0f;
rkOct.m_apkVertex[3].m_iNumEdges = 4;
rkOct.m_apkVertex[3].m_apkEdge = new QuadricSurfacef::Edge*[4];
rkOct.m_apkVertex[3].m_apkEdge[0] = &rkOct.m_apkEdge[2];
rkOct.m_apkVertex[3].m_apkEdge[1] = &rkOct.m_apkEdge[5];
rkOct.m_apkVertex[3].m_apkEdge[2] = &rkOct.m_apkEdge[6];
rkOct.m_apkVertex[3].m_apkEdge[3] = &rkOct.m_apkEdge[10];
rkOct.m_apkVertex[4].m_pkPoint = new Vector3f;
rkOct.m_apkVertex[4].m_pkPoint->X() = 0.0f;
rkOct.m_apkVertex[4].m_pkPoint->Y() = -1.0f;
rkOct.m_apkVertex[4].m_pkPoint->Z() = 0.0f;
rkOct.m_apkVertex[4].m_iNumEdges = 4;
rkOct.m_apkVertex[4].m_apkEdge = new QuadricSurfacef::Edge*[4];
rkOct.m_apkVertex[4].m_apkEdge[0] = &rkOct.m_apkEdge[3];
rkOct.m_apkVertex[4].m_apkEdge[1] = &rkOct.m_apkEdge[6];
rkOct.m_apkVertex[4].m_apkEdge[2] = &rkOct.m_apkEdge[7];
rkOct.m_apkVertex[4].m_apkEdge[3] = &rkOct.m_apkEdge[11];
rkOct.m_apkVertex[5].m_pkPoint = new Vector3f;
rkOct.m_apkVertex[5].m_pkPoint->X() = 0.0f;
rkOct.m_apkVertex[5].m_pkPoint->Y() = 0.0f;
rkOct.m_apkVertex[5].m_pkPoint->Z() = -1.0f;
rkOct.m_apkVertex[5].m_iNumEdges = 4;
rkOct.m_apkVertex[5].m_apkEdge = new QuadricSurfacef::Edge*[4];
rkOct.m_apkVertex[5].m_apkEdge[0] = &rkOct.m_apkEdge[8];
rkOct.m_apkVertex[5].m_apkEdge[1] = &rkOct.m_apkEdge[9];
rkOct.m_apkVertex[5].m_apkEdge[2] = &rkOct.m_apkEdge[10];
rkOct.m_apkVertex[5].m_apkEdge[3] = &rkOct.m_apkEdge[11];
// edges
rkOct.m_apkEdge[0].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkEdge[0].m_apkVertex[1] = &rkOct.m_apkVertex[1];
rkOct.m_apkEdge[0].m_apkTriangle[0] = &rkOct.m_apkTriangle[3];
rkOct.m_apkEdge[0].m_apkTriangle[1] = &rkOct.m_apkTriangle[0];
rkOct.m_apkEdge[1].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkEdge[1].m_apkVertex[1] = &rkOct.m_apkVertex[2];
rkOct.m_apkEdge[1].m_apkTriangle[0] = &rkOct.m_apkTriangle[0];
rkOct.m_apkEdge[1].m_apkTriangle[1] = &rkOct.m_apkTriangle[1];
rkOct.m_apkEdge[2].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkEdge[2].m_apkVertex[1] = &rkOct.m_apkVertex[3];
rkOct.m_apkEdge[2].m_apkTriangle[0] = &rkOct.m_apkTriangle[1];
rkOct.m_apkEdge[2].m_apkTriangle[1] = &rkOct.m_apkTriangle[2];
rkOct.m_apkEdge[3].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkEdge[3].m_apkVertex[1] = &rkOct.m_apkVertex[4];
rkOct.m_apkEdge[3].m_apkTriangle[0] = &rkOct.m_apkTriangle[2];
rkOct.m_apkEdge[3].m_apkTriangle[1] = &rkOct.m_apkTriangle[3];
rkOct.m_apkEdge[4].m_apkVertex[0] = &rkOct.m_apkVertex[1];
rkOct.m_apkEdge[4].m_apkVertex[1] = &rkOct.m_apkVertex[2];
rkOct.m_apkEdge[4].m_apkTriangle[0] = &rkOct.m_apkTriangle[0];
rkOct.m_apkEdge[4].m_apkTriangle[1] = &rkOct.m_apkTriangle[4];
rkOct.m_apkEdge[5].m_apkVertex[0] = &rkOct.m_apkVertex[2];
rkOct.m_apkEdge[5].m_apkVertex[1] = &rkOct.m_apkVertex[3];
rkOct.m_apkEdge[5].m_apkTriangle[0] = &rkOct.m_apkTriangle[1];
rkOct.m_apkEdge[5].m_apkTriangle[1] = &rkOct.m_apkTriangle[5];
rkOct.m_apkEdge[6].m_apkVertex[0] = &rkOct.m_apkVertex[3];
rkOct.m_apkEdge[6].m_apkVertex[1] = &rkOct.m_apkVertex[4];
rkOct.m_apkEdge[6].m_apkTriangle[0] = &rkOct.m_apkTriangle[2];
rkOct.m_apkEdge[6].m_apkTriangle[1] = &rkOct.m_apkTriangle[6];
rkOct.m_apkEdge[7].m_apkVertex[0] = &rkOct.m_apkVertex[4];
rkOct.m_apkEdge[7].m_apkVertex[1] = &rkOct.m_apkVertex[1];
rkOct.m_apkEdge[7].m_apkTriangle[0] = &rkOct.m_apkTriangle[3];
rkOct.m_apkEdge[7].m_apkTriangle[1] = &rkOct.m_apkTriangle[7];
rkOct.m_apkEdge[8].m_apkVertex[0] = &rkOct.m_apkVertex[1];
rkOct.m_apkEdge[8].m_apkVertex[1] = &rkOct.m_apkVertex[5];
rkOct.m_apkEdge[8].m_apkTriangle[0] = &rkOct.m_apkTriangle[7];
rkOct.m_apkEdge[8].m_apkTriangle[1] = &rkOct.m_apkTriangle[4];
rkOct.m_apkEdge[9].m_apkVertex[0] = &rkOct.m_apkVertex[2];
rkOct.m_apkEdge[9].m_apkVertex[1] = &rkOct.m_apkVertex[5];
rkOct.m_apkEdge[9].m_apkTriangle[0] = &rkOct.m_apkTriangle[4];
rkOct.m_apkEdge[9].m_apkTriangle[1] = &rkOct.m_apkTriangle[5];
rkOct.m_apkEdge[10].m_apkVertex[0] = &rkOct.m_apkVertex[3];
rkOct.m_apkEdge[10].m_apkVertex[1] = &rkOct.m_apkVertex[5];
rkOct.m_apkEdge[10].m_apkTriangle[0] = &rkOct.m_apkTriangle[5];
rkOct.m_apkEdge[10].m_apkTriangle[1] = &rkOct.m_apkTriangle[6];
rkOct.m_apkEdge[11].m_apkVertex[0] = &rkOct.m_apkVertex[4];
rkOct.m_apkEdge[11].m_apkVertex[1] = &rkOct.m_apkVertex[5];
rkOct.m_apkEdge[11].m_apkTriangle[0] = &rkOct.m_apkTriangle[6];
rkOct.m_apkEdge[11].m_apkTriangle[1] = &rkOct.m_apkTriangle[7];
// triangles
rkOct.m_apkTriangle[0].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkTriangle[0].m_apkVertex[1] = &rkOct.m_apkVertex[1];
rkOct.m_apkTriangle[0].m_apkVertex[2] = &rkOct.m_apkVertex[2];
rkOct.m_apkTriangle[0].m_apkEdge[0] = &rkOct.m_apkEdge[0];
rkOct.m_apkTriangle[0].m_apkEdge[1] = &rkOct.m_apkEdge[4];
rkOct.m_apkTriangle[0].m_apkEdge[2] = &rkOct.m_apkEdge[1];
rkOct.m_apkTriangle[0].m_apkAdjacent[0] = &rkOct.m_apkTriangle[3];
rkOct.m_apkTriangle[0].m_apkAdjacent[1] = &rkOct.m_apkTriangle[4];
rkOct.m_apkTriangle[0].m_apkAdjacent[2] = &rkOct.m_apkTriangle[1];
rkOct.m_apkTriangle[1].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkTriangle[1].m_apkVertex[1] = &rkOct.m_apkVertex[2];
rkOct.m_apkTriangle[1].m_apkVertex[2] = &rkOct.m_apkVertex[3];
rkOct.m_apkTriangle[1].m_apkEdge[0] = &rkOct.m_apkEdge[1];
rkOct.m_apkTriangle[1].m_apkEdge[1] = &rkOct.m_apkEdge[5];
rkOct.m_apkTriangle[1].m_apkEdge[2] = &rkOct.m_apkEdge[2];
rkOct.m_apkTriangle[1].m_apkAdjacent[0] = &rkOct.m_apkTriangle[0];
rkOct.m_apkTriangle[1].m_apkAdjacent[1] = &rkOct.m_apkTriangle[5];
rkOct.m_apkTriangle[1].m_apkAdjacent[2] = &rkOct.m_apkTriangle[2];
rkOct.m_apkTriangle[2].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkTriangle[2].m_apkVertex[1] = &rkOct.m_apkVertex[3];
rkOct.m_apkTriangle[2].m_apkVertex[2] = &rkOct.m_apkVertex[4];
rkOct.m_apkTriangle[2].m_apkEdge[0] = &rkOct.m_apkEdge[2];
rkOct.m_apkTriangle[2].m_apkEdge[1] = &rkOct.m_apkEdge[6];
rkOct.m_apkTriangle[2].m_apkEdge[2] = &rkOct.m_apkEdge[3];
rkOct.m_apkTriangle[2].m_apkAdjacent[0] = &rkOct.m_apkTriangle[1];
rkOct.m_apkTriangle[2].m_apkAdjacent[1] = &rkOct.m_apkTriangle[6];
rkOct.m_apkTriangle[2].m_apkAdjacent[2] = &rkOct.m_apkTriangle[3];
rkOct.m_apkTriangle[3].m_apkVertex[0] = &rkOct.m_apkVertex[0];
rkOct.m_apkTriangle[3].m_apkVertex[1] = &rkOct.m_apkVertex[4];
rkOct.m_apkTriangle[3].m_apkVertex[2] = &rkOct.m_apkVertex[1];
rkOct.m_apkTriangle[3].m_apkEdge[0] = &rkOct.m_apkEdge[3];
rkOct.m_apkTriangle[3].m_apkEdge[1] = &rkOct.m_apkEdge[7];
rkOct.m_apkTriangle[3].m_apkEdge[2] = &rkOct.m_apkEdge[0];
rkOct.m_apkTriangle[3].m_apkAdjacent[0] = &rkOct.m_apkTriangle[2];
rkOct.m_apkTriangle[3].m_apkAdjacent[1] = &rkOct.m_apkTriangle[7];
rkOct.m_apkTriangle[3].m_apkAdjacent[2] = &rkOct.m_apkTriangle[0];
rkOct.m_apkTriangle[4].m_apkVertex[0] = &rkOct.m_apkVertex[5];
rkOct.m_apkTriangle[4].m_apkVertex[1] = &rkOct.m_apkVertex[2];
rkOct.m_apkTriangle[4].m_apkVertex[2] = &rkOct.m_apkVertex[1];
rkOct.m_apkTriangle[4].m_apkEdge[0] = &rkOct.m_apkEdge[9];
rkOct.m_apkTriangle[4].m_apkEdge[1] = &rkOct.m_apkEdge[4];
rkOct.m_apkTriangle[4].m_apkEdge[2] = &rkOct.m_apkEdge[8];
rkOct.m_apkTriangle[4].m_apkAdjacent[0] = &rkOct.m_apkTriangle[5];
rkOct.m_apkTriangle[4].m_apkAdjacent[1] = &rkOct.m_apkTriangle[0];
rkOct.m_apkTriangle[4].m_apkAdjacent[2] = &rkOct.m_apkTriangle[7];
rkOct.m_apkTriangle[5].m_apkVertex[0] = &rkOct.m_apkVertex[5];
rkOct.m_apkTriangle[5].m_apkVertex[1] = &rkOct.m_apkVertex[3];
rkOct.m_apkTriangle[5].m_apkVertex[2] = &rkOct.m_apkVertex[2];
rkOct.m_apkTriangle[5].m_apkEdge[0] = &rkOct.m_apkEdge[10];
rkOct.m_apkTriangle[5].m_apkEdge[1] = &rkOct.m_apkEdge[5];
rkOct.m_apkTriangle[5].m_apkEdge[2] = &rkOct.m_apkEdge[9];
rkOct.m_apkTriangle[5].m_apkAdjacent[0] = &rkOct.m_apkTriangle[6];
rkOct.m_apkTriangle[5].m_apkAdjacent[1] = &rkOct.m_apkTriangle[1];
rkOct.m_apkTriangle[5].m_apkAdjacent[2] = &rkOct.m_apkTriangle[4];
rkOct.m_apkTriangle[6].m_apkVertex[0] = &rkOct.m_apkVertex[5];
rkOct.m_apkTriangle[6].m_apkVertex[1] = &rkOct.m_apkVertex[4];
rkOct.m_apkTriangle[6].m_apkVertex[2] = &rkOct.m_apkVertex[3];
rkOct.m_apkTriangle[6].m_apkEdge[0] = &rkOct.m_apkEdge[11];
rkOct.m_apkTriangle[6].m_apkEdge[1] = &rkOct.m_apkEdge[6];
rkOct.m_apkTriangle[6].m_apkEdge[2] = &rkOct.m_apkEdge[10];
rkOct.m_apkTriangle[6].m_apkAdjacent[0] = &rkOct.m_apkTriangle[7];
rkOct.m_apkTriangle[6].m_apkAdjacent[1] = &rkOct.m_apkTriangle[2];
rkOct.m_apkTriangle[6].m_apkAdjacent[2] = &rkOct.m_apkTriangle[5];
rkOct.m_apkTriangle[7].m_apkVertex[0] = &rkOct.m_apkVertex[5];
rkOct.m_apkTriangle[7].m_apkVertex[1] = &rkOct.m_apkVertex[1];
rkOct.m_apkTriangle[7].m_apkVertex[2] = &rkOct.m_apkVertex[4];
rkOct.m_apkTriangle[7].m_apkEdge[0] = &rkOct.m_apkEdge[8];
rkOct.m_apkTriangle[7].m_apkEdge[1] = &rkOct.m_apkEdge[7];
rkOct.m_apkTriangle[7].m_apkEdge[2] = &rkOct.m_apkEdge[11];
rkOct.m_apkTriangle[7].m_apkAdjacent[0] = &rkOct.m_apkTriangle[4];
rkOct.m_apkTriangle[7].m_apkAdjacent[1] = &rkOct.m_apkTriangle[3];
rkOct.m_apkTriangle[7].m_apkAdjacent[2] = &rkOct.m_apkTriangle[6];
// For testing purposes, but not necessary for the algorithm. This
// allows the display program to show the subdivision structure.
for (int i = 0; i < 12; i++)
rkOct.m_apkEdge[i].m_iStep = 0;
}
//----------------------------------------------------------------------------
void SphereTessellation::ProjectPoint (const Vector3f& rkPoint, int& riX,
int& riY) const
{
// projection plane is Dot(eye,(x,y,z)) = -4
if ( m_bPerspective )
{
// perspective projection
float fT = 8.0f/(4.0f-m_kEye.Dot(rkPoint));
Vector3f kProj = (1.0f-fT)*m_kEye + fT*rkPoint;
Vector3f kDir = kProj + m_kEye;
Vector3f kProd = kDir*m_kRot;
riX = g_iSize/4 + (int)((g_iSize/8)*(kProd.X() + 2.0f));
riY = g_iSize/4 + (int)((g_iSize/8)*(kProd.Y() + 2.0f));
}
else
{
// parallel projection
Vector3f kDir = rkPoint + m_kEye;
Vector3f kProd = kDir*m_kRot;
riX = (int)((g_iSize/4)*(kProd.X() + 2.0f));
riY = (int)((g_iSize/4)*(kProd.Y() + 2.0f));
}
}
//----------------------------------------------------------------------------
void SphereTessellation::DrawPolyhedron ()
{
for (int i = 0; i < m_kPoly.m_iNumEdges; i++)
{
const Vector3f* pkP0 = m_kPoly.m_apkEdge[i].m_apkVertex[0]->m_pkPoint;
int iX0, iY0;
ProjectPoint(*pkP0,iX0,iY0);
const Vector3f* pkP1 = m_kPoly.m_apkEdge[i].m_apkVertex[1]->m_pkPoint;
int iX1, iY1;
ProjectPoint(*pkP1,iX1,iY1);
int iIndex = m_kPoly.m_apkEdge[i].m_iStep % 4;
DrawLine(iX0,iY0,iX1,iY1,ms_akColor[iIndex]);
}
}
//----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -