bool Triangulator::RemoveAnyEdge(_Internal::_edge* e)
	{
		_Internal::_edge* bedge = NULL;
		_Internal::_edge* hedge = NULL;
		if(e->type == _Internal::Inside) e->type = _Internal::Hole; //after removal, a hole will be created.
		for(int k=0; k<2; ++k)
		{
			if(e->faces[k])
			{
				for(int i=0; i<3; ++i)
				{
					if(bedge == NULL && e->faces[k]->edges[i]->type == _Internal::Boundary)
					{
						bedge = e->faces[k]->edges[i];
					}
					if(hedge == NULL && e->faces[k]->edges[i]->type == _Internal::Hole)
					{
						hedge = e->faces[k]->edges[i];
					}
				}
			}
		}
		_Internal::_edge* dominant = e;
		if(bedge) 
		{
			dominant = bedge;
		}
		else if(hedge)
		{
			dominant = hedge;
		}
		for(int k=0; k<2; ++k)
		{
			_Internal::_triangle* tr = e->faces[k]; //a triangle to be removed
			if(tr == NULL) continue;

			//remove this triangle from three edges forming the triangle.
			for(int i=0; i<3; ++i)
			{
				tr->edges[i]->type = dominant->type;
				merge(dominant->node, tr->edges[i]->node);
				tr->edges[i]->RemoveFace(tr);
			}
			vector<_Internal::_triangle*>::iterator itf = find(faces.begin(), faces.end(), tr);
			assert(itf != faces.end());
			faces.erase(itf);
			deleted_faces.push_back(tr);
		}
		for(int i=0; i<edges.size(); ++i)
		{
			if(findset(dominant->node)==findset(edges[i]->node))
			{
				edges[i]->type = dominant->type;
			}
		}
		_DeleteEdge(e);
		return true;
	}
	bool Triangulator::RemoveIsolatedEdge(_Internal::_edge* e)
	{
		if(e->faces[0]==NULL && e->faces[1]==NULL) 
		{
			_DeleteEdge(e);
			return true;
		}
		else
		{
			return false;
		}
	}
	bool Triangulator::RemoveSafeEdge(_Internal::_edge* e)
	{
		if(isSafe(e)) //only a boundary edge can be removed.
		{
			_Internal::_triangle* tr = e->faces[0]; //a triangle to be removed
			for(int i=0; i<3; ++i)
			{
				tr->edges[i]->RemoveFace(tr);
				tr->edges[i]->type == _Internal::Boundary;
			}
			_DeleteEdge(e);
			vector<_Internal::_triangle*>::iterator it = find(faces.begin(), faces.end(), tr);
			assert(it != faces.end());
			faces.erase(it);
			deleted_faces.push_back(tr);
			//delete tr;
		}
		else
		{
			return false;
		}
	}