parent
e3e77dc308
commit
950943e01c
@ -1,854 +0,0 @@ |
|||||||
package mightypork.gamecore.gui.constraints; |
|
||||||
|
|
||||||
|
|
||||||
import mightypork.gamecore.control.timing.Poller; |
|
||||||
import mightypork.gamecore.input.InputSystem; |
|
||||||
import mightypork.gamecore.render.DisplaySystem; |
|
||||||
import mightypork.utils.math.coord.Coord; |
|
||||||
import mightypork.utils.math.coord.Rect; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Constraint factory.<br> |
|
||||||
* Import statically for best experience. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public class Constraints { |
|
||||||
|
|
||||||
/* ================= Variables ================= */ |
|
||||||
|
|
||||||
public static final NumberConstraint _mouseX = new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return InputSystem.getMousePos().x(); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
public static final NumberConstraint _mouseY = new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return InputSystem.getMousePos().y(); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
public static final NumberConstraint _screenW = new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return DisplaySystem.getWidth(); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
public static final NumberConstraint _screenH = new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return DisplaySystem.getHeight(); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
/* ================= Arithmetics ================= */ |
|
||||||
|
|
||||||
public static NumberConstraint _min(final Object a, final Object b) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return Math.min(_nv(a), _nv(b)); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _max(final Object a, final Object b) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return Math.max(_nv(a), _nv(b)); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _abs(final NumberConstraint a) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return Math.abs(a.getValue()); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _half(final NumberConstraint a) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return a.getValue() / 2; |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _round(final NumberConstraint a) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return Math.round(a.getValue()); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _round(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().round(); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _ceil(final NumberConstraint a) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return Math.ceil(a.getValue()); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _floor(final NumberConstraint a) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return Math.floor(a.getValue()); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _neg(final NumberConstraint a) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return -a.getValue(); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _add(final Object a, final Object b) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return _nv(a) + _nv(b); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _sub(final Object a, final Object b) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return _nv(a) - _nv(b); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _mul(final Object a, final Object b) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return _nv(a) * _nv(b); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _div(final Object a, final Object b) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return _nv(a) / _nv(b); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _percent(final Object whole, final Object percent) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return _nv(whole) * (_nv(percent) / 100); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _width(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return r.getRect().getSize().x(); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static NumberConstraint _height(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return r.getRect().getSize().y(); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/* ================= Layout utilities ================= */ |
|
||||||
|
|
||||||
public static RectConstraint _row(final RectConstraint r, final int rows, final int index) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final double height = r.getRect().getSize().y(); |
|
||||||
final double perRow = height / rows; |
|
||||||
|
|
||||||
final Coord origin = r.getRect().getOrigin().add(0, perRow * index); |
|
||||||
final Coord size = r.getRect().getSize().setY(perRow); |
|
||||||
|
|
||||||
return Rect.fromSize(origin, size); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _column(final RectConstraint r, final int columns, final int index) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final double width = r.getRect().getSize().x(); |
|
||||||
final double perCol = width / columns; |
|
||||||
|
|
||||||
final Coord origin = r.getRect().getOrigin().add(perCol * index, 0); |
|
||||||
final Coord size = r.getRect().getSize().setX(perCol); |
|
||||||
|
|
||||||
return Rect.fromSize(origin, size); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _tile(final RectConstraint r, final int rows, final int cols, final int left, final int top) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final double height = r.getRect().getSize().y(); |
|
||||||
final double width = r.getRect().getSize().y(); |
|
||||||
final double perRow = height / rows; |
|
||||||
final double perCol = width / cols; |
|
||||||
|
|
||||||
final Coord origin = r.getRect().getOrigin().add(perCol * left, perRow * (rows - top - 1)); |
|
||||||
|
|
||||||
return Rect.fromSize(origin, perCol, perRow); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/* ================= Rect manipulation ================= */ |
|
||||||
|
|
||||||
public static RectConstraint _shrink(RectConstraint r, Object shrink) |
|
||||||
{ |
|
||||||
final NumberConstraint n = _n(shrink); |
|
||||||
return _shrink(r, n, n, n, n); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _shrink(RectConstraint context, Object horiz, Object vert) |
|
||||||
{ |
|
||||||
return _shrink(context, horiz, vert, horiz, vert); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _shrink(final RectConstraint r, final Object xmin, final Object ymin, final Object xmax, final Object ymax) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(_nv(xmin), _nv(ymin), _nv(xmax), _nv(ymax)); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _shrink_top(final RectConstraint r, final Object shrink) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(0, _nv(shrink), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _shrink_bottom(final RectConstraint r, final Object shrink) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(0, 0, 0, _nv(shrink)); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _shrink_left(final RectConstraint r, final Object shrink) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(_nv(shrink), 0, 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _shrink_right(final RectConstraint r, final Object shrink) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(0, 0, _nv(shrink), 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _grow(RectConstraint r, Object grow) |
|
||||||
{ |
|
||||||
final NumberConstraint n = _n(grow); |
|
||||||
return _grow(r, n, n, n, n); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _grow(RectConstraint r, Object horiz, Object vert) |
|
||||||
{ |
|
||||||
return _grow(r, horiz, vert, horiz, vert); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _grow(final RectConstraint r, final Object xmin, final Object ymin, final Object xmax, final Object ymax) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().grow(_nv(xmin), _nv(ymin), _nv(xmax), _nv(ymax)); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _grow_up(final RectConstraint r, final Object grow) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().grow(0, _nv(grow), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _grow_down(final RectConstraint r, final Object grow) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().grow(0, 0, 0, _nv(grow)); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _grow_left(final RectConstraint r, final Object grow) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().grow(_nv(grow), 0, 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _grow_right(final RectConstraint r, final Object grow) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().grow(0, 0, _nv(grow), 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/* ================= Box creation ================= */ |
|
||||||
|
|
||||||
public static RectConstraint _box(final Object side) |
|
||||||
{ |
|
||||||
return _box(side, side); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _box(final Object width, final Object height) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
//@formatter:off
|
|
||||||
return Rect.fromSize( |
|
||||||
0, |
|
||||||
0, |
|
||||||
_nv(width), |
|
||||||
_nv(height) |
|
||||||
); |
|
||||||
//@formatter:on
|
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _box(final RectConstraint r, final Object width, final Object height) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final Coord origin = r.getRect().getOrigin(); |
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
return Rect.fromSize( |
|
||||||
origin.x(), |
|
||||||
origin.y(), |
|
||||||
_nv(width), |
|
||||||
_nv(height) |
|
||||||
); |
|
||||||
//@formatter:on
|
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _box(final RectConstraint r, final Object x, final Object y, final Object width, final Object height) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final Coord origin = r.getRect().getOrigin(); |
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
return Rect.fromSize( |
|
||||||
origin.x() + _nv(x), |
|
||||||
origin.y() + _nv(y), |
|
||||||
_nv(width), |
|
||||||
_nv(height) |
|
||||||
); |
|
||||||
//@formatter:on
|
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _box_abs(final RectConstraint r, final Object xmin, final Object ymin, final Object xmax, final Object ymax) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final Coord origin = r.getRect().getOrigin(); |
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
return new Rect(origin.add(_nv(xmin), _nv(ymin)), origin.add(_nv(xmax), _nv(ymax))); |
|
||||||
//@formatter:on
|
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _centered(final RectConstraint r, final RectConstraint centerTo) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final Coord size = r.getRect().getSize(); |
|
||||||
final Coord center = centerTo.getRect().getCenter(); |
|
||||||
|
|
||||||
return Rect.fromSize(center.x() - size.x() / 2D, center.y() - size.y() / 2D, size.x(), size.y()); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Center rect around given coords |
|
||||||
* |
|
||||||
* @param r rect |
|
||||||
* @param x |
|
||||||
* @param y |
|
||||||
* @return centered |
|
||||||
*/ |
|
||||||
public static RectConstraint _centered(final RectConstraint r, final Object x, final Object y) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
final Coord size = r.getRect().getSize(); |
|
||||||
|
|
||||||
return Rect.fromSize(_nv(x) - size.x() / 2D, _nv(y) - size.y() / 2D, size.x(), size.y()); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _move(final RectConstraint r, final Object x, final Object y) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().add(_nv(x), _nv(y)); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/* ================= Rect bounds ================= */ |
|
||||||
|
|
||||||
/** |
|
||||||
* Get zero-sized rect at the center |
|
||||||
* |
|
||||||
* @param r context |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public static RectConstraint _center(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getCenter(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _left_edge(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(0, 0, r.getRect().getWidth(), 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _top_edge(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(0, 0, 0, r.getRect().getHeight()); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _right_edge(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(r.getRect().getWidth(), 0, 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _bottom_edge(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return r.getRect().shrink(0, r.getRect().getHeight(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _left_top(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getHMinVMin(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _left_bottom(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getHMinVMax(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _right_top(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getHMaxVMin(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _right_bottom(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getHMaxVMax(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _center_top(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getCenterVMin(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _center_bottom(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getCenterVMax(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _center_left(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getCenterHMin(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectConstraint _center_right(final RectConstraint r) |
|
||||||
{ |
|
||||||
return new RectConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return Rect.fromSize(r.getRect().getCenterHMax(), 0, 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/* ================= Helpers ================= */ |
|
||||||
|
|
||||||
public static RectCache _cache(final RectConstraint rc) |
|
||||||
{ |
|
||||||
return new RectCache(rc); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static RectCache _cache(final Poller poller, final RectConstraint rc) |
|
||||||
{ |
|
||||||
return new RectCache(poller, rc); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Convert {@link Number} to {@link NumberConstraint} if needed |
|
||||||
* |
|
||||||
* @param o unknown numeric value |
|
||||||
* @return converted |
|
||||||
*/ |
|
||||||
public static NumberConstraint _n(final Object o) |
|
||||||
{ |
|
||||||
|
|
||||||
if (o instanceof NumberConstraint) return (NumberConstraint) o; |
|
||||||
|
|
||||||
if (o instanceof Number) return new NumberConstraint() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return ((Number) o).doubleValue(); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
throw new IllegalArgumentException("Invalid numeric type."); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Convert {@link Number} or {@link NumberConstraint} to double (current |
|
||||||
* value) |
|
||||||
* |
|
||||||
* @param o unknown numeric value |
|
||||||
* @return double value |
|
||||||
*/ |
|
||||||
public static double _nv(final Object o) |
|
||||||
{ |
|
||||||
return _n(o).getValue(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,16 +0,0 @@ |
|||||||
package mightypork.gamecore.gui.constraints; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Numeric constraint |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public interface NumberConstraint { |
|
||||||
|
|
||||||
/** |
|
||||||
* @return current value |
|
||||||
*/ |
|
||||||
double getValue(); |
|
||||||
|
|
||||||
} |
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@ |
|||||||
package mightypork.gamecore.gui.constraints; |
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
|
||||||
import mightypork.utils.math.coord.Rect; |
import mightypork.utils.math.rect.Rect; |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
@ -0,0 +1,34 @@ |
|||||||
|
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Numeric constraint |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public interface NumberConstraint { |
||||||
|
|
||||||
|
public static final NumberConstraint ZERO = new NumberConstraint() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double getValue() |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
public static final NumberConstraint ONE = new NumberConstraint() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double getValue() |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* @return current value |
||||||
|
*/ |
||||||
|
double getValue(); |
||||||
|
|
||||||
|
} |
@ -1,7 +1,7 @@ |
|||||||
package mightypork.gamecore.gui.constraints; |
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
|
||||||
import mightypork.utils.math.coord.Rect; |
import mightypork.utils.math.rect.Rect; |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
@ -1,9 +1,9 @@ |
|||||||
package mightypork.gamecore.gui.constraints; |
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
|
||||||
import mightypork.gamecore.control.timing.Pollable; |
import mightypork.gamecore.control.timing.Pollable; |
||||||
import mightypork.gamecore.control.timing.Poller; |
import mightypork.gamecore.control.timing.Poller; |
||||||
import mightypork.utils.math.coord.Rect; |
import mightypork.utils.math.rect.Rect; |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
@ -1,7 +1,7 @@ |
|||||||
package mightypork.gamecore.gui.constraints; |
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
|
||||||
import mightypork.utils.math.coord.Rect; |
import mightypork.utils.math.rect.Rect; |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
@ -0,0 +1,8 @@ |
|||||||
|
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
import mightypork.utils.math.coord.VecView; |
||||||
|
|
||||||
|
|
||||||
|
public interface VecConstraint { |
||||||
|
VecView getVec(); |
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.coord.Vec; |
||||||
|
import mightypork.utils.math.coord.VecView; |
||||||
|
|
||||||
|
|
||||||
|
public class VecWrapper implements VecConstraint { |
||||||
|
|
||||||
|
private final Vec wrapped; |
||||||
|
|
||||||
|
|
||||||
|
public VecWrapper(Vec wrapped) { |
||||||
|
this.wrapped = wrapped; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VecView getVec() |
||||||
|
{ |
||||||
|
return wrapped.view(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,129 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.control.timing.Pauseable; |
||||||
|
import mightypork.gamecore.control.timing.Updateable; |
||||||
|
import mightypork.utils.math.animation.AnimDouble; |
||||||
|
import mightypork.utils.math.animation.Easing; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 3D coordinated with support for transitions, mutable. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class AnimCoord extends VecMutableImpl<AnimCoord> implements Pauseable, Updateable { |
||||||
|
|
||||||
|
private final AnimDouble x, y, z; |
||||||
|
|
||||||
|
|
||||||
|
public AnimCoord(AnimDouble x, AnimDouble y, AnimDouble z) { |
||||||
|
this.x = x; |
||||||
|
this.y = y; |
||||||
|
this.z = z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public AnimCoord(Vec start, Easing easing) { |
||||||
|
x = new AnimDouble(start.x(), easing); |
||||||
|
y = new AnimDouble(start.y(), easing); |
||||||
|
z = new AnimDouble(start.z(), easing); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return x.now(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return y.now(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return z.now(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public AnimCoord result(double x, double y, double z) |
||||||
|
{ |
||||||
|
this.x.setTo(x); |
||||||
|
this.y.setTo(y); |
||||||
|
this.z.setTo(z); |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public AnimCoord add(VecArith offset, double speed) |
||||||
|
{ |
||||||
|
animate(offset.add(this), speed); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public AnimCoord animate(Vec target, double duration) |
||||||
|
{ |
||||||
|
x.animate(target.x(), duration); |
||||||
|
y.animate(target.y(), duration); |
||||||
|
z.animate(target.z(), duration); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void animateWithSpeed(Vec target, double unitsPerSecond) |
||||||
|
{ |
||||||
|
double dist = distTo(target); |
||||||
|
double duration = dist / unitsPerSecond; |
||||||
|
animate(target, duration); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void update(double delta) |
||||||
|
{ |
||||||
|
x.update(delta); |
||||||
|
y.update(delta); |
||||||
|
z.update(delta); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void pause() |
||||||
|
{ |
||||||
|
x.pause(); |
||||||
|
y.pause(); |
||||||
|
z.pause(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void resume() |
||||||
|
{ |
||||||
|
x.resume(); |
||||||
|
y.resume(); |
||||||
|
z.resume(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPaused() |
||||||
|
{ |
||||||
|
return x.isPaused(); // BUNO
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public boolean isFinished() |
||||||
|
{ |
||||||
|
return x.isFinished(); // BUNO
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumberConstraint; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Coord view composed of given {@link NumberConstraint}s, using their current |
||||||
|
* values.<br> |
||||||
|
* Operations yield a new {@link MutableCoord} with the result. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class ConstraintCoord extends VecView { |
||||||
|
|
||||||
|
private final NumberConstraint constrX; |
||||||
|
private final NumberConstraint constrY; |
||||||
|
private final NumberConstraint constrZ; |
||||||
|
|
||||||
|
|
||||||
|
public ConstraintCoord(NumberConstraint x, NumberConstraint y, NumberConstraint z) { |
||||||
|
this.constrX = x; |
||||||
|
this.constrY = y; |
||||||
|
this.constrZ = z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public ConstraintCoord(NumberConstraint x, NumberConstraint y) { |
||||||
|
this.constrX = x; |
||||||
|
this.constrY = y; |
||||||
|
this.constrZ = NumberConstraint.ZERO; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return constrX.getValue(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return constrY.getValue(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return constrZ.getValue(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,42 +0,0 @@ |
|||||||
package mightypork.utils.math.coord; |
|
||||||
|
|
||||||
|
|
||||||
import mightypork.gamecore.gui.constraints.NumberConstraint; |
|
||||||
|
|
||||||
|
|
||||||
public class ConstraintCoordView extends CoordView { |
|
||||||
|
|
||||||
private final NumberConstraint xc; |
|
||||||
private final NumberConstraint yc; |
|
||||||
private final NumberConstraint zc; |
|
||||||
|
|
||||||
|
|
||||||
public ConstraintCoordView(NumberConstraint x, NumberConstraint y, NumberConstraint z) { |
|
||||||
super(null); |
|
||||||
this.xc = x; |
|
||||||
this.yc = y; |
|
||||||
this.zc = z; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public double x() |
|
||||||
{ |
|
||||||
return xc == null ? 0 : xc.getValue(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public double y() |
|
||||||
{ |
|
||||||
return yc == null ? 0 : yc.getValue(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public double z() |
|
||||||
{ |
|
||||||
return zc == null ? 0 : zc.getValue(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
File diff suppressed because it is too large
Load Diff
@ -1,106 +0,0 @@ |
|||||||
package mightypork.utils.math.coord; |
|
||||||
|
|
||||||
|
|
||||||
import mightypork.gamecore.control.timing.Updateable; |
|
||||||
import mightypork.utils.math.Calc; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* TODO revise |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public class CoordAnimated extends Coord implements Updateable { |
|
||||||
|
|
||||||
private double animTime = 0; |
|
||||||
private Coord offs; |
|
||||||
private Coord start; |
|
||||||
private double time = 0; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Update delta timing |
|
||||||
* |
|
||||||
* @param delta delta time to add |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
public void update(double delta) |
|
||||||
{ |
|
||||||
if (start == null) start = new Coord(); |
|
||||||
if (offs == null) offs = new Coord(); |
|
||||||
animTime = Calc.clampd(animTime + delta, 0, time); |
|
||||||
if (animIsFinished()) { |
|
||||||
time = 0; |
|
||||||
animTime = 0; |
|
||||||
start.setTo(this); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Remember position (other changes will be for animation) |
|
||||||
*/ |
|
||||||
public void animRemember() |
|
||||||
{ |
|
||||||
if (start == null) start = new Coord(); |
|
||||||
if (offs == null) offs = new Coord(); |
|
||||||
start.setTo(this); |
|
||||||
offs = Coord.zero(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Start animation |
|
||||||
* |
|
||||||
* @param time anim length |
|
||||||
*/ |
|
||||||
public void animStart(double time) |
|
||||||
{ |
|
||||||
if (start == null) start = new Coord(); |
|
||||||
if (offs == null) offs = new Coord(); |
|
||||||
this.time = time; |
|
||||||
animTime = 0; |
|
||||||
offs = start.vecTo(this); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Stop animation, assign to current value |
|
||||||
*/ |
|
||||||
public void animStop() |
|
||||||
{ |
|
||||||
setTo(animGetCurrent()); |
|
||||||
animRemember(); |
|
||||||
animTime = 0; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get if animation is finished |
|
||||||
* |
|
||||||
* @return is finished |
|
||||||
*/ |
|
||||||
public boolean animIsFinished() |
|
||||||
{ |
|
||||||
return animTime >= time; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get current value (animated) |
|
||||||
* |
|
||||||
* @return curent value |
|
||||||
*/ |
|
||||||
public Coord animGetCurrent() |
|
||||||
{ |
|
||||||
if (time == 0) return copy(); // avoid zero division
|
|
||||||
|
|
||||||
if (start == null) start = new Coord(); |
|
||||||
if (offs == null) offs = new Coord(); |
|
||||||
|
|
||||||
if (animIsFinished()) return this; |
|
||||||
|
|
||||||
return start.add(offs.mul(animTime / time)); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,55 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.VecConstraint; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* <p><b>[ Use Vec.view() method to make a proxy! ]</b></p> |
||||||
|
* <p>View of another coordinate, immutable.<br> |
||||||
|
* Operations yield a new {@link MutableCoord} with the result.</p> |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class CoordProxy extends VecView { |
||||||
|
|
||||||
|
private final Vec observed; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Protected, in order to enforce the use of view() method on Vec, which |
||||||
|
* uses caching. |
||||||
|
* |
||||||
|
* @param observed |
||||||
|
*/ |
||||||
|
public CoordProxy(Vec observed) { |
||||||
|
this.observed = observed; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public CoordProxy view() |
||||||
|
{ |
||||||
|
return this; // no need to make another
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return observed.x(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return observed.y(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return observed.z(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,31 +1,54 @@ |
|||||||
package mightypork.utils.math.coord; |
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
import mightypork.gamecore.gui.constraints.NumberConstraint; |
|
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* Coord values provider |
* Coordinate with immutable numeric values.<br> |
||||||
|
* Operations yield a new {@link MutableCoord} with the result. |
||||||
* |
* |
||||||
* @author MightyPork |
* @author MightyPork |
||||||
*/ |
*/ |
||||||
public interface CoordValue { |
public class CoordValue extends VecView { |
||||||
|
|
||||||
double x(); |
private final double x, y, z; |
||||||
|
|
||||||
|
|
||||||
double y(); |
public CoordValue(Vec other) { |
||||||
|
this(other.x(), other.y(), other.z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
double z(); |
public CoordValue(double x, double y) { |
||||||
|
this(x, y, 0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
NumberConstraint xc(); |
public CoordValue(double x, double y, double z) { |
||||||
|
this.x = x; |
||||||
|
this.y = y; |
||||||
|
this.z = z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
NumberConstraint zc(); |
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
NumberConstraint yc(); |
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return z; |
||||||
|
} |
||||||
|
|
||||||
} |
} |
||||||
|
@ -1,62 +0,0 @@ |
|||||||
package mightypork.utils.math.coord; |
|
||||||
|
|
||||||
|
|
||||||
public class CoordView extends Coord { |
|
||||||
|
|
||||||
private CoordValue observed = null; |
|
||||||
|
|
||||||
|
|
||||||
public CoordView(CoordValue coord) { |
|
||||||
observed = coord; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isView() |
|
||||||
{ |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isWritable() |
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public Coord view() |
|
||||||
{ |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public Coord freeze() |
|
||||||
{ |
|
||||||
return this; // no effect
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public double x() |
|
||||||
{ |
|
||||||
return observed.x(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public double y() |
|
||||||
{ |
|
||||||
return observed.y(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public double z() |
|
||||||
{ |
|
||||||
return observed.z(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,86 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Mutable coordinate.<br> |
||||||
|
* All Vec methods (except copy) alter data values and return this instance. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class MutableCoord extends VecMutableImpl<MutableCoord> { |
||||||
|
|
||||||
|
private double x, y, z; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Zero coord |
||||||
|
*/ |
||||||
|
public MutableCoord() { |
||||||
|
this(0, 0, 0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @param copied other coord to vopy |
||||||
|
*/ |
||||||
|
public MutableCoord(Vec copied) { |
||||||
|
this(copied.x(), copied.y(), copied.z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @param x X coordinate |
||||||
|
* @param y Y coordinate |
||||||
|
*/ |
||||||
|
public MutableCoord(double x, double y) { |
||||||
|
super(); |
||||||
|
this.x = x; |
||||||
|
this.y = y; |
||||||
|
this.z = 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @param x X coordinate |
||||||
|
* @param y Y coordinate |
||||||
|
* @param z Z coordinate |
||||||
|
*/ |
||||||
|
public MutableCoord(double x, double y, double z) { |
||||||
|
super(); |
||||||
|
this.x = x; |
||||||
|
this.y = y; |
||||||
|
this.z = z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public MutableCoord result(double x, double y, double z) |
||||||
|
{ |
||||||
|
this.x = x; |
||||||
|
this.y = y; |
||||||
|
this.z = z; |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
} |
@ -1,868 +0,0 @@ |
|||||||
package mightypork.utils.math.coord; |
|
||||||
|
|
||||||
|
|
||||||
import mightypork.gamecore.gui.constraints.NumberConstraint; |
|
||||||
import mightypork.gamecore.gui.constraints.RectConstraint; |
|
||||||
import mightypork.utils.math.Calc; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Rectangle determined by two coordinates - min and max. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public class Rect implements RectConstraint { |
|
||||||
|
|
||||||
public static final Rect ZERO = new Rect(0, 0, 0, 0).freeze(); |
|
||||||
public static final Rect ONE = new Rect(0, 0, 1, 1).freeze(); |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Rectangle from size; coords are copied. |
|
||||||
* |
|
||||||
* @param min min coord |
|
||||||
* @param size rect size |
|
||||||
* @return the rect |
|
||||||
*/ |
|
||||||
public static Rect fromSize(Coord min, Coord size) |
|
||||||
{ |
|
||||||
return fromSize(min, size.xi(), size.yi()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Make rect from min coord and size; coords are copied. |
|
||||||
* |
|
||||||
* @param min min coord |
|
||||||
* @param width size x |
|
||||||
* @param height size y |
|
||||||
* @return the new rect |
|
||||||
*/ |
|
||||||
public static Rect fromSize(Coord min, double width, double height) |
|
||||||
{ |
|
||||||
return new Rect(min.copy(), min.add(width, height)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Rectangle from size |
|
||||||
* |
|
||||||
* @param sizeX size x |
|
||||||
* @param sizeY size y |
|
||||||
* @return rect |
|
||||||
*/ |
|
||||||
public static Rect fromSize(double sizeX, double sizeY) |
|
||||||
{ |
|
||||||
return fromSize(0, 0, sizeX, sizeY); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get rect from size |
|
||||||
* |
|
||||||
* @param size size |
|
||||||
* @return rect |
|
||||||
*/ |
|
||||||
public static Rect fromSize(Coord size) |
|
||||||
{ |
|
||||||
return fromSize(0, 0, size.x(), size.y()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Make rect from min coord and size |
|
||||||
* |
|
||||||
* @param xmin min x |
|
||||||
* @param ymin min y |
|
||||||
* @param width size x |
|
||||||
* @param height size y |
|
||||||
* @return the new rect |
|
||||||
*/ |
|
||||||
public static Rect fromSize(double xmin, double ymin, double width, double height) |
|
||||||
{ |
|
||||||
return new Rect(xmin, ymin, xmin + width, ymin + height); |
|
||||||
} |
|
||||||
|
|
||||||
/** Lowest coordinates xy */ |
|
||||||
protected final Coord min; |
|
||||||
|
|
||||||
/** Highest coordinates xy */ |
|
||||||
protected final Coord max; |
|
||||||
|
|
||||||
// view of secondary corners.
|
|
||||||
|
|
||||||
//@formatter:off
|
|
||||||
private final ConstraintCoordView HMinVMax = new ConstraintCoordView( |
|
||||||
new NumberConstraint() { |
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return min.x(); |
|
||||||
} |
|
||||||
}, |
|
||||||
new NumberConstraint() { |
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return max.y(); |
|
||||||
} |
|
||||||
}, |
|
||||||
null |
|
||||||
); |
|
||||||
|
|
||||||
|
|
||||||
private final ConstraintCoordView HMaxVMin = new ConstraintCoordView( |
|
||||||
new NumberConstraint() { |
|
||||||
@Override |
|
||||||
public double getValue() { |
|
||||||
return max.x(); |
|
||||||
} |
|
||||||
}, |
|
||||||
new NumberConstraint() { |
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return min.y(); |
|
||||||
} |
|
||||||
}, |
|
||||||
null |
|
||||||
); |
|
||||||
//@formatter:on
|
|
||||||
|
|
||||||
private boolean frozen; |
|
||||||
|
|
||||||
|
|
||||||
public boolean isWritable() |
|
||||||
{ |
|
||||||
return !frozen && !isView(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public boolean isView() |
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public Rect freeze() |
|
||||||
{ |
|
||||||
min.freeze(); |
|
||||||
max.freeze(); |
|
||||||
frozen = true; |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get a readonly view |
|
||||||
* |
|
||||||
* @return view |
|
||||||
*/ |
|
||||||
public RectView view() |
|
||||||
{ |
|
||||||
return new RectView(this); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
protected void assertWritable() |
|
||||||
{ |
|
||||||
if (!isWritable()) { |
|
||||||
throw new UnsupportedOperationException("This Rect is not writable."); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* New Rect [0, 0, 0, 0] |
|
||||||
*/ |
|
||||||
public Rect() { |
|
||||||
this(0, 0, 0, 0); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Rect [0, 0, size.x, size.y] |
|
||||||
* |
|
||||||
* @param size size coord |
|
||||||
*/ |
|
||||||
public Rect(Coord size) { |
|
||||||
this(0, 0, size.x(), size.y()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* New rect of two coords; Coords are plugged in directly (ie. views can be |
|
||||||
* used for frozen rect representing another) |
|
||||||
* |
|
||||||
* @param min coord 1 |
|
||||||
* @param max coord 2 |
|
||||||
*/ |
|
||||||
public Rect(Coord min, Coord max) { |
|
||||||
this.min = min; // must not copy
|
|
||||||
this.max = max; // must not copy
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* New Rect |
|
||||||
* |
|
||||||
* @param xmin lower x |
|
||||||
* @param ymin lower y |
|
||||||
* @param xmax upper x |
|
||||||
* @param ymax upper y |
|
||||||
*/ |
|
||||||
public Rect(double xmin, double ymin, double xmax, double ymax) { |
|
||||||
min = new Coord(xmin, ymin); |
|
||||||
max = new Coord(xmax, ymax); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Rect [0, 0, x, y] |
|
||||||
* |
|
||||||
* @param x width |
|
||||||
* @param y height |
|
||||||
*/ |
|
||||||
public Rect(double x, double y) { |
|
||||||
this(0, 0, x, y); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* New rect as a copy of other rect |
|
||||||
* |
|
||||||
* @param r other rect |
|
||||||
*/ |
|
||||||
public Rect(Rect r) { |
|
||||||
this(r.min.copy(), r.max.copy()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get offset copy (add) |
|
||||||
* |
|
||||||
* @param move offset vector |
|
||||||
* @return offset copy |
|
||||||
*/ |
|
||||||
public Rect add(Coord move) |
|
||||||
{ |
|
||||||
return copy().add_ip(move); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Add X and Y to all coordinates in a copy |
|
||||||
* |
|
||||||
* @param x x to add |
|
||||||
* @param y y to add |
|
||||||
* @return copy changed |
|
||||||
*/ |
|
||||||
public Rect add(double x, double y) |
|
||||||
{ |
|
||||||
return add(new Coord(x, y)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Offset in place (add) |
|
||||||
* |
|
||||||
* @param move offset vector |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect add_ip(Coord move) |
|
||||||
{ |
|
||||||
min.add_ip(move); |
|
||||||
max.add_ip(move); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Add X and Y to all coordinates in place |
|
||||||
* |
|
||||||
* @param x x to add |
|
||||||
* @param y y to add |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect add_ip(double x, double y) |
|
||||||
{ |
|
||||||
return add_ip(new Coord(x, y)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get a copy |
|
||||||
* |
|
||||||
* @return copy |
|
||||||
*/ |
|
||||||
public Rect copy() |
|
||||||
{ |
|
||||||
return new Rect(this); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get rect center |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getCenter() |
|
||||||
{ |
|
||||||
return min.midTo(max).freeze(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get center of the lower edge. |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getCenterVMin() |
|
||||||
{ |
|
||||||
return new Coord((max.x() + min.x()) / 2D, min.y()).freeze(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get center of the left edge. |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getCenterHMin() |
|
||||||
{ |
|
||||||
return new Coord(min.x(), (max.y() + min.y()) / 2D).freeze(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get center of the right edge. |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getCenterHMax() |
|
||||||
{ |
|
||||||
return new Coord(max.x(), (max.y() + min.y()) / 2D).freeze(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get center of the top edge. |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getCenterVMax() |
|
||||||
{ |
|
||||||
return new Coord((max.x() + min.x()) / 2D, max.y()).freeze(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get left bottom |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getHMinVMin() |
|
||||||
{ |
|
||||||
return min.view(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get left top |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getHMinVMax() |
|
||||||
{ |
|
||||||
return HMinVMax; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get right bottom |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getHMaxVMin() |
|
||||||
{ |
|
||||||
return HMaxVMin; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get right top |
|
||||||
* |
|
||||||
* @return center |
|
||||||
*/ |
|
||||||
public Coord getHMaxVMax() |
|
||||||
{ |
|
||||||
return max.view(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Alias for getX2Y2 |
|
||||||
* |
|
||||||
* @return highest coordinates xy |
|
||||||
*/ |
|
||||||
public Coord getMax() |
|
||||||
{ |
|
||||||
return getHMaxVMax(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Alias for getX1Y1 |
|
||||||
* |
|
||||||
* @return lowest coordinates xy |
|
||||||
*/ |
|
||||||
public Coord getMin() |
|
||||||
{ |
|
||||||
return getHMinVMin(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Alias for getX1Y1 |
|
||||||
* |
|
||||||
* @return lowest coordinates xy |
|
||||||
*/ |
|
||||||
public Coord getOrigin() |
|
||||||
{ |
|
||||||
return getHMinVMin(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Shrink to sides in copy |
|
||||||
* |
|
||||||
* @param shrink shrink size (added to each side) |
|
||||||
* @return shrinkn copy |
|
||||||
*/ |
|
||||||
public Rect shrink(Coord shrink) |
|
||||||
{ |
|
||||||
return copy().shrink_ip(shrink); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Shrink to sides in copy |
|
||||||
* |
|
||||||
* @param x x to add |
|
||||||
* @param y y to add |
|
||||||
* @return changed copy |
|
||||||
*/ |
|
||||||
public Rect shrink(double x, double y) |
|
||||||
{ |
|
||||||
return copy().shrink_ip(x, y); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Shrink to sides in place |
|
||||||
* |
|
||||||
* @param shrink shrink size (added to each side) |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect shrink_ip(Coord shrink) |
|
||||||
{ |
|
||||||
shrink_ip(shrink.x(), shrink.y()); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Shrink to sides in place |
|
||||||
* |
|
||||||
* @param x horizontal shrink |
|
||||||
* @param y vertical shrink |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect shrink_ip(double x, double y) |
|
||||||
{ |
|
||||||
min.sub_ip(x, y); |
|
||||||
max.add_ip(-x, -y); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Shrink the rect |
|
||||||
* |
|
||||||
* @param xmin shrink |
|
||||||
* @param ymin shrink |
|
||||||
* @param xmax shrink |
|
||||||
* @param ymax shrink |
|
||||||
* @return changed copy |
|
||||||
*/ |
|
||||||
public Rect shrink(double xmin, double ymin, double xmax, double ymax) |
|
||||||
{ |
|
||||||
return copy().shrink_ip(xmin, ymin, xmax, ymax); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Shrink the rect in place |
|
||||||
* |
|
||||||
* @param xmin shrink |
|
||||||
* @param ymin shrink |
|
||||||
* @param xmax shrink |
|
||||||
* @param ymax shrink |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect shrink_ip(double xmin, double ymin, double xmax, double ymax) |
|
||||||
{ |
|
||||||
min.add_ip(xmin, ymin); |
|
||||||
max.add_ip(-xmax, -ymax); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Grow to sides in copy |
|
||||||
* |
|
||||||
* @param grow grow size (added to each side) |
|
||||||
* @return grown copy |
|
||||||
*/ |
|
||||||
public Rect grow(Coord grow) |
|
||||||
{ |
|
||||||
return copy().grow_ip(grow); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Grow to sides in copy |
|
||||||
* |
|
||||||
* @param x horizontal grow |
|
||||||
* @param y vertical grow |
|
||||||
* @return changed copy |
|
||||||
*/ |
|
||||||
public Rect grow(double x, double y) |
|
||||||
{ |
|
||||||
return copy().grow_ip(x, y); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Grow to sides in place |
|
||||||
* |
|
||||||
* @param grow grow size (added to each side) |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect grow_ip(Coord grow) |
|
||||||
{ |
|
||||||
grow_ip(grow.x(), grow.y()); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Grow to sides in place |
|
||||||
* |
|
||||||
* @param x horizontal grow |
|
||||||
* @param y vertical grow |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect grow_ip(double x, double y) |
|
||||||
{ |
|
||||||
min.sub_ip(x, y); |
|
||||||
max.add_ip(x, y); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Grow the rect |
|
||||||
* |
|
||||||
* @param xmin growth |
|
||||||
* @param ymin growth |
|
||||||
* @param xmax growth |
|
||||||
* @param ymax growth |
|
||||||
* @return changed copy |
|
||||||
*/ |
|
||||||
public Rect grow(double xmin, double ymin, double xmax, double ymax) |
|
||||||
{ |
|
||||||
return copy().grow_ip(xmin, ymin, xmax, ymax); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Grow the rect in place |
|
||||||
* |
|
||||||
* @param xmin growth |
|
||||||
* @param ymin growth |
|
||||||
* @param xmax growth |
|
||||||
* @param ymax growth |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect grow_ip(double xmin, double ymin, double xmax, double ymax) |
|
||||||
{ |
|
||||||
min.add_ip(-xmin, -ymin); |
|
||||||
max.add_ip(xmax, ymax); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Check if point is inside this rectangle |
|
||||||
* |
|
||||||
* @param point point to test |
|
||||||
* @return is inside |
|
||||||
*/ |
|
||||||
public boolean isInside(Coord point) |
|
||||||
{ |
|
||||||
return Calc.inRange(point.x(), min.x(), max.x()) && Calc.inRange(point.y(), min.y(), max.y()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Multiply in copy |
|
||||||
* |
|
||||||
* @param factor multiplier |
|
||||||
* @return offset copy |
|
||||||
*/ |
|
||||||
public Rect mul(double factor) |
|
||||||
{ |
|
||||||
return copy().mul_ip(factor); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Multiply by number (useful for centered rects) |
|
||||||
* |
|
||||||
* @param x x multiplier |
|
||||||
* @param y y multiplier |
|
||||||
* @return copy multiplied |
|
||||||
*/ |
|
||||||
public Rect mul(double x, double y) |
|
||||||
{ |
|
||||||
return copy().mul_ip(x, y); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Multiply coord in place |
|
||||||
* |
|
||||||
* @param factor multiplier |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect mul_ip(double factor) |
|
||||||
{ |
|
||||||
min.mul_ip(factor); |
|
||||||
max.mul_ip(factor); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Multiply coord in place |
|
||||||
* |
|
||||||
* @param x multiplier x |
|
||||||
* @param y multiplier y |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect mul_ip(double x, double y) |
|
||||||
{ |
|
||||||
min.mul_ip(x, y, 1); |
|
||||||
max.mul_ip(x, y, 1); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Round coords in copy |
|
||||||
* |
|
||||||
* @return copy, rounded |
|
||||||
*/ |
|
||||||
public Rect round() |
|
||||||
{ |
|
||||||
return new Rect(min.round(), max.round()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Round this in place |
|
||||||
* |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect round_ip() |
|
||||||
{ |
|
||||||
min.round_ip(); |
|
||||||
max.round_ip(); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Set to coordinates |
|
||||||
* |
|
||||||
* @param xmin lower x |
|
||||||
* @param ymin lower y |
|
||||||
* @param xmax upper x |
|
||||||
* @param ymax upper y |
|
||||||
*/ |
|
||||||
public void setTo(double xmin, double ymin, double xmax, double ymax) |
|
||||||
{ |
|
||||||
min.setTo(Math.min(xmin, xmax), Math.min(ymin, ymax)); |
|
||||||
max.setTo(Math.max(xmin, xmax), Math.max(ymin, ymax)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Set to other rect's coordinates |
|
||||||
* |
|
||||||
* @param r other rect |
|
||||||
*/ |
|
||||||
public void setTo(Rect r) |
|
||||||
{ |
|
||||||
min.setTo(r.min); |
|
||||||
max.setTo(r.max); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Subtract X and Y from all coordinates in a copy |
|
||||||
* |
|
||||||
* @param x x to subtract |
|
||||||
* @param y y to subtract |
|
||||||
* @return copy changed |
|
||||||
*/ |
|
||||||
public Rect sub(double x, double y) |
|
||||||
{ |
|
||||||
return sub(new Coord(x, y)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get offset copy (subtract) |
|
||||||
* |
|
||||||
* @param move offset vector |
|
||||||
* @return offset copy |
|
||||||
*/ |
|
||||||
public Rect sub(Coord move) |
|
||||||
{ |
|
||||||
return copy().sub_ip(move); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Subtract X and Y from all coordinates in place |
|
||||||
* |
|
||||||
* @param x x to subtract |
|
||||||
* @param y y to subtract |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect sub_ip(double x, double y) |
|
||||||
{ |
|
||||||
return sub_ip(new Coord(x, y)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Offset in place (subtract) |
|
||||||
* |
|
||||||
* @param move offset vector |
|
||||||
* @return this |
|
||||||
*/ |
|
||||||
public Rect sub_ip(Coord move) |
|
||||||
{ |
|
||||||
min.sub_ip(move); |
|
||||||
max.sub_ip(move); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public String toString() |
|
||||||
{ |
|
||||||
return String.format("[%s-%s]", min.toString(), max.toString()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return lower x |
|
||||||
*/ |
|
||||||
public double xMin() |
|
||||||
{ |
|
||||||
return min.x(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return upper x |
|
||||||
*/ |
|
||||||
public double xMax() |
|
||||||
{ |
|
||||||
return max.x(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return lower y |
|
||||||
*/ |
|
||||||
public double yMin() |
|
||||||
{ |
|
||||||
return min.y(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return upper y |
|
||||||
*/ |
|
||||||
public double yMax() |
|
||||||
{ |
|
||||||
return max.y(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public double getHeight() |
|
||||||
{ |
|
||||||
return max.y() - min.y(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public double getWidth() |
|
||||||
{ |
|
||||||
return max.x() - min.x(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get size (width, height) as (x,y) |
|
||||||
* |
|
||||||
* @return coord of width,height |
|
||||||
*/ |
|
||||||
public Coord getSize() |
|
||||||
{ |
|
||||||
return new Coord(max.x() - min.x(), max.y() - min.y()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect getRect() |
|
||||||
{ |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Generate zero rect |
|
||||||
* |
|
||||||
* @return zero |
|
||||||
*/ |
|
||||||
public static Rect zero() |
|
||||||
{ |
|
||||||
return ZERO.copy(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Generate 0,0-1,1 rect |
|
||||||
* |
|
||||||
* @return one |
|
||||||
*/ |
|
||||||
public static Rect one() |
|
||||||
{ |
|
||||||
return ZERO.copy(); |
|
||||||
} |
|
||||||
} |
|
@ -1,37 +0,0 @@ |
|||||||
package mightypork.utils.math.coord; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Read only rect |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public class RectView extends Rect { |
|
||||||
|
|
||||||
public RectView(Rect observed) { |
|
||||||
super(observed.min.view(), observed.max.view()); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isWritable() |
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isView() |
|
||||||
{ |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public Rect freeze() |
|
||||||
{ |
|
||||||
// do nothing
|
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,25 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumberConstraint; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 2D coord for anonymous implementations.<br> |
||||||
|
* Operations yield a new {@link MutableCoord} with the result. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class SynthCoord2D extends VecView { |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double x(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double y(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumberConstraint; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 3D immutable coord for anonymous implementations.<br> |
||||||
|
* Operations yield a new {@link MutableCoord} with the result. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class SynthCoord3D extends VecView { |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double x(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double y(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double z(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,101 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumberConstraint; |
||||||
|
|
||||||
|
|
||||||
|
public interface Vec { |
||||||
|
|
||||||
|
public static final VecView ZERO = new CoordValue(0, 0, 0); |
||||||
|
public static final VecView ONE = new CoordValue(1, 1, 1); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X coordinate |
||||||
|
*/ |
||||||
|
double x(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y coordinate |
||||||
|
*/ |
||||||
|
double y(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z coordinate |
||||||
|
*/ |
||||||
|
double z(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X rounded |
||||||
|
*/ |
||||||
|
int xi(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y rounded |
||||||
|
*/ |
||||||
|
int yi(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z rounded |
||||||
|
*/ |
||||||
|
int zi(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X as float |
||||||
|
*/ |
||||||
|
float xf(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y as float |
||||||
|
*/ |
||||||
|
float yf(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z as float |
||||||
|
*/ |
||||||
|
float zf(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X constraint |
||||||
|
*/ |
||||||
|
NumberConstraint xc(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y constraint |
||||||
|
*/ |
||||||
|
NumberConstraint yc(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z constraint |
||||||
|
*/ |
||||||
|
NumberConstraint zc(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a new mutable variable holding the current state |
||||||
|
* |
||||||
|
* @return a mutable copy |
||||||
|
*/ |
||||||
|
MutableCoord copy(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get immutable view at this vec |
||||||
|
* |
||||||
|
* @return immutable view |
||||||
|
*/ |
||||||
|
CoordProxy view(); |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,248 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.VecConstraint; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 3D coordinate methods |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
interface VecArith extends Vec { |
||||||
|
|
||||||
|
/** |
||||||
|
* Set X coordinate (if immutable, in a copy). |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec setX(double x); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set Y coordinate (if immutable, in a copy). |
||||||
|
* |
||||||
|
* @param y y coordinate |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec setY(double y); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set Z coordinate (if immutable, in a copy). |
||||||
|
* |
||||||
|
* @param z z coordinate |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec setZ(double z); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get distance to other point |
||||||
|
* |
||||||
|
* @param point other point |
||||||
|
* @return distance |
||||||
|
*/ |
||||||
|
double distTo(Vec point); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get dot product (scalar multiplication) |
||||||
|
* |
||||||
|
* @param vec other vector |
||||||
|
* @return dot product |
||||||
|
*/ |
||||||
|
double dot(Vec vec); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get vector size |
||||||
|
* |
||||||
|
* @return size |
||||||
|
*/ |
||||||
|
double size(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return true if zero |
||||||
|
*/ |
||||||
|
boolean isZero(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Create vector from this point to other point |
||||||
|
* |
||||||
|
* @param point second point |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec vecTo(Vec point); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get middle of line to other point |
||||||
|
* |
||||||
|
* @param point other point |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec midTo(Vec point); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add a vector. |
||||||
|
* |
||||||
|
* @param vec offset |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec add(Vec vec); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add to each component.<br> |
||||||
|
* Z is unchanged. |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec add(double x, double y); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add to each component. |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @param z z offset |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec add(double x, double y, double z); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get copy divided by two |
||||||
|
* |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec half(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply each component. |
||||||
|
* |
||||||
|
* @param d multiplier |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec mul(double d); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply each component. |
||||||
|
* |
||||||
|
* @param vec vector of multipliers |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec mul(Vec vec); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply each component.<br> |
||||||
|
* Z is unchanged. |
||||||
|
* |
||||||
|
* @param x x multiplier |
||||||
|
* @param y y multiplier |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec mul(double x, double y); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply each component. |
||||||
|
* |
||||||
|
* @param x x multiplier |
||||||
|
* @param y y multiplier |
||||||
|
* @param z z multiplier |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec mul(double x, double y, double z); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Round coordinates. |
||||||
|
* |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec round(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Round coordinates down. |
||||||
|
* |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec floor(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Round coordinates up. |
||||||
|
* |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec ceil(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Subtract vector. |
||||||
|
* |
||||||
|
* @param vec offset |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec sub(Vec vec); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Subtract a 2D vector.<br> |
||||||
|
* Z is unchanged. |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
VecArith sub(double x, double y); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Subtract a 3D vector. |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @param z z offset |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec sub(double x, double y, double z); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Negate all coordinates (* -1) |
||||||
|
* |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec neg(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Scale vector to given size. |
||||||
|
* |
||||||
|
* @param size size we need |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Vec norm(double size); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get cross product (vector multiplication) |
||||||
|
* |
||||||
|
* @param vec other vector |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Vec cross(Vec vec); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,383 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumberConstraint; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of coordinate methods |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
* @param <V> Return type of methods |
||||||
|
*/ |
||||||
|
abstract class VecImpl<V extends VecArith> implements VecArith { |
||||||
|
|
||||||
|
private NumberConstraint constraintZ, constraintY, constraintX; |
||||||
|
|
||||||
|
private CoordProxy view = null; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double x(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double y(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double z(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int xi() |
||||||
|
{ |
||||||
|
return (int) Math.round(x()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int yi() |
||||||
|
{ |
||||||
|
return (int) Math.round(y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int zi() |
||||||
|
{ |
||||||
|
return (int) Math.round(z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public float xf() |
||||||
|
{ |
||||||
|
return (float) x(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public float yf() |
||||||
|
{ |
||||||
|
return (float) y(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public float zf() |
||||||
|
{ |
||||||
|
return (float) z(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* Some operation was performed and this result was obtained. |
||||||
|
* </p> |
||||||
|
* <p> |
||||||
|
* It's now up to implementing class what to do - mutable ones can alter |
||||||
|
* it's data values, immutable can return a new Vec. |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @param x |
||||||
|
* @param y |
||||||
|
* @param z |
||||||
|
* @return the result Vec |
||||||
|
*/ |
||||||
|
public abstract V result(double x, double y, double z); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public MutableCoord copy() |
||||||
|
{ |
||||||
|
return new MutableCoord(this); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public CoordProxy view() |
||||||
|
{ |
||||||
|
if (view == null) view = new CoordProxy(this); |
||||||
|
|
||||||
|
return view; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumberConstraint xc() |
||||||
|
{ |
||||||
|
if (constraintX == null) constraintX = new NumberConstraint() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double getValue() |
||||||
|
{ |
||||||
|
return x(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return constraintX; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumberConstraint yc() |
||||||
|
{ |
||||||
|
if (constraintY == null) constraintY = new NumberConstraint() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double getValue() |
||||||
|
{ |
||||||
|
return y(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return constraintY; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumberConstraint zc() |
||||||
|
{ |
||||||
|
if (constraintZ == null) constraintZ = new NumberConstraint() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double getValue() |
||||||
|
{ |
||||||
|
return z(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return constraintZ; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V setX(double x) |
||||||
|
{ |
||||||
|
return result(x, y(), z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V setY(double y) |
||||||
|
{ |
||||||
|
return result(x(), y, z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V setZ(double z) |
||||||
|
{ |
||||||
|
return result(x(), y(), z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double size() |
||||||
|
{ |
||||||
|
double x = x(), y = y(), z = z(); |
||||||
|
return Math.sqrt(x * x + y * y + z * z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isZero() |
||||||
|
{ |
||||||
|
return x() == 0 && y() == 0 && z() == 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V add(Vec vec) |
||||||
|
{ |
||||||
|
return add(vec.x(), vec.y(), vec.z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V add(double x, double y) |
||||||
|
{ |
||||||
|
return add(x, y, 0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V add(double x, double y, double z) |
||||||
|
{ |
||||||
|
return result(x, y, z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double distTo(Vec point) |
||||||
|
{ |
||||||
|
double dx = x() - point.x(); |
||||||
|
double dy = y() - point.y(); |
||||||
|
double dz = z() - point.z(); |
||||||
|
|
||||||
|
return Math.sqrt(dx * dx + dy * dy + dz * dz); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V midTo(Vec point) |
||||||
|
{ |
||||||
|
double dx = (point.x() - x()) * 0.5; |
||||||
|
double dy = (point.y() - y()) * 0.5; |
||||||
|
double dz = (point.z() - z()) * 0.5; |
||||||
|
|
||||||
|
return result(dx, dy, dz); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V half() |
||||||
|
{ |
||||||
|
return mul(0.5); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(double d) |
||||||
|
{ |
||||||
|
return mul(d, d, d); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(Vec vec) |
||||||
|
{ |
||||||
|
return mul(vec.x(), vec.y(), vec.z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(double x, double y) |
||||||
|
{ |
||||||
|
return mul(x, y, 1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(double x, double y, double z) |
||||||
|
{ |
||||||
|
return result(x() * x, y() * y, z() * z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V round() |
||||||
|
{ |
||||||
|
return result(Math.round(x()), Math.round(y()), Math.round(z())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V floor() |
||||||
|
{ |
||||||
|
return result(Math.floor(x()), Math.floor(y()), Math.floor(z())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V ceil() |
||||||
|
{ |
||||||
|
return result(Math.ceil(x()), Math.ceil(y()), Math.ceil(z())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V sub(Vec vec) |
||||||
|
{ |
||||||
|
return sub(vec.x(), vec.y(), vec.z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V sub(double x, double y) |
||||||
|
{ |
||||||
|
return sub(x, y, 0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V sub(double x, double y, double z) |
||||||
|
{ |
||||||
|
return result(x() - x, y() - y, z() - z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V vecTo(Vec point) |
||||||
|
{ |
||||||
|
return result(point.x() - x(), point.y() - y(), point.z() - z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V cross(Vec vec) |
||||||
|
{ |
||||||
|
//@formatter:off
|
||||||
|
return result( |
||||||
|
y() * vec.z() - z() * vec.y(), |
||||||
|
z() * vec.x() - x() * vec.z(), |
||||||
|
x() * vec.y() - y() * vec.x()); |
||||||
|
//@formatter:on
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double dot(Vec vec) |
||||||
|
{ |
||||||
|
return x() * vec.x() + y() * vec.y() + z() * vec.z(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V neg() |
||||||
|
{ |
||||||
|
return result(-x(), -y(), -z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V norm(double size) |
||||||
|
{ |
||||||
|
if (isZero()) return result(x(), y(), z()); // can't norm zero vector
|
||||||
|
|
||||||
|
double k = size / size(); |
||||||
|
|
||||||
|
return mul(k); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() |
||||||
|
{ |
||||||
|
int prime = 31; |
||||||
|
int result = 1; |
||||||
|
result = prime * result + Double.valueOf(x()).hashCode(); |
||||||
|
result = prime * result + Double.valueOf(y()).hashCode(); |
||||||
|
result = prime * result + Double.valueOf(z()).hashCode(); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object obj) |
||||||
|
{ |
||||||
|
if (this == obj) return true; |
||||||
|
if (obj == null) return false; |
||||||
|
if (!(obj instanceof Vec)) return false; |
||||||
|
Vec other = (Vec) obj; |
||||||
|
|
||||||
|
return x() == other.x() && y() == other.y() && z() == other.z(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return String.format("[ %.2f ; %.2f ; %.2f ]", x(), y(), z()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Mutable coord interface. This coord can be changed at will. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public interface VecMutable extends VecArith { |
||||||
|
|
||||||
|
/** |
||||||
|
* Set coordinates to match other coord. |
||||||
|
* |
||||||
|
* @param copied coord whose coordinates are used |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
VecMutable setTo(Vec copied); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set 2D coordinates.<br> |
||||||
|
* Z is unchanged. |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @param y y coordinate |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
VecMutable setTo(double x, double y); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set coordinates. |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @param y y coordinate |
||||||
|
* @param z z coordinate |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
VecMutable setTo(double x, double y, double z); |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Mutable vec default implementation |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
* @param <V> Return type of methods |
||||||
|
*/ |
||||||
|
abstract class VecMutableImpl<V extends VecMutable> extends VecImpl<V> implements VecMutable { |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double x(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double y(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract double z(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract V result(double x, double y, double z); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VecMutable setTo(Vec copied) |
||||||
|
{ |
||||||
|
return result(copied.x(), copied.y(), copied.z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V setTo(double x, double y, double z) |
||||||
|
{ |
||||||
|
return result(x, y, z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V setTo(double x, double y) |
||||||
|
{ |
||||||
|
return result(x, y, z()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package mightypork.utils.math.coord; |
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.VecConstraint; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Read-only coordinate, operations with it will yield a new {@link MutableCoord} with the result. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class VecView extends VecImpl<CoordValue> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public CoordValue result(double x, double y, double z) |
||||||
|
{ |
||||||
|
return new CoordValue(x,y,z); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,398 @@ |
|||||||
|
package mightypork.utils.math.rect; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.RectConstraint; |
||||||
|
import mightypork.utils.math.constraints.VecConstraint; |
||||||
|
import mightypork.utils.math.coord.MutableCoord; |
||||||
|
import mightypork.utils.math.coord.SynthCoord2D; |
||||||
|
import mightypork.utils.math.coord.Vec; |
||||||
|
import mightypork.utils.math.coord.VecMutable; |
||||||
|
import mightypork.utils.math.coord.VecView; |
||||||
|
|
||||||
|
|
||||||
|
public class Rect { |
||||||
|
|
||||||
|
public static final Rect ONE = new Rect(0, 0, 1, 1); // FIXME
|
||||||
|
private final VecMutable pos = new MutableCoord(); |
||||||
|
private final VecMutable size = new MutableCoord(); |
||||||
|
private final VecView center = new SynthCoord2D() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return pos.x() + size.x() / 2; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return pos.y() + size.y() / 2; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create at 0,0 with zero size |
||||||
|
*/ |
||||||
|
public Rect() { |
||||||
|
// keep default zeros
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create at 0,0 with given size |
||||||
|
* |
||||||
|
* @param width |
||||||
|
* @param height |
||||||
|
*/ |
||||||
|
public Rect(double width, double height) { |
||||||
|
this.pos.setTo(0, 0); |
||||||
|
this.size.setTo(width, height); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create at given origin, with given size. |
||||||
|
* |
||||||
|
* @param origin |
||||||
|
* @param width |
||||||
|
* @param height |
||||||
|
*/ |
||||||
|
public Rect(Vec origin, double width, double height) { |
||||||
|
this.pos.setTo(origin); |
||||||
|
this.size.setTo(width, height); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* make sure the rect doesn't have negative size. |
||||||
|
*/ |
||||||
|
private void norm() |
||||||
|
{ |
||||||
|
if (size.x() < 0) { |
||||||
|
pos.sub(-size.x(), 0); |
||||||
|
size.mul(-1, 1); |
||||||
|
} |
||||||
|
|
||||||
|
if (size.y() < 0) { |
||||||
|
pos.sub(0, -size.y()); |
||||||
|
size.mul(1, -1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create at given origin, with given size. |
||||||
|
* |
||||||
|
* @param origin |
||||||
|
* @param size |
||||||
|
*/ |
||||||
|
public Rect(Vec origin, Vec size) { |
||||||
|
this.pos.setTo(origin); |
||||||
|
this.size.setTo(size); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create at given origin, with given size. |
||||||
|
* |
||||||
|
* @param x |
||||||
|
* @param y |
||||||
|
* @param width |
||||||
|
* @param height |
||||||
|
*/ |
||||||
|
public Rect(double x, double y, double width, double height) { |
||||||
|
pos.setTo(x, y); |
||||||
|
size.setTo(width, height); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create as copy of another |
||||||
|
* |
||||||
|
* @param other copied |
||||||
|
*/ |
||||||
|
public Rect(Rect other) { |
||||||
|
this(other.pos, other.size); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set to other rect's coordinates |
||||||
|
* |
||||||
|
* @param rect other rect |
||||||
|
*/ |
||||||
|
public void setTo(Rect rect) |
||||||
|
{ |
||||||
|
setTo(rect.pos, rect.size); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void setTo(Vec origin, Vec size) |
||||||
|
{ |
||||||
|
this.pos.setTo(origin); |
||||||
|
this.size.setTo(size); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void setOrigin(Vec origin) |
||||||
|
{ |
||||||
|
this.pos.setTo(origin); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public void setSize(Vec size) |
||||||
|
{ |
||||||
|
this.size.setTo(size); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add vector to origin |
||||||
|
* |
||||||
|
* @param move offset vector |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect move(Vec move) |
||||||
|
{ |
||||||
|
move(move.x(), move.y()); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add X and Y to origin |
||||||
|
* |
||||||
|
* @param x x to add |
||||||
|
* @param y y to add |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect move(double x, double y) |
||||||
|
{ |
||||||
|
pos.add(x, y); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy |
||||||
|
* |
||||||
|
* @return copy |
||||||
|
*/ |
||||||
|
public Rect copy() |
||||||
|
{ |
||||||
|
return new Rect(this); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Shrink to sides |
||||||
|
* |
||||||
|
* @param shrink shrink size (horisontal and vertical) |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect shrink(Vec shrink) |
||||||
|
{ |
||||||
|
return shrink(shrink.x(), shrink.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Shrink to sides at sides |
||||||
|
* |
||||||
|
* @param x horizontal shrink |
||||||
|
* @param y vertical shrink |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect shrink(double x, double y) |
||||||
|
{ |
||||||
|
return shrink(x, y, x, y); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Shrink the rect |
||||||
|
* |
||||||
|
* @param left shrink |
||||||
|
* @param top shrink |
||||||
|
* @param right shrink |
||||||
|
* @param bottom shrink |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect shrink(double left, double top, double right, double bottom) |
||||||
|
{ |
||||||
|
pos.add(left, top); |
||||||
|
size.sub(left + right, top + bottom); |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Grow to sides |
||||||
|
* |
||||||
|
* @param grow grow size (added to each side) |
||||||
|
* @return grown copy |
||||||
|
*/ |
||||||
|
public Rect grow(Vec grow) |
||||||
|
{ |
||||||
|
return grow(grow.x(), grow.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Grow to sides |
||||||
|
* |
||||||
|
* @param x horizontal grow |
||||||
|
* @param y vertical grow |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect grow(double x, double y) |
||||||
|
{ |
||||||
|
return grow(x, y, x, y); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Grow the rect |
||||||
|
* |
||||||
|
* @param left growth |
||||||
|
* @param top growth |
||||||
|
* @param right growth |
||||||
|
* @param bottom growth |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect grow(double left, double top, double right, double bottom) |
||||||
|
{ |
||||||
|
pos.sub(left, top); |
||||||
|
size.add(left + right, top + bottom); |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Check if point is inside this rectangle |
||||||
|
* |
||||||
|
* @param point point to test |
||||||
|
* @return is inside |
||||||
|
*/ |
||||||
|
public boolean contains(Vec point) |
||||||
|
{ |
||||||
|
final double x = point.x(), y = point.y(); |
||||||
|
|
||||||
|
final double x1 = pos.x(), y1 = pos.y(); |
||||||
|
final double x2 = x1 + size.x(), y2 = y1 + size.y(); |
||||||
|
|
||||||
|
return x >= x1 && y >= y1 && x <= x2 && y <= y2; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Round coords |
||||||
|
* |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect round() |
||||||
|
{ |
||||||
|
pos.round(); |
||||||
|
size.round(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get offset copy (subtract) |
||||||
|
* |
||||||
|
* @param move offset vector |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
public Rect sub(Vec move) |
||||||
|
{ |
||||||
|
return sub(move.x(), move.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Subtract X and Y from all coordinates |
||||||
|
* |
||||||
|
* @param x x to subtract |
||||||
|
* @param y y to subtract |
||||||
|
* @return result |
||||||
|
*/ |
||||||
|
Rect sub(double x, double y) |
||||||
|
{ |
||||||
|
pos.sub(x, y); |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public VecView getOrigin() |
||||||
|
{ |
||||||
|
return pos.view(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public VecView getSize() |
||||||
|
{ |
||||||
|
return size.view(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public VecView getCenter() |
||||||
|
{ |
||||||
|
return center; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public double getWidth() |
||||||
|
{ |
||||||
|
return size.x(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public double getHeight() |
||||||
|
{ |
||||||
|
return size.y(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return String.format("[%s-%s]", pos.toString(), pos.view().add(size).toString()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public double xMin() |
||||||
|
{ |
||||||
|
return pos.x(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public double xMax() |
||||||
|
{ |
||||||
|
return pos.x() + size.x(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public double yMin() |
||||||
|
{ |
||||||
|
return pos.y(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public double yMax() |
||||||
|
{ |
||||||
|
return pos.y() + size.y(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,276 @@ |
|||||||
|
//package mightypork.utils.math.rect;
|
||||||
|
//
|
||||||
|
//import mightypork.utils.math.constraints.NumberConstraint;
|
||||||
|
//import mightypork.utils.math.coord.VecValue;
|
||||||
|
//import mightypork.utils.math.coord.VecView;
|
||||||
|
//import mightypork.utils.math.coord.SynthCoord3D;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//public class RectCalc {
|
||||||
|
// /* ================= Coords ================= */
|
||||||
|
//
|
||||||
|
// public static NumberConstraint _x(final VecValue c)
|
||||||
|
// {
|
||||||
|
// return c.xc();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static NumberConstraint _y(final VecValue c)
|
||||||
|
// {
|
||||||
|
// return c.yc();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static NumberConstraint _z(final VecValue c)
|
||||||
|
// {
|
||||||
|
// return c.zc();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _neg(final VecValue c)
|
||||||
|
// {
|
||||||
|
// return _mul(c, -1);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _half(final VecValue c)
|
||||||
|
// {
|
||||||
|
// return _mul(c, 0.5);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // --- add ---
|
||||||
|
//
|
||||||
|
// public static VecView _add(final VecValue c1, final VecValue c2)
|
||||||
|
// {
|
||||||
|
// return new SynthCoord3D() {
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double x()
|
||||||
|
// {
|
||||||
|
// return c1.x() + c2.x();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double y()
|
||||||
|
// {
|
||||||
|
// return c1.y() + c2.y();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double z()
|
||||||
|
// {
|
||||||
|
// return c1.z() + c2.z();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _add(final VecValue c, final Object x, final Object y)
|
||||||
|
// {
|
||||||
|
// return _add(c, x, y, 0);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _add(final VecValue c, final Object x, final Object y, final Object z)
|
||||||
|
// {
|
||||||
|
// return new SynthCoord3D() {
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double x()
|
||||||
|
// {
|
||||||
|
// return c.x() + num(x);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double y()
|
||||||
|
// {
|
||||||
|
// return c.y() + num(y);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double z()
|
||||||
|
// {
|
||||||
|
// return c.z() + num(z);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // --- sub ---
|
||||||
|
//
|
||||||
|
// public static VecView _sub(final VecValue c1, final VecValue c2)
|
||||||
|
// {
|
||||||
|
// return new SynthCoord3D() {
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double x()
|
||||||
|
// {
|
||||||
|
// return c1.x() - c2.x();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double y()
|
||||||
|
// {
|
||||||
|
// return c1.y() - c2.y();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double z()
|
||||||
|
// {
|
||||||
|
// return c1.z() - c2.z();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _sub(final VecValue c, final Object x, final Object y)
|
||||||
|
// {
|
||||||
|
// return _add(c, x, y, 0);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _sub(final VecValue c, final Object x, final Object y, final Object z)
|
||||||
|
// {
|
||||||
|
// return new SynthCoord3D() {
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double x()
|
||||||
|
// {
|
||||||
|
// return c.x() - num(x);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double y()
|
||||||
|
// {
|
||||||
|
// return c.y() - num(y);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double z()
|
||||||
|
// {
|
||||||
|
// return c.z() - num(z);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// // --- mul ---
|
||||||
|
//
|
||||||
|
// public static VecView _mul(final VecValue c, final Object mul)
|
||||||
|
// {
|
||||||
|
// return new SynthCoord3D() {
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double x()
|
||||||
|
// {
|
||||||
|
// return c.x() * num(mul);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double y()
|
||||||
|
// {
|
||||||
|
// return c.y() * num(mul);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double z()
|
||||||
|
// {
|
||||||
|
// return c.z() * num(mul);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static VecView _origin(final Rect r)
|
||||||
|
// {
|
||||||
|
// return r.getOrigin().view();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _size(final Rect r)
|
||||||
|
// {
|
||||||
|
// return r.getSize().view();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static NumberConstraint _width(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _x(_size(r));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static NumberConstraint _height(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _y(_size(r));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _center(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), _half(_size(r)));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _top_left(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _origin(r);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _top_right(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), _width(r), 0);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _bottom_left(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), 0, _height(r));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _bottom_right(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), _size(r));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _center_top(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), _half(_width(r)), 0);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _center_bottom(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), _half(_width(r)), _height(r));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _center_left(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), 0, _half(_height(r)));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public static VecView _center_right(final Rect r)
|
||||||
|
// {
|
||||||
|
// return _add(_origin(r), _width(r), _half(_height(r)));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//}
|
@ -0,0 +1,906 @@ |
|||||||
|
//package mightypork.utils.math.rect;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//import mightypork.utils.math.Calc;
|
||||||
|
//import mightypork.utils.math.constraints.NumberConstraint;
|
||||||
|
//import mightypork.utils.math.constraints.RectConstraint;
|
||||||
|
//import mightypork.utils.math.coord.ConstrCoord;
|
||||||
|
//import mightypork.utils.math.coord.VecValue;
|
||||||
|
//import mightypork.utils.math.coord.VecArith;
|
||||||
|
//import mightypork.utils.math.coord.VecMutable;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
///**
|
||||||
|
// * Rectangle determined by two coordinates - min and max.
|
||||||
|
// *
|
||||||
|
// * @author MightyPork
|
||||||
|
// */
|
||||||
|
//public class Rectd implements RectConstraint, IRect {
|
||||||
|
//
|
||||||
|
// public static final IRect ZERO = new Rect(0, 0, 0, 0).freeze();
|
||||||
|
// public static final Rect ONE = new Rect(0, 0, 1, 1).freeze();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Rectangle from size; coords are copied.
|
||||||
|
// *
|
||||||
|
// * @param min min coord
|
||||||
|
// * @param size rect size
|
||||||
|
// * @return the rect
|
||||||
|
// */
|
||||||
|
// public static Rect fromSize(VecArith min, VecValue size)
|
||||||
|
// {
|
||||||
|
// return fromSize(min, size.xi(), size.yi());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Make rect from min coord and size; coords are copied.
|
||||||
|
// *
|
||||||
|
// * @param min min coord
|
||||||
|
// * @param width size x
|
||||||
|
// * @param height size y
|
||||||
|
// * @return the new rect
|
||||||
|
// */
|
||||||
|
// public static Rect fromSize(VecArith min, double width, double height)
|
||||||
|
// {
|
||||||
|
// return new Rect(min.copy(), min.add(width, height));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Rectangle from size
|
||||||
|
// *
|
||||||
|
// * @param sizeX size x
|
||||||
|
// * @param sizeY size y
|
||||||
|
// * @return rect
|
||||||
|
// */
|
||||||
|
// public static IRect fromSize(double sizeX, double sizeY)
|
||||||
|
// {
|
||||||
|
// return fromSize(0, 0, sizeX, sizeY);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get rect from size
|
||||||
|
// *
|
||||||
|
// * @param size size
|
||||||
|
// * @return rect
|
||||||
|
// */
|
||||||
|
// public static IRect fromSize(VecValue size)
|
||||||
|
// {
|
||||||
|
// return fromSize(0, 0, size.x(), size.y());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Make rect from min coord and size
|
||||||
|
// *
|
||||||
|
// * @param xmin min x
|
||||||
|
// * @param ymin min y
|
||||||
|
// * @param width size x
|
||||||
|
// * @param height size y
|
||||||
|
// * @return the new rect
|
||||||
|
// */
|
||||||
|
// public static Rect fromSize(double xmin, double ymin, double width, double height)
|
||||||
|
// {
|
||||||
|
// return new Rect(xmin, ymin, xmin + width, ymin + height);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /** Lowest coordinates xy */
|
||||||
|
// protected final VecArith min;
|
||||||
|
//
|
||||||
|
// /** Highest coordinates xy */
|
||||||
|
// protected final VecArith max;
|
||||||
|
//
|
||||||
|
// // view of secondary corners.
|
||||||
|
//
|
||||||
|
// //@formatter:off
|
||||||
|
// private final ConstrCoord HMinVMax = new ConstrCoord(
|
||||||
|
// new NumberConstraint() {
|
||||||
|
// @Override
|
||||||
|
// public double getValue()
|
||||||
|
// {
|
||||||
|
// return min.x();
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// new NumberConstraint() {
|
||||||
|
// @Override
|
||||||
|
// public double getValue()
|
||||||
|
// {
|
||||||
|
// return max.y();
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// null
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// private final ConstrCoord HMaxVMin = new ConstrCoord(
|
||||||
|
// new NumberConstraint() {
|
||||||
|
// @Override
|
||||||
|
// public double getValue() {
|
||||||
|
// return max.x();
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// new NumberConstraint() {
|
||||||
|
// @Override
|
||||||
|
// public double getValue()
|
||||||
|
// {
|
||||||
|
// return min.y();
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// null
|
||||||
|
// );
|
||||||
|
// //@formatter:on
|
||||||
|
//
|
||||||
|
// private boolean frozen;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public boolean isWritable()
|
||||||
|
// {
|
||||||
|
// return !frozen && !isView();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public boolean isView()
|
||||||
|
// {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// public Rect freeze()
|
||||||
|
// {
|
||||||
|
// min.copy();
|
||||||
|
// max.copy();
|
||||||
|
// frozen = true;
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get a readonly view
|
||||||
|
// *
|
||||||
|
// * @return view
|
||||||
|
// */
|
||||||
|
// public RectView view()
|
||||||
|
// {
|
||||||
|
// return new RectView(this);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// protected void assertWritable()
|
||||||
|
// {
|
||||||
|
// if (!isWritable()) {
|
||||||
|
// throw new UnsupportedOperationException("This Rect is not writable.");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * New Rect [0, 0, 0, 0]
|
||||||
|
// */
|
||||||
|
// public Rect() {
|
||||||
|
// this(0, 0, 0, 0);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Rect [0, 0, size.x, size.y]
|
||||||
|
// *
|
||||||
|
// * @param size size coord
|
||||||
|
// */
|
||||||
|
// public Rect(VecValue size) {
|
||||||
|
// this(0, 0, size.x(), size.y());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * New rect of two coords; Coords are plugged in directly (ie. views can be
|
||||||
|
// * used for frozen rect representing another)
|
||||||
|
// *
|
||||||
|
// * @param min coord 1
|
||||||
|
// * @param max coord 2
|
||||||
|
// */
|
||||||
|
// public Rect(VecValue min, VecValue max) {
|
||||||
|
// this.min = min; // must not copy
|
||||||
|
// this.max = max; // must not copy
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * New Rect
|
||||||
|
// *
|
||||||
|
// * @param xmin lower x
|
||||||
|
// * @param ymin lower y
|
||||||
|
// * @param xmax upper x
|
||||||
|
// * @param ymax upper y
|
||||||
|
// */
|
||||||
|
// public Rect(double xmin, double ymin, double xmax, double ymax) {
|
||||||
|
// min = new VecArith(xmin, ymin);
|
||||||
|
// max = new VecArith(xmax, ymax);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Rect [0, 0, x, y]
|
||||||
|
// *
|
||||||
|
// * @param x width
|
||||||
|
// * @param y height
|
||||||
|
// */
|
||||||
|
// public Rect(double x, double y) {
|
||||||
|
// this(0, 0, x, y);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * New rect as a copy of other rect
|
||||||
|
// *
|
||||||
|
// * @param r other rect
|
||||||
|
// */
|
||||||
|
// public Rect(Rect r) {
|
||||||
|
// this(r.min.copy(), r.max.copy());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get offset copy (add)
|
||||||
|
// *
|
||||||
|
// * @param move offset vector
|
||||||
|
// * @return offset copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public Rect move(VecMutable move)
|
||||||
|
// {
|
||||||
|
// return copy().add_ip(move);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Add X and Y to all coordinates in a copy
|
||||||
|
// *
|
||||||
|
// * @param x x to add
|
||||||
|
// * @param y y to add
|
||||||
|
// * @return copy changed
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public Rect move(double x, double y)
|
||||||
|
// {
|
||||||
|
// return move(new VecArith(x, y));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Offset in place (add)
|
||||||
|
// *
|
||||||
|
// * @param move offset vector
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public Rect add_ip(VecMutable move)
|
||||||
|
// {
|
||||||
|
// min.add_ip(move);
|
||||||
|
// max.add_ip(move);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Add X and Y to all coordinates in place
|
||||||
|
// *
|
||||||
|
// * @param x x to add
|
||||||
|
// * @param y y to add
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect add_ip(double x, double y)
|
||||||
|
// {
|
||||||
|
// return add_ip(new VecArith(x, y));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get a copy
|
||||||
|
// *
|
||||||
|
// * @return copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public Rect copy()
|
||||||
|
// {
|
||||||
|
// return new Rect(this);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get rect center
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecValue getCenter()
|
||||||
|
// {
|
||||||
|
// return min.midTo(max).copy();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get center of the lower edge.
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecValue getCenterVMin()
|
||||||
|
// {
|
||||||
|
// return new VecArith((max.x() + min.x()) / 2D, min.y()).copy();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get center of the left edge.
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecValue getCenterHMin()
|
||||||
|
// {
|
||||||
|
// return new VecArith(min.x(), (max.y() + min.y()) / 2D).copy();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get center of the right edge.
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecValue getCenterHMax()
|
||||||
|
// {
|
||||||
|
// return new VecArith(max.x(), (max.y() + min.y()) / 2D).copy();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get center of the top edge.
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecValue getCenterVMax()
|
||||||
|
// {
|
||||||
|
// return new VecArith((max.x() + min.x()) / 2D, max.y()).copy();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get left bottom
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecArith getHMinVMin()
|
||||||
|
// {
|
||||||
|
// return min.view();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get left top
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecValue getHMinVMax()
|
||||||
|
// {
|
||||||
|
// return HMinVMax;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get right bottom
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecValue getHMaxVMin()
|
||||||
|
// {
|
||||||
|
// return HMaxVMin;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get right top
|
||||||
|
// *
|
||||||
|
// * @return center
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecArith getHMaxVMax()
|
||||||
|
// {
|
||||||
|
// return max.view();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Alias for getX2Y2
|
||||||
|
// *
|
||||||
|
// * @return highest coordinates xy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecMutable getMax()
|
||||||
|
// {
|
||||||
|
// return getHMaxVMax();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Alias for getX1Y1
|
||||||
|
// *
|
||||||
|
// * @return lowest coordinates xy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public VecMutable getMin()
|
||||||
|
// {
|
||||||
|
// return getHMinVMin();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Alias for getX1Y1
|
||||||
|
// *
|
||||||
|
// * @return lowest coordinates xy
|
||||||
|
// */
|
||||||
|
// public VecValue getOrigin()
|
||||||
|
// {
|
||||||
|
// return getHMinVMin();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Shrink to sides in copy
|
||||||
|
// *
|
||||||
|
// * @param shrink shrink size (added to each side)
|
||||||
|
// * @return shrinkn copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect shrink(VecValue shrink)
|
||||||
|
// {
|
||||||
|
// return copy().shrink_ip(shrink);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Shrink to sides in copy
|
||||||
|
// *
|
||||||
|
// * @param x x to add
|
||||||
|
// * @param y y to add
|
||||||
|
// * @return changed copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect shrink(double x, double y)
|
||||||
|
// {
|
||||||
|
// return copy().shrink_ip(x, y);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Shrink to sides in place
|
||||||
|
// *
|
||||||
|
// * @param shrink shrink size (added to each side)
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect shrink_ip(VecValue shrink)
|
||||||
|
// {
|
||||||
|
// shrink_ip(shrink.x(), shrink.y());
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Shrink to sides in place
|
||||||
|
// *
|
||||||
|
// * @param x horizontal shrink
|
||||||
|
// * @param y vertical shrink
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect shrink_ip(double x, double y)
|
||||||
|
// {
|
||||||
|
// min.sub_ip(x, y);
|
||||||
|
// max.add_ip(-x, -y);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Shrink the rect
|
||||||
|
// *
|
||||||
|
// * @param xmin shrink
|
||||||
|
// * @param ymin shrink
|
||||||
|
// * @param xmax shrink
|
||||||
|
// * @param ymax shrink
|
||||||
|
// * @return changed copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public Rect shrink(double xmin, double ymin, double xmax, double ymax)
|
||||||
|
// {
|
||||||
|
// return copy().shrink_ip(xmin, ymin, xmax, ymax);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Shrink the rect in place
|
||||||
|
// *
|
||||||
|
// * @param xmin shrink
|
||||||
|
// * @param ymin shrink
|
||||||
|
// * @param xmax shrink
|
||||||
|
// * @param ymax shrink
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public Rect shrink_ip(double xmin, double ymin, double xmax, double ymax)
|
||||||
|
// {
|
||||||
|
// min.add_ip(xmin, ymin);
|
||||||
|
// max.add_ip(-xmax, -ymax);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Grow to sides in copy
|
||||||
|
// *
|
||||||
|
// * @param grow grow size (added to each side)
|
||||||
|
// * @return grown copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect grow(VecValue grow)
|
||||||
|
// {
|
||||||
|
// return copy().grow_ip(grow);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Grow to sides in copy
|
||||||
|
// *
|
||||||
|
// * @param x horizontal grow
|
||||||
|
// * @param y vertical grow
|
||||||
|
// * @return changed copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect grow(double x, double y)
|
||||||
|
// {
|
||||||
|
// return copy().grow_ip(x, y);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Grow to sides in place
|
||||||
|
// *
|
||||||
|
// * @param grow grow size (added to each side)
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect grow_ip(VecValue grow)
|
||||||
|
// {
|
||||||
|
// grow_ip(grow.x(), grow.y());
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Grow to sides in place
|
||||||
|
// *
|
||||||
|
// * @param x horizontal grow
|
||||||
|
// * @param y vertical grow
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect grow_ip(double x, double y)
|
||||||
|
// {
|
||||||
|
// min.sub_ip(x, y);
|
||||||
|
// max.add_ip(x, y);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Grow the rect
|
||||||
|
// *
|
||||||
|
// * @param xmin growth
|
||||||
|
// * @param ymin growth
|
||||||
|
// * @param xmax growth
|
||||||
|
// * @param ymax growth
|
||||||
|
// * @return changed copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public Rect grow(double xmin, double ymin, double xmax, double ymax)
|
||||||
|
// {
|
||||||
|
// return copy().grow_ip(xmin, ymin, xmax, ymax);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Grow the rect in place
|
||||||
|
// *
|
||||||
|
// * @param xmin growth
|
||||||
|
// * @param ymin growth
|
||||||
|
// * @param xmax growth
|
||||||
|
// * @param ymax growth
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public Rect grow_ip(double xmin, double ymin, double xmax, double ymax)
|
||||||
|
// {
|
||||||
|
// min.add_ip(-xmin, -ymin);
|
||||||
|
// max.add_ip(xmax, ymax);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Check if point is inside this rectangle
|
||||||
|
// *
|
||||||
|
// * @param point point to test
|
||||||
|
// * @return is inside
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public boolean isInside(VecValue point)
|
||||||
|
// {
|
||||||
|
// return Calc.inRange(point.x(), min.x(), max.x()) && Calc.inRange(point.y(), min.y(), max.y());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Multiply in copy
|
||||||
|
// *
|
||||||
|
// * @param factor multiplier
|
||||||
|
// * @return offset copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect mul(double factor)
|
||||||
|
// {
|
||||||
|
// return copy().mul_ip(factor);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Multiply by number (useful for centered rects)
|
||||||
|
// *
|
||||||
|
// * @param x x multiplier
|
||||||
|
// * @param y y multiplier
|
||||||
|
// * @return copy multiplied
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect mul(double x, double y)
|
||||||
|
// {
|
||||||
|
// return copy().mul_ip(x, y);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Multiply coord in place
|
||||||
|
// *
|
||||||
|
// * @param factor multiplier
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect mul_ip(double factor)
|
||||||
|
// {
|
||||||
|
// min.mul_ip(factor);
|
||||||
|
// max.mul_ip(factor);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Multiply coord in place
|
||||||
|
// *
|
||||||
|
// * @param x multiplier x
|
||||||
|
// * @param y multiplier y
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect mul_ip(double x, double y)
|
||||||
|
// {
|
||||||
|
// min.mul_ip(x, y, 1);
|
||||||
|
// max.mul_ip(x, y, 1);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Round coords in copy
|
||||||
|
// *
|
||||||
|
// * @return copy, rounded
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public Rect round()
|
||||||
|
// {
|
||||||
|
// return new Rect(min.round(), max.round());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Round this in place
|
||||||
|
// *
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect round_ip()
|
||||||
|
// {
|
||||||
|
// min.round_ip();
|
||||||
|
// max.round_ip();
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Set to coordinates
|
||||||
|
// *
|
||||||
|
// * @param xmin lower x
|
||||||
|
// * @param ymin lower y
|
||||||
|
// * @param xmax upper x
|
||||||
|
// * @param ymax upper y
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public void setTo(double xmin, double ymin, double xmax, double ymax)
|
||||||
|
// {
|
||||||
|
// min.setTo(Math.min(xmin, xmax), Math.min(ymin, ymax));
|
||||||
|
// max.setTo(Math.max(xmin, xmax), Math.max(ymin, ymax));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Set to other rect's coordinates
|
||||||
|
// *
|
||||||
|
// * @param r other rect
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public void setTo(Rect r)
|
||||||
|
// {
|
||||||
|
// min.setTo(r.min);
|
||||||
|
// max.setTo(r.max);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Subtract X and Y from all coordinates in a copy
|
||||||
|
// *
|
||||||
|
// * @param x x to subtract
|
||||||
|
// * @param y y to subtract
|
||||||
|
// * @return copy changed
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect sub(double x, double y)
|
||||||
|
// {
|
||||||
|
// return sub(new VecArith(x, y));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get offset copy (subtract)
|
||||||
|
// *
|
||||||
|
// * @param move offset vector
|
||||||
|
// * @return offset copy
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public IRect sub(VecMutable move)
|
||||||
|
// {
|
||||||
|
// return copy().sub_ip(move);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Subtract X and Y from all coordinates in place
|
||||||
|
// *
|
||||||
|
// * @param x x to subtract
|
||||||
|
// * @param y y to subtract
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect sub_ip(double x, double y)
|
||||||
|
// {
|
||||||
|
// return sub_ip(new VecArith(x, y));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Offset in place (subtract)
|
||||||
|
// *
|
||||||
|
// * @param move offset vector
|
||||||
|
// * @return this
|
||||||
|
// */
|
||||||
|
// public IRect sub_ip(VecMutable move)
|
||||||
|
// {
|
||||||
|
// min.sub_ip(move);
|
||||||
|
// max.sub_ip(move);
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public String toString()
|
||||||
|
// {
|
||||||
|
// return String.format("[%s-%s]", min.toString(), max.toString());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * @return lower x
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public double xMin()
|
||||||
|
// {
|
||||||
|
// return min.x();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * @return upper x
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public double xMax()
|
||||||
|
// {
|
||||||
|
// return max.x();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * @return lower y
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public double yMin()
|
||||||
|
// {
|
||||||
|
// return min.y();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * @return upper y
|
||||||
|
// */
|
||||||
|
// @Override
|
||||||
|
// public double yMax()
|
||||||
|
// {
|
||||||
|
// return max.y();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double getHeight()
|
||||||
|
// {
|
||||||
|
// return max.y() - min.y();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public double getWidth()
|
||||||
|
// {
|
||||||
|
// return max.x() - min.x();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get size (width, height) as (x,y)
|
||||||
|
// *
|
||||||
|
// * @return coord of width,height
|
||||||
|
// */
|
||||||
|
// public VecValue getSize()
|
||||||
|
// {
|
||||||
|
// return new VecArith(max.x() - min.x(), max.y() - min.y());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public Rect getRect()
|
||||||
|
// {
|
||||||
|
// return this;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Generate zero rect
|
||||||
|
// *
|
||||||
|
// * @return zero
|
||||||
|
// */
|
||||||
|
// public static IRect zero()
|
||||||
|
// {
|
||||||
|
// return ZERO.copy();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Generate 0,0-1,1 rect
|
||||||
|
// *
|
||||||
|
// * @return one
|
||||||
|
// */
|
||||||
|
// public static IRect one()
|
||||||
|
// {
|
||||||
|
// return ZERO.copy();
|
||||||
|
// }
|
||||||
|
//}
|
Loading…
Reference in new issue