package org.basex.gui.view.map;
/**
* Binary layout algorithm.
*
* @author BaseX Team 2005-12, BSD License
* @author Joerg Hauser
*/
final class BinaryAlgo extends MapAlgo {
@Override
MapRects calcMap(final MapRect r, final MapList ml,
final int ns, final int ne) {
return calcMap(r, ml, ns, ne, 1);
}
/**
* Uses recursive SplitLayout algorithm to divide rectangles on one level.
* @param r parent rectangle
* @param ml children array
* @param ns start array position
* @param ne end array position
* @param sumweight weight of this recursion level
* @return rectangles
*/
private static MapRects calcMap(final MapRect r, final MapList ml,
final int ns, final int ne, final double sumweight) {
if(ne - ns == 0) {
final MapRects rects = new MapRects();
rects.add(new MapRect(r, ml.get(ns)));
return rects;
}
final MapRects rects = new MapRects();
// setting middle of the list and calc weights
double weight = 0;
final int ni = ns + (ne - ns) / 2;
for(int i = ns; i <= ni; ++i) {
weight += ml.weight[i];
}
int xx = r.x;
int yy = r.y;
int ww = !(r.w > r.h) ? r.w : (int) (r.w / sumweight * weight);
int hh = r.w > r.h ? r.h : (int) (r.h / sumweight * weight);
// paint both rectangles if enough space is left
if(ww > 0 && hh > 0 && weight > 0) rects.add(calcMap(
new MapRect(xx, yy, ww, hh, 0, r.level), ml, ns, ni, weight));
if(r.w > r.h) {
xx += ww;
ww = r.w - ww;
} else {
yy += hh;
hh = r.h - hh;
}
if(ww > 0 && hh > 0 && sumweight - weight > 0 && ni + 1 <= ne)
rects.add(calcMap(new MapRect(xx, yy, ww, hh, 0, r.level),
ml, ni + 1, ne, sumweight - weight));
return rects;
}
}