docs: boolean orderNodes( FastQueue<Node> corners , GridInfo info ) {
  
  		// Find a node with just two edges. This is a corner and will be the arbitrary origin in our graph
  		Node seed = null;
  		for (int i = 0; i < corners.size; i++) {
  			Node n = corners.get(i);
  			if( n.countEdges() == 2 ) {
  				seed = n;
  				break;
  			}
  		}
  		if( seed == null ) {
  			if( verbose != null ) verbose.println("Can't find a corner with just two edges. Aborting");
  			return false;
  		}
  
  		// find one edge and mark that as the row direction
  		int rowEdge = 0;
  		while( seed.edges[rowEdge] == null )
  			rowEdge = (rowEdge+1)%4;
  		int colEdge = (rowEdge+1)%4;
  		while( seed.edges[colEdge] == null )
  			colEdge = (colEdge+2)%4;
  
  		// if it's left handed swap the row and column direction
  		if( !isRightHanded(seed,rowEdge,colEdge)) {
  			int tmp = rowEdge;
  			rowEdge = colEdge;
  			colEdge = tmp;
  		}
  
  		// add the corns to list in a row major order
  		while( seed != null ) {
  			int before = info.nodes.size();
  			Node n = seed;
  			do {
  				info.nodes.add(n);
  				n = n.edges[colEdge];
  			} while( n != null );
  
  			seed = seed.edges[rowEdge];
  
  			if( info.cols == -1 ) {
  				info.cols = info.nodes.size();
  			} else {
  				int columnsInRow = info.nodes.size()-before;
  				if( columnsInRow != info.cols ) {
  					if( verbose != null ) verbose.println("Number of columns in each row is variable");
  					return false;
  				}
  			}
  		}
  		info.rows = info.nodes.size()/info.cols;
  		return true;
  	}