maximize method 
    
    
    
  Implementation
  MaximizeResult maximize(Box cube, Direction direction, int first, int last,
    int wholeR, int wholeG, int wholeB, int wholeW) {
  int bottomR = bottom(cube, direction, momentsR);
  int bottomG = bottom(cube, direction, momentsG);
  int bottomB = bottom(cube, direction, momentsB);
  int bottomW = bottom(cube, direction, weights);
  double max = 0.0;
  int cut = -1;
  for (int i = first; i < last; i++) {
    int halfR = bottomR + top(cube, direction, i, momentsR);
    int halfG = bottomG + top(cube, direction, i, momentsG);
    int halfB = bottomB + top(cube, direction, i, momentsB);
    int halfW = bottomW + top(cube, direction, i, weights);
    if (halfW == 0) {
      continue;
    }
    double tempNumerator =
        ((halfR * halfR) + (halfG * halfG) + (halfB * halfB)).toDouble();
    double tempDenominator = halfW.toDouble();
    double temp = tempNumerator / tempDenominator;
    halfR = wholeR - halfR;
    halfG = wholeG - halfG;
    halfB = wholeB - halfB;
    halfW = wholeW - halfW;
    if (halfW == 0) {
      continue;
    }
    tempNumerator =
        ((halfR * halfR) + (halfG * halfG) + (halfB * halfB)).toDouble();
    tempDenominator = halfW.toDouble();
    temp += (tempNumerator / tempDenominator);
    if (temp > max) {
      max = temp;
      cut = i;
    }
  }
  return MaximizeResult(cutLocation: cut, maximum: max);
}