docs: private void convertToOutput(List<ChessboardCorner> corners) {
  
  		c2n.resize(corners.size());
  		n2c.resize(vertexes.size());
  		open.reset();
  		n2c.fill(-1);
  		c2n.fill(-1);
  
  		for (int seedIdx = 0; seedIdx < vertexes.size; seedIdx++) {
  			Vertex seedN = vertexes.get(seedIdx);
  			if( seedN.marked)
  				continue;
  			ChessboardCornerGraph graph = clusters.grow();
  			graph.reset();
  
  			// traverse the graph and add all the nodes in this cluster
  			growCluster(corners, seedIdx, graph);
  
  			// Connect the nodes together in the output graph
  			for (int i = 0; i < graph.corners.size; i++) {
  				ChessboardCornerGraph.Node gn = graph.corners.get(i);
  				Vertex n = vertexes.get( n2c.get(i) );
  
  				for (int j = 0; j < n.connections.size(); j++) {
  					int edgeCornerIdx = n.connections.get(j).dst.index;
  					int outputIdx = c2n.get( edgeCornerIdx );
  					if( outputIdx == -1 ) {
  						throw new IllegalArgumentException("Edge to node not in the graph. n.idx="+n.index+" conn.idx="+edgeCornerIdx);
  					}
  					gn.edges[j] = graph.corners.get(outputIdx);
  				}
  			}
  
  			// ensure arrays are all -1 again for sanity checks
  			for (int i = 0; i < graph.corners.size; i++) {
  				ChessboardCornerGraph.Node gn = graph.corners.get(i);
  				int indexCorner = n2c.get(gn.index);
  				c2n.data[indexCorner] = -1;
  				n2c.data[gn.index] = -1;
  			}
  
  			if( graph.corners.size <= 1 )
  				clusters.removeTail();
  		}
  	}