code: static protected NodeInfo selectSeedNext(  NodeInfo prevSeed , NodeInfo prevNext ,
  											   NodeInfo currentSeed, boolean ccw  ) {
  		double referenceAngle = direction(prevNext, prevSeed);
  
  		double bestScore = Double.MAX_VALUE;
  		NodeInfo best = null;
  
  		// cut down on verbosity by saving the reference here
  		Point2D_F64 c = currentSeed.ellipse.center;
  
  		for (int i = 0; i < currentSeed.edges.size(); i++) {
  			Edge edge = currentSeed.edges.get(i);
  			if( edge.target.marked )
  				continue;
  
  			double angle = edge.angle;
  			double angleDist = ccw ? UtilAngle.distanceCCW(referenceAngle,angle) : UtilAngle.distanceCW(referenceAngle,angle);
  			if( angleDist > Math.PI+MAX_LINE_ANGLE_CHANGE )
  				continue;
  
  			Point2D_F64 p = edge.target.ellipse.center;
  
  			double score = angleDist*c.distance(p);
  
  			if( score < bestScore ) {
  				bestScore = score;
  				best = edge.target;
  			}
  		}
  
  		if( best != null )
  			best.marked = true;
  		return best;
  	}
docs: Select the first node (currentSeed) in the next row it finds the next element in the next row by
  looking at the first and second elements in the previous row.  It selects the edge in
  currentSeed which cones closest to matching the angle of 'prevSeed' and 'prevNext'
  @param prevSeed First node in the previous row
  @param prevNext Second node in the previous row
  @param currentSeed First node in the current row
  @return The found node or null if one was not found