Пример #1
0
 private static VBox[] doCut(
     int color, VBox vbox, List<Integer> partialsum, List<Integer> lookaheadsum, int total) {
   int dim1 = 0, dim2 = 0;
   if (color == RED) {
     dim1 = vbox.getR1();
     dim2 = vbox.getR2();
   } else if (color == GREEN) {
     dim1 = vbox.getG1();
     dim2 = vbox.getG2();
   } else if (color == BLUE) {
     dim1 = vbox.getB1();
     dim2 = vbox.getB2();
   }
   VBox vbox1, vbox2;
   int left, right, d2;
   Integer count2;
   for (int i = dim1; i < dim2; i++) {
     if (partialsum.get(i) > total / 2) {
       vbox1 = vbox.copy();
       vbox2 = vbox.copy();
       left = i - dim1;
       right = dim2 - i;
       if (left <= right) {
         d2 = Math.min(dim2 - 1, ~~(i + right / 2));
       } else {
         d2 = Math.max(dim1, ~~(i - 1 - left / 2));
       }
       while (partialsum.get(d2) == null) d2++;
       count2 = lookaheadsum.get(d2);
       while (count2 == null && partialsum.get(d2 - 1) == null) count2 = lookaheadsum.get(--d2);
       if (color == RED) {
         vbox1.setR2(d2);
         vbox2.setR1(vbox1.getR2() + 1);
       } else if (color == GREEN) {
         vbox1.setG2(d2);
         vbox2.setG1(vbox1.getG2() + 1);
       } else if (color == BLUE) {
         vbox1.setB2(d2);
         vbox2.setB1(vbox1.getB2() + 1);
       }
       return new VBox[] {vbox1, vbox2};
     }
   }
   return null;
 }
Пример #2
0
  private static VBox[] medianCutApply(int[] histo, VBox vbox) {
    if (vbox.count(false) == 0) return null;
    if (vbox.count(false) == 1) {
      return new VBox[] {vbox.copy()};
    }
    int rw = vbox.r2 - vbox.r1 + 1,
        gw = vbox.g2 - vbox.g1 + 1,
        bw = vbox.b2 - vbox.b1 + 1,
        maxw = Math.max(Math.max(rw, gw), bw);

    int total = 0;
    List<Integer> partialsum = new ArrayList<>();
    List<Integer> lookaheadsum = new ArrayList<>();

    if (maxw == rw) {
      for (int i = vbox.r1; i <= vbox.r2; i++) {
        int sum = 0;
        for (int j = vbox.g1; j <= vbox.g2; j++) {
          for (int k = vbox.b1; k <= vbox.b2; k++) {
            sum += histo[getColorIndex(i, j, k)];
          }
        }
        total += sum;
        if (partialsum.size() < i) {
          int toAdd = i - partialsum.size();
          for (int l = partialsum.size(); l < toAdd; l++) {
            partialsum.add(0);
          }
        }
        partialsum.add(i, total);
      }
    } else if (maxw == gw) {
      for (int i = vbox.g1; i <= vbox.g2; i++) {
        int sum = 0;
        for (int j = vbox.r1; j <= vbox.r2; j++) {
          for (int k = vbox.b1; k <= vbox.b2; k++) {
            sum += histo[getColorIndex(j, i, k)];
          }
        }
        total += sum;
        if (partialsum.size() < i) {
          int toAdd = i - partialsum.size();
          for (int l = partialsum.size(); l < toAdd; l++) {
            partialsum.add(0);
          }
        }
        partialsum.add(i, total);
      }
    } else {
      for (int i = vbox.b1; i <= vbox.b2; i++) {
        int sum = 0;
        for (int j = vbox.r1; j <= vbox.r2; j++) {
          for (int k = vbox.g1; k <= vbox.g2; k++) {
            sum += histo[getColorIndex(j, k, i)];
          }
        }
        total += sum;
        if (partialsum.size() < i) {
          int toAdd = i - partialsum.size();
          for (int l = partialsum.size(); l < toAdd; l++) {
            partialsum.add(0);
          }
        }
        partialsum.add(i, total);
      }
    }

    for (int i = 0; i < partialsum.size(); i++) {
      lookaheadsum.add(i, total - partialsum.get(i));
    }

    return maxw == rw
        ? doCut(RED, vbox, partialsum, lookaheadsum, total)
        : maxw == gw
            ? doCut(GREEN, vbox, partialsum, lookaheadsum, total)
            : doCut(BLUE, vbox, partialsum, lookaheadsum, total);
  }