示例#1
0
void BSTPrint (const BSTree root, int n) 
{
    if (!root) return ;
    BSTPrint (root->RChild, n+1);
    int     i;
    for (i = 0; i < n; i++) 
        printf ("    ");
    printf ("%d\n", root->data.key);
    BSTPrint (root->LChild, n+1); 
}
void BSTPrint(BSTNode* node) {
	//Check for null case
	if (node == NULL) { std::cout << "-" << std::endl; return; }
	//Print left children
	if (node->left != NULL) BSTPrint(node->left);
	//Print self
	std::cout << "Edge: " << node->edge->start->id << std::endl;
	//Print right children
	if (node->right != NULL) BSTPrint(node->right);
}
GLint* TriangulatePolygon(const std::list<WCVector4> &pointList) {
	//Create vertex structs for each point
	std::list<WCVector4>::const_iterator pointIter = pointList.begin();
	std::list<TriangulateVertex*> priorityQueue;
	int id = 0;
	TriangulateVertex *vert, *rightVert = NULL;
	TriangulateEdge *edge;
	//Process remaining vertices
	for (pointIter = pointList.begin(); pointIter != pointList.end(); pointIter++) {
		//Create the new vertex
		vert = new TriangulateVertex();
		//See about cleaning up last vert
		if (rightVert != NULL) rightVert->left = vert;
		vert->id = id++;
		vert->vertex = *pointIter;
		vert->right = rightVert;
		//Setup edge and add to vector
		edge = new TriangulateEdge();
		vert->edge = edge;
		//Add vertex to list and vector
		priorityQueue.push_back(vert);
		//Swap vert into rightVert
		rightVert = vert;
	}
	//Clean up first and last verts
	priorityQueue.front()->right = priorityQueue.back();
	priorityQueue.back()->left = priorityQueue.front();
	
	std::list<TriangulateVertex*>::iterator vertIter;
	//Finish setting up edges
	for (vertIter = priorityQueue.begin(); vertIter != priorityQueue.end(); vertIter++) {
		//Set all of the edge properties
		edge = (*vertIter)->edge;
		edge->helper = NULL;
		edge->start = (*vertIter);
		edge->end = (*vertIter)->left;
		edge->cw = edge->end->edge;
		edge->ccw = edge->start->right->edge;
		//Show some info
		std::cout << "Edge(" << edge << ") -  S:" << edge->start->id << ", E:" << edge->end->id << std::endl;
		std::cout << "\tHelper: " << edge->helper << ", CW: " << edge->cw << ", CCW: " << edge->ccw << std::endl;
	}
	
	//Sort the vertices
	TriangulateSort(priorityQueue);
	
	
	//Determine the type of each vertex
	for (vertIter = priorityQueue.begin(); vertIter != priorityQueue.end(); vertIter++) {
		TriangulateDetermineType( *vertIter );
		std::cout << "Vert(" << *vertIter << "): " << (*vertIter)->id << ", " << (*vertIter)->type << " :: " << (*vertIter)->vertex << std::endl;
		std::cout << "\tEdge: " << (*vertIter)->edge << ", Left: " << (*vertIter)->left << ", Right: " << (*vertIter)->right << std::endl;
	}
	
	//Process first vertex and create Binary Search Tree
	BSTNode *bstRoot = NULL;
	BSTPrint(bstRoot);
	//Loop until all vertices have been handled
	while (priorityQueue.size() != 0) {
		//Get the next vertex
		vert = priorityQueue.front();
		priorityQueue.pop_front();
		//Handle the vertex
		switch(vert->type) {
			case TRIANGULATIONTYPE_REGULAR: TriangulateHandleRegular(vert, bstRoot); break;
			case TRIANGULATIONTYPE_START: TriangulateHandleStart(vert, bstRoot); break;
			case TRIANGULATIONTYPE_END: TriangulateHandleEnd(vert, bstRoot); break;
			case TRIANGULATIONTYPE_SPLIT: TriangulateHandleSplit(vert, bstRoot); break;
			case TRIANGULATIONTYPE_MERGE: TriangulateHandleMerge(vert, bstRoot); break;
		}
		//Print the tree (left-to-right)
		BSTPrint(bstRoot);
	}
	
	//Now we have monotone polynomials in the edges, so triangulate
	
	//...
	
	exit(0);
	//Delete edge lists
	//...
	return NULL;
}