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; }
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); }