📄 testquadricsurface.cpp
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement. The various license agreements may be found at
// the Magic Software web site. This file is subject to the license
//
// FREE SOURCE CODE
// http://www.magic-software.com/License.html/free.pdf
#include <windows.h>
#include "MgcQuadricSurface.h"
#define WSIZE 512
//#define PERSPECTIVE
#define CreatePoly CreateOctahedron
//#define CreatePoly CreateTetrahedron
//---------------------------------------------------------------------------
void CreateTetrahedron (MgcQuadricSurface::ConvexPolyhedron& rkTetra)
{
rkTetra.m_iNumVertices = 4;
rkTetra.m_apkVertex = new MgcQuadricSurface::Vertex[4];
rkTetra.m_iNumEdges = 6;
rkTetra.m_apkEdge = new MgcQuadricSurface::Edge[6];
rkTetra.m_iNumTriangles = 4;
rkTetra.m_apkTriangle = new MgcQuadricSurface::Triangle[4];
// vertices
rkTetra.m_apkVertex[0].m_pkPoint = new MgcVector3;
rkTetra.m_apkVertex[0].m_pkPoint->x = 1.0;
rkTetra.m_apkVertex[0].m_pkPoint->y = 0.0;
rkTetra.m_apkVertex[0].m_pkPoint->z = 0.0;
rkTetra.m_apkVertex[0].m_iNumEdges = 3;
rkTetra.m_apkVertex[0].m_apkEdge = new MgcQuadricSurface::Edge*[3];
rkTetra.m_apkVertex[0].m_apkEdge[0] = &rkTetra.m_apkEdge[0];
rkTetra.m_apkVertex[0].m_apkEdge[1] = &rkTetra.m_apkEdge[2];
rkTetra.m_apkVertex[0].m_apkEdge[2] = &rkTetra.m_apkEdge[3];
rkTetra.m_apkVertex[1].m_pkPoint = new MgcVector3;
rkTetra.m_apkVertex[1].m_pkPoint->x = 0.0;
rkTetra.m_apkVertex[1].m_pkPoint->y = 1.0;
rkTetra.m_apkVertex[1].m_pkPoint->z = 0.0;
rkTetra.m_apkVertex[1].m_iNumEdges = 3;
rkTetra.m_apkVertex[1].m_apkEdge = new MgcQuadricSurface::Edge*[3];
rkTetra.m_apkVertex[1].m_apkEdge[0] = &rkTetra.m_apkEdge[0];
rkTetra.m_apkVertex[1].m_apkEdge[1] = &rkTetra.m_apkEdge[1];
rkTetra.m_apkVertex[1].m_apkEdge[2] = &rkTetra.m_apkEdge[4];
rkTetra.m_apkVertex[2].m_pkPoint = new MgcVector3;
rkTetra.m_apkVertex[2].m_pkPoint->x = 0.0;
rkTetra.m_apkVertex[2].m_pkPoint->y = 0.0;
rkTetra.m_apkVertex[2].m_pkPoint->z = 1.0;
rkTetra.m_apkVertex[2].m_iNumEdges = 3;
rkTetra.m_apkVertex[2].m_apkEdge = new MgcQuadricSurface::Edge*[3];
rkTetra.m_apkVertex[2].m_apkEdge[0] = &rkTetra.m_apkEdge[1];
rkTetra.m_apkVertex[2].m_apkEdge[1] = &rkTetra.m_apkEdge[2];
rkTetra.m_apkVertex[2].m_apkEdge[2] = &rkTetra.m_apkEdge[5];
rkTetra.m_apkVertex[3].m_pkPoint = new MgcVector3;
rkTetra.m_apkVertex[3].m_pkPoint->x = MgcMath::Sqrt(1.0/3.0);
rkTetra.m_apkVertex[3].m_pkPoint->y = MgcMath::Sqrt(1.0/3.0);
rkTetra.m_apkVertex[3].m_pkPoint->z = MgcMath::Sqrt(1.0/3.0);
rkTetra.m_apkVertex[3].m_iNumEdges = 3;
rkTetra.m_apkVertex[3].m_apkEdge = new MgcQuadricSurface::Edge*[3];
rkTetra.m_apkVertex[3].m_apkEdge[0] = &rkTetra.m_apkEdge[3];
rkTetra.m_apkVertex[3].m_apkEdge[1] = &rkTetra.m_apkEdge[4];
rkTetra.m_apkVertex[3].m_apkEdge[2] = &rkTetra.m_apkEdge[5];
// edges
rkTetra.m_apkEdge[0].m_apkVertex[0] = &rkTetra.m_apkVertex[0];
rkTetra.m_apkEdge[0].m_apkVertex[1] = &rkTetra.m_apkVertex[1];
rkTetra.m_apkEdge[0].m_apkTriangle[0] = &rkTetra.m_apkTriangle[0];
rkTetra.m_apkEdge[0].m_apkTriangle[1] = &rkTetra.m_apkTriangle[1];
rkTetra.m_apkEdge[1].m_apkVertex[0] = &rkTetra.m_apkVertex[1];
rkTetra.m_apkEdge[1].m_apkVertex[1] = &rkTetra.m_apkVertex[2];
rkTetra.m_apkEdge[1].m_apkTriangle[0] = &rkTetra.m_apkTriangle[0];
rkTetra.m_apkEdge[1].m_apkTriangle[1] = &rkTetra.m_apkTriangle[2];
rkTetra.m_apkEdge[2].m_apkVertex[0] = &rkTetra.m_apkVertex[2];
rkTetra.m_apkEdge[2].m_apkVertex[1] = &rkTetra.m_apkVertex[0];
rkTetra.m_apkEdge[2].m_apkTriangle[0] = &rkTetra.m_apkTriangle[0];
rkTetra.m_apkEdge[2].m_apkTriangle[1] = &rkTetra.m_apkTriangle[3];
rkTetra.m_apkEdge[3].m_apkVertex[0] = &rkTetra.m_apkVertex[0];
rkTetra.m_apkEdge[3].m_apkVertex[1] = &rkTetra.m_apkVertex[3];
rkTetra.m_apkEdge[3].m_apkTriangle[0] = &rkTetra.m_apkTriangle[1];
rkTetra.m_apkEdge[3].m_apkTriangle[1] = &rkTetra.m_apkTriangle[3];
rkTetra.m_apkEdge[4].m_apkVertex[0] = &rkTetra.m_apkVertex[1];
rkTetra.m_apkEdge[4].m_apkVertex[1] = &rkTetra.m_apkVertex[3];
rkTetra.m_apkEdge[4].m_apkTriangle[0] = &rkTetra.m_apkTriangle[1];
rkTetra.m_apkEdge[4].m_apkTriangle[1] = &rkTetra.m_apkTriangle[2];
rkTetra.m_apkEdge[5].m_apkVertex[0] = &rkTetra.m_apkVertex[2];
rkTetra.m_apkEdge[5].m_apkVertex[1] = &rkTetra.m_apkVertex[3];
rkTetra.m_apkEdge[5].m_apkTriangle[0] = &rkTetra.m_apkTriangle[2];
rkTetra.m_apkEdge[5].m_apkTriangle[1] = &rkTetra.m_apkTriangle[3];
// triangles
rkTetra.m_apkTriangle[0].m_apkVertex[0] = &rkTetra.m_apkVertex[0];
rkTetra.m_apkTriangle[0].m_apkVertex[1] = &rkTetra.m_apkVertex[2];
rkTetra.m_apkTriangle[0].m_apkVertex[2] = &rkTetra.m_apkVertex[1];
rkTetra.m_apkTriangle[0].m_apkEdge[0] = &rkTetra.m_apkEdge[2];
rkTetra.m_apkTriangle[0].m_apkEdge[1] = &rkTetra.m_apkEdge[1];
rkTetra.m_apkTriangle[0].m_apkEdge[2] = &rkTetra.m_apkEdge[0];
rkTetra.m_apkTriangle[0].m_apkAdjacent[0] = &rkTetra.m_apkTriangle[3];
rkTetra.m_apkTriangle[0].m_apkAdjacent[1] = &rkTetra.m_apkTriangle[2];
rkTetra.m_apkTriangle[0].m_apkAdjacent[2] = &rkTetra.m_apkTriangle[1];
rkTetra.m_apkTriangle[1].m_apkVertex[0] = &rkTetra.m_apkVertex[0];
rkTetra.m_apkTriangle[1].m_apkVertex[1] = &rkTetra.m_apkVertex[1];
rkTetra.m_apkTriangle[1].m_apkVertex[2] = &rkTetra.m_apkVertex[3];
rkTetra.m_apkTriangle[1].m_apkEdge[0] = &rkTetra.m_apkEdge[0];
rkTetra.m_apkTriangle[1].m_apkEdge[1] = &rkTetra.m_apkEdge[4];
rkTetra.m_apkTriangle[1].m_apkEdge[2] = &rkTetra.m_apkEdge[3];
rkTetra.m_apkTriangle[1].m_apkAdjacent[0] = &rkTetra.m_apkTriangle[0];
rkTetra.m_apkTriangle[1].m_apkAdjacent[1] = &rkTetra.m_apkTriangle[2];
rkTetra.m_apkTriangle[1].m_apkAdjacent[2] = &rkTetra.m_apkTriangle[3];
rkTetra.m_apkTriangle[2].m_apkVertex[0] = &rkTetra.m_apkVertex[1];
rkTetra.m_apkTriangle[2].m_apkVertex[1] = &rkTetra.m_apkVertex[2];
rkTetra.m_apkTriangle[2].m_apkVertex[2] = &rkTetra.m_apkVertex[3];
rkTetra.m_apkTriangle[2].m_apkEdge[0] = &rkTetra.m_apkEdge[1];
rkTetra.m_apkTriangle[2].m_apkEdge[1] = &rkTetra.m_apkEdge[5];
rkTetra.m_apkTriangle[2].m_apkEdge[2] = &rkTetra.m_apkEdge[4];
rkTetra.m_apkTriangle[2].m_apkAdjacent[0] = &rkTetra.m_apkTriangle[0];
rkTetra.m_apkTriangle[2].m_apkAdjacent[1] = &rkTetra.m_apkTriangle[3];
rkTetra.m_apkTriangle[2].m_apkAdjacent[2] = &rkTetra.m_apkTriangle[1];
rkTetra.m_apkTriangle[3].m_apkVertex[0] = &rkTetra.m_apkVertex[0];
rkTetra.m_apkTriangle[3].m_apkVertex[1] = &rkTetra.m_apkVertex[3];
rkTetra.m_apkTriangle[3].m_apkVertex[2] = &rkTetra.m_apkVertex[2];
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_uiStep = 0;
}
//---------------------------------------------------------------------------
void CreateOctahedron (MgcQuadricSurface::ConvexPolyhedron& rkOct)
{
rkOct.m_iNumVertices = 6;
rkOct.m_apkVertex = new MgcQuadricSurface::Vertex[6];
rkOct.m_iNumEdges = 12;
rkOct.m_apkEdge = new MgcQuadricSurface::Edge[12];
rkOct.m_iNumTriangles = 8;
rkOct.m_apkTriangle = new MgcQuadricSurface::Triangle[8];
// vertices
rkOct.m_apkVertex[0].m_pkPoint = new MgcVector3;
rkOct.m_apkVertex[0].m_pkPoint->x = 0.0;
rkOct.m_apkVertex[0].m_pkPoint->y = 0.0;
rkOct.m_apkVertex[0].m_pkPoint->z = 1.0;
rkOct.m_apkVertex[0].m_iNumEdges = 4;
rkOct.m_apkVertex[0].m_apkEdge = new MgcQuadricSurface::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 MgcVector3;
rkOct.m_apkVertex[1].m_pkPoint->x = 1.0;
rkOct.m_apkVertex[1].m_pkPoint->y = 0.0;
rkOct.m_apkVertex[1].m_pkPoint->z = 0.0;
rkOct.m_apkVertex[1].m_iNumEdges = 4;
rkOct.m_apkVertex[1].m_apkEdge = new MgcQuadricSurface::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 MgcVector3;
rkOct.m_apkVertex[2].m_pkPoint->x = 0.0;
rkOct.m_apkVertex[2].m_pkPoint->y = 1.0;
rkOct.m_apkVertex[2].m_pkPoint->z = 0.0;
rkOct.m_apkVertex[2].m_iNumEdges = 4;
rkOct.m_apkVertex[2].m_apkEdge = new MgcQuadricSurface::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 MgcVector3;
rkOct.m_apkVertex[3].m_pkPoint->x = -1.0;
rkOct.m_apkVertex[3].m_pkPoint->y = 0.0;
rkOct.m_apkVertex[3].m_pkPoint->z = 0.0;
rkOct.m_apkVertex[3].m_iNumEdges = 4;
rkOct.m_apkVertex[3].m_apkEdge = new MgcQuadricSurface::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 MgcVector3;
rkOct.m_apkVertex[4].m_pkPoint->x = 0.0;
rkOct.m_apkVertex[4].m_pkPoint->y = -1.0;
rkOct.m_apkVertex[4].m_pkPoint->z = 0.0;
rkOct.m_apkVertex[4].m_iNumEdges = 4;
rkOct.m_apkVertex[4].m_apkEdge = new MgcQuadricSurface::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 MgcVector3;
rkOct.m_apkVertex[5].m_pkPoint->x = 0.0;
rkOct.m_apkVertex[5].m_pkPoint->y = 0.0;
rkOct.m_apkVertex[5].m_pkPoint->z = -1.0;
rkOct.m_apkVertex[5].m_iNumEdges = 4;
rkOct.m_apkVertex[5].m_apkEdge = new MgcQuadricSurface::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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -