package jaist.css.covis.util;
import edu.umd.cs.piccolo.util.PBounds;
/**
* Bounds Utility Class
*
* @author miuramo
*
*/
public class BUtil {
/**
* 面積を返す
* @param pagemanager 領域
* @return 面積
*/
public static int getArea(PBounds pb) {
double w = pb.getWidth();
double h = pb.getHeight();
return (int) (w * h);
}
/**
* 引数pbで与えた領域を,引数rateだけ拡大した新しい領域を返す
* @param pagemanager 領域
* @param rate ズーム率
* @return 新しい領域
*/
public static PBounds zoomBounds(PBounds pb, double rate) {
double x = pb.getX();
double y = pb.getY();
double w = pb.getWidth();
double h = pb.getHeight();
double nw = w * rate;
double nh = h * rate;
double nx = x - (nw - w) / 2;
double ny = y - (nh - h) / 2;
return new PBounds(nx, ny, nw, nh);
}
/**
* 引数pbで与えた領域を,引数rateだけ拡大した新しい領域を返す(ただしX方向のみ)
* @param pagemanager 領域
* @param rate ズーム率
* @return 新しい領域
*/
public static PBounds zoomBoundsX(PBounds pb, double rate) {
double x = pb.getX();
double y = pb.getY();
double w = pb.getWidth();
double h = pb.getHeight();
double nw = w * rate;
double nh = h;
double nx = x - (nw - w) / 2;
double ny = y - (nh - h) / 2;
return new PBounds(nx, ny, nw, nh);
}
/**
* 引数pbで与えた領域に,指定した幅と高さを加えた新しい領域を返す
* @param pagemanager 領域
* @param plusx 横方向追加分
* @param plusy 縦方向追加分
* @return 新しい領域
*/
public static PBounds plusBounds(PBounds pb, int plusx, int plusy) {
double x = pb.getX();
double y = pb.getY();
double w = pb.getWidth();
double h = pb.getHeight();
double nw = w + plusx;
double nh = h + plusy;
double nx = x - (nw - w) / 2;
double ny = y - (nh - h) / 2;
return new PBounds(nx, ny, nw, nh);
}
/**
* pos が 1から3のときは,指定した領域を縦の長さを半分にした領域を計算し,それが元の領域の上か,中心か,下に移動する.
* pos が0のときは,領域をそのまま返す
* @param pagemanager 領域
* @param pos 場所
* @return 新しい領域
*/
// pos = {0, 1, 2, 3 } = {full, top, middle, bottom};
public static PBounds halfBounds(PBounds pb, int pos) {
double x = pb.getX();
double y = pb.getY();
double w = pb.getWidth();
double h = pb.getHeight();
if (pos == 0) {
return new PBounds(pb);
}
if (pos == 1) {
double nx = x;
double ny = y;
double nw = w;
double nh = h / 2;
return new PBounds(nx, ny, nw, nh);
}
if (pos == 2) {
double nx = x;
double ny = y + h / 4;
double nw = w;
double nh = h / 2;
return new PBounds(nx, ny, nw, nh);
}
if (pos == 3) {
double nx = x;
double ny = y + h / 2;
double nw = w;
double nh = h / 2;
return new PBounds(nx, ny, nw, nh);
}
return null;
}
/**
* ズーム説明用の領域を計算する(現在は未使用)
* @param firstpb 最初の領域
* @param panelpb パネルの領域
* @param cameraview カメラの表示領域
* @param width 幅
* @return 新しい領域
*/
public static PBounds explainBounds(PBounds firstpb, PBounds panelpb,
PBounds cameraview, double width) {
double fpbw = firstpb.width;
double zoom = width / fpbw;
PBounds tempb = zoomBoundsX(firstpb, zoom);
double preferredheight = width * cameraview.height / cameraview.width;
double tx = tempb.x;
double ty = tempb.y;
double tw = tempb.width;
double th = tempb.height;
double px = panelpb.x;
double py = panelpb.y;
double pw = panelpb.width;
double ph = panelpb.height;
if (tx < px) {
tx = px;
}
if (px + pw < tx + tw) {
tx = (px + pw) - tw;
}
double tcy = ty + th / 2;
ty = tcy - preferredheight / 2;
th = preferredheight;
if (ty < py) {
ty = py;
}
if (py + ph < ty + th) {
ty = (py + ph) - th;
}
return new PBounds(tx, ty, tw, th);
}
/**
* Check whether piece is completely included in large. True if not
* included.
*
* @param large
* @param piece
* @return True if piece is not included in large
*/
public static boolean isHamidashi(PBounds large, PBounds piece) {
// if (piece.x < large.x) return true;
// if (piece.y < large.y) return true;
// if (large.x+large.width < piece.x+piece.width) return true;
// if (large.y+large.height < piece.y + piece.height) return true;
// return false;
return !large.contains(piece);
}
}