areas[i][j] = new Area(va, vb);
}
}
}
private void fixArea() {
Vector tn1 = area.ld.dotDiv(grid).intVal().abs();
area.ld = grid.dotMul(tn1).neg();
Vector tn2 = area.ru.dotDiv(grid).intVal().abs();
area.ru = grid.dotMul(tn2);
tn1 = tn1.add(tn2);
nx = (int)tn1.x;
ny = (int)tn1.y;
}
private Slop[][] initSlop(CanCalc calc) {
fixArea();
Slop[][] slops = new Slop[nx][ny];
Vector now = area.ld.clone();
now.y += grid.y/2;
for(int i=0; i
for(int j=0; j
now.x += grid.x;
}
now.y += grid.y;
}
return slops;
}
public Area[][] calcGrids() {
Slop[][] slops = initSlop(calc);
areas = new Area[nx][ny];
for(int i=0; i
Slop s = slops[i][j];
if(s.slop == grid.slop()) {
tmp = grid.dotDiv(2);
}else if(s.slop == -grid.slop()){
tmp = grid.dotDiv(2).dotMul(Vector.dr);
}else if(s.slop==0){
tmp = Vector.build(grid.x/2, 0);
}else if(s.slop
tmp = Vector.build(grid.x/2, (grid.x/2)*s.slop);
}else {
tmp = Vector.build((grid.y/2)/s.slop, grid.y/2);
}
tmp = tmp.dotMul(1-this.padding);
areas[i][j] = new Area(s.point.add(tmp.neg()), s.point.add(tmp));
}
}
}
}
interface CanCalc {
public double doCalc(Vector v);
}
class Slop{
public Vector point;
public double slop;
public Slop(Vector _point, double _slop) {
this.point = _point;
this.slop = _slop;
}
public String toString() {
return String.format("{%s, %.2f}", point, slop);
}
}
class Area {
public Vector ld;
public Vector ru;
public Area(Vector _ld, Vector _ru) {
this.ld = _ld;
this.ru = _ru;
}
public String toString() {
return String.format("[%s-%s]", this.ld, this.ru);
}
public Area scale(double d) {
return new Area(this.ld.dotMul(d), this.ru.dotMul(d));
}
public Area add(Vector v) {
return new Area(this.ld.add(v), this.ru.add(v));
}
}
class Vector {
public static final double infinite = Double.MAX_VALUE;
public double x;
public double y;
public static final Vector zero = Vector.build(0, 0);
public static final Vector up = Vector.build(0, 1);
public static final Vector down = Vector.build(0, -1);
public static final Vector left = Vector.build(-1, 0);
public static final Vector right = Vector.build(1, 0);
public static final Vector ul = Vector.build(-1, 1);
public static final Vector ur = Vector.build(1, 1);
public static final Vector dl = Vector.build(-1, -1);
public static final Vector dr =