enum EdgeLabel{ UndoneEdge, MovedEdge, FixedEdge, DividedEdge }; class Edge{ public: int birthStage; class Face *face[2]; Vertex *vertex[2]; EdgeLabel label; Vertex *newVertex; Edge *parent; Edge *children[2]; Edge(){ birthStage = 0; face[0] = face[1] = NULL; vertex[0] = vertex[1] = newVertex = NULL; label = FixedEdge; parent = children[0] = children[1] = NULL; } Vertex *primaryVertex( Face &face ); // face.h double distance( Vector &p0, Vector &p1 ){ Line e( vertex[0]->position, vertex[1]->position ); double d0 = e.distance( p0 ); double d1 = e.distance( p1); return d0 > d1 ? d0 : d1; } //renew Edge(Face * &children0, Face * &children1, int birthStage ){ this->birthStage = birthStage; face[0] = children0; face[1] = children1; vertex[0] = vertex[1] = newVertex = NULL; label = FixedEdge; parent = children[0] = children[1] = NULL; } Edge( Edge &parentEdge, int birthStage ){ this->birthStage = birthStage; face[0] = parentEdge.face[0]; face[1] = parentEdge.face[1]; vertex[0] = vertex[1] = newVertex = NULL; parent = &parentEdge; children[0] = children[1] = NULL; } Face *connectFace( Face &face ){ return &face == this->face[0] ? this->face[1] : this->face[0]; } void renew( int birthStage, Fold &fold ){ if( label != UndoneEdge ) return; if( vertex[0]->label == Moved && vertex[1]->label == Fixed || vertex[1]->label == Moved && vertex[0]->label == Fixed ){ label = DividedEdge; children[0] = new Edge( *this, birthStage ); children[1] = new Edge( *this, birthStage ); newVertex = new Vertex( *vertex[0], *vertex[1], birthStage, fold ); children[0]->vertex[0] = vertex[0]; children[0]->vertex[1] = newVertex; children[1]->vertex[0] = newVertex; children[1]->vertex[1] = vertex[1]; children[0]->label = vertex[0]->label == Moved ? MovedEdge : FixedEdge; children[1]->label = vertex[1]->label == Moved ? MovedEdge : FixedEdge; }else if( vertex[0]->label == Moved || vertex[1]->label == Moved ){ label = MovedEdge; }else{ label = FixedEdge; } } void renewPointer(); // face.h //reset void resetPointer( int deleteStage ); // face.h ~Edge(){ if( newVertex != NULL ) delete newVertex; } void reset( int deleteStage ){ if( vertex[0]->child != NULL ){ delete vertex[0]->child; vertex[0]->child = NULL; } if( vertex[1]->child != NULL ){ delete vertex[1]->child; vertex[1]->child = NULL; } if( children[0] != NULL ){ delete children[0]; children[0] = NULL; } if( children[1] != NULL ){ delete children[1]; children[1] = NULL; } if( newVertex != NULL ){ delete newVertex; newVertex = NULL; } } void print(){ printf( "birthStage %d\n", birthStage ); switch( label ){ case MovedEdge: printf( "MovedEdge\n" ); break; case FixedEdge: printf( "FixedEdge\n" ); break; case DividedEdge: printf( "DividedEdge\n" ); break; case UndoneEdge: printf( "UndoneEdge\n" ); break; } if( face[0] == NULL ) printf( "Face0 None\n" ); else printf( "Face0 Exist\n" ); if( face[1] == NULL ) printf( "Face1 None\n" ); else printf( "Face1 Exist\n" ); for( int i=0; i<2; i++ ){ switch( vertex[i]->label ){ case Moved: printf( "MovedVertex " ); break; case Fixed: printf( "FixedVertex " ); break; case OnAxis: printf( "OnAxis " ); break; } vertex[i]->position.print(); } } };