public Array<Page> pack (Array<Rect> inputRects) { for (int i = 0, nn = inputRects.size; i < nn; i++) { Rect rect = inputRects.get(i); rect.width += settings.paddingX; rect.height += settings.paddingY; } if (settings.fast) { if (settings.rotation) { // Sort by longest side if rotation is enabled. sort.sort(inputRects, new Comparator<Rect>() { public int compare (Rect o1, Rect o2) { int n1 = o1.width > o1.height ? o1.width : o1.height; int n2 = o2.width > o2.height ? o2.width : o2.height; return n2 - n1; } }); } else { // Sort only by width (largest to smallest) if rotation is disabled. sort.sort(inputRects, new Comparator<Rect>() {
/** @param fully If true, the only results that pack all rects will be considered. If false, all results are considered, not * all rects may be packed. */ private Page packAtSize (boolean fully, int width, int height, Array<Rect> inputRects) { Page bestResult = null; for (int i = 0, n = methods.length; i < n; i++) { maxRects.init(width, height); Page result; if (!settings.fast) { result = maxRects.pack(inputRects, methods[i]); } else { Array<Rect> remaining = new Array(); for (int ii = 0, nn = inputRects.size; ii < nn; ii++) { Rect rect = inputRects.get(ii); if (maxRects.insert(rect, methods[i]) == null) { while (ii < nn) remaining.add(inputRects.get(ii++)); } } result = maxRects.getResult(); result.remainingRects = remaining; } if (fully && result.remainingRects.size > 0) continue; if (result.outputRects.size == 0) continue; bestResult = getBest(bestResult, result); } return bestResult; }
public Array<Page> pack (Array<Rect> inputRects) { if (!settings.silent) System.out.print("Packing"); int cellWidth = 0, cellHeight = 0; for (int i = 0, nn = inputRects.size; i < nn; i++) { Rect rect = inputRects.get(i); cellWidth = Math.max(cellWidth, rect.width); cellHeight = Math.max(cellHeight, rect.height); } cellWidth += settings.paddingX; cellHeight += settings.paddingY; inputRects.reverse(); Array<Page> pages = new Array(); while (inputRects.size > 0) { Page result = packPage(inputRects, cellWidth, cellHeight); pages.add(result); } return pages; }
/** @param fully If true, the only results that pack all rects will be considered. If false, all results are considered, not all * rects may be packed. */ private Page packAtSize (boolean fully, int width, int height, Array<Rect> inputRects) { Page bestResult = null; for (int i = 0, n = methods.length; i < n; i++) { maxRects.init(width, height); Page result; if (!settings.fast) { result = maxRects.pack(inputRects, methods[i]); } else { Array<Rect> remaining = new Array(); for (int ii = 0, nn = inputRects.size; ii < nn; ii++) { Rect rect = inputRects.get(ii); if (maxRects.insert(rect, methods[i]) == null) { while (ii < nn) remaining.add(inputRects.get(ii++)); } } result = maxRects.getResult(); result.remainingRects = remaining; } if (fully && result.remainingRects.size > 0) continue; if (result.outputRects.size == 0) continue; bestResult = getBest(bestResult, result); } return bestResult; }
public Array<Page> pack (Array<Rect> inputRects) { System.out.print("Packing"); int cellWidth = 0, cellHeight = 0; for (int i = 0, nn = inputRects.size; i < nn; i++) { Rect rect = inputRects.get(i); cellWidth = Math.max(cellWidth, rect.width); cellHeight = Math.max(cellHeight, rect.height); } cellWidth += settings.paddingX; cellHeight += settings.paddingY; inputRects.reverse(); Array<Page> pages = new Array(); while (inputRects.size > 0) { Page result = packPage(inputRects, cellWidth, cellHeight); pages.add(result); } return pages; }
/** For each rectangle, packs each one then chooses the best and packs that. Slow! */ public Page pack (Array<Rect> rects, FreeRectChoiceHeuristic method) { rects = new Array(rects); while (rects.size > 0) { int bestRectIndex = -1; Rect bestNode = new Rect(); bestNode.score1 = Integer.MAX_VALUE; bestNode.score2 = Integer.MAX_VALUE; // Find the next rectangle that packs best. for (int i = 0; i < rects.size; i++) { Rect newNode = scoreRect(rects.get(i), method); if (newNode.score1 < bestNode.score1 || (newNode.score1 == bestNode.score1 && newNode.score2 < bestNode.score2)) { bestNode.set(rects.get(i)); bestNode.score1 = newNode.score1; bestNode.score2 = newNode.score2; bestNode.x = newNode.x; bestNode.y = newNode.y; bestNode.width = newNode.width; bestNode.height = newNode.height; bestNode.rotated = newNode.rotated; bestRectIndex = i; } } if (bestRectIndex == -1) break; placeRect(bestNode); rects.removeIndex(bestRectIndex); } Page result = getResult(); result.remainingRects = rects; return result; }
public Page getResult () { int w = 0, h = 0; for (int i = 0; i < usedRectangles.size; i++) { Rect rect = usedRectangles.get(i); w = Math.max(w, rect.x + rect.width); h = Math.max(h, rect.y + rect.height); } Page result = new Page(); result.outputRects = new Array(usedRectangles); result.occupancy = getOccupancy(); result.width = w; result.height = h; return result; }
private Page getBest (Page result1, Page result2) { if (result1 == null) return result2; if (result2 == null) return result1; return result1.occupancy > result2.occupancy ? result1 : result2; }