Now it will be clear what is VALUE, VIEW and MUTABLE.v5stable
parent
4221d5430a
commit
4816e0b539
@ -1,36 +0,0 @@ |
||||
package mightypork.utils.math.constraints; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
public class CReverseProxy extends VecView { |
||||
|
||||
private final VecConstraint constraint; |
||||
|
||||
|
||||
public CReverseProxy(VecConstraint wrapped) { |
||||
this.constraint = wrapped; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public double x() |
||||
{ |
||||
return constraint.getVec().x(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public double y() |
||||
{ |
||||
return constraint.getVec().y(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public double z() |
||||
{ |
||||
return constraint.getVec().z(); |
||||
} |
||||
} |
@ -1,19 +0,0 @@ |
||||
package mightypork.utils.math.constraints; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
public interface VecConstraint { |
||||
|
||||
VecView getVec(); |
||||
|
||||
|
||||
NumberConstraint xc(); |
||||
|
||||
|
||||
NumberConstraint yc(); |
||||
|
||||
|
||||
NumberConstraint zc(); |
||||
} |
@ -0,0 +1,18 @@ |
||||
package mightypork.utils.math.constraints; |
||||
|
||||
|
||||
import mightypork.utils.math.vect.VectVal; |
||||
|
||||
|
||||
/** |
||||
* Vector constraint. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public interface VectConstraint { |
||||
|
||||
/** |
||||
* @return the constraint vec |
||||
*/ |
||||
VectVal getVec(); |
||||
} |
@ -1,188 +0,0 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
import mightypork.utils.math.constraints.NumberConstraint; |
||||
|
||||
|
||||
public abstract class AbstractVec implements Vec { |
||||
|
||||
private AbstractVecProxy view; |
||||
private NumberConstraint constraintX; |
||||
private NumberConstraint constraintY; |
||||
private NumberConstraint constraintZ; |
||||
|
||||
|
||||
@Override |
||||
public VecView getVec() |
||||
{ |
||||
return view(); |
||||
} |
||||
|
||||
|
||||
@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 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 double size() |
||||
{ |
||||
final 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 VecView value() |
||||
{ |
||||
return new ConstVec(this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public double distTo(Vec point) |
||||
{ |
||||
final double dx = x() - point.x(); |
||||
final double dy = y() - point.y(); |
||||
final double dz = z() - point.z(); |
||||
|
||||
return Math.sqrt(dx * dx + dy * dy + dz * dz); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView midTo(Vec point) |
||||
{ |
||||
final double dx = (point.x() - x()) * 0.5; |
||||
final double dy = (point.y() - y()) * 0.5; |
||||
final double dz = (point.z() - z()) * 0.5; |
||||
|
||||
return VecView.make(dx, dy, dz); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView vecTo(Vec point) |
||||
{ |
||||
return VecView.make(point.x() - x(), point.y() - y(), point.z() - z()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView cross(Vec vec) |
||||
{ |
||||
//@formatter:off
|
||||
return VecView.make( |
||||
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 VecMutable mutable() |
||||
{ |
||||
return VecMutable.make(this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView view() |
||||
{ |
||||
if (view == null) view = new VecProxy(this); |
||||
|
||||
return view; |
||||
} |
||||
|
||||
} |
@ -1,58 +0,0 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
/** |
||||
* Coordinate with immutable numeric values. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
class ConstVec extends VecView { |
||||
|
||||
private final double x, y, z; |
||||
|
||||
|
||||
public ConstVec(Vec other) { |
||||
this(other.x(), other.y(), other.z()); |
||||
} |
||||
|
||||
|
||||
public ConstVec(double x, double y) { |
||||
this(x, y, 0); |
||||
} |
||||
|
||||
|
||||
public ConstVec(double x, double y, double z) { |
||||
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 VecView value() |
||||
{ |
||||
return this; // it's constant already
|
||||
} |
||||
|
||||
} |
@ -1,153 +0,0 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
public class Synths { |
||||
|
||||
private static abstract class HeteroSynth extends VecProxy { |
||||
|
||||
public HeteroSynth(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected abstract double processX(double x); |
||||
|
||||
|
||||
@Override |
||||
protected abstract double processY(double y); |
||||
|
||||
|
||||
@Override |
||||
protected abstract double processZ(double z); |
||||
} |
||||
|
||||
private static abstract class UniformSynth extends VecProxy { |
||||
|
||||
public UniformSynth(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processX(double x) |
||||
{ |
||||
return super.processX(x); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processY(double y) |
||||
{ |
||||
return super.processY(y); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processZ(double z) |
||||
{ |
||||
return super.processZ(z); |
||||
} |
||||
|
||||
|
||||
protected abstract double process(double a); |
||||
} |
||||
|
||||
public static class Round extends UniformSynth { |
||||
|
||||
public Round(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return Math.round(a); |
||||
} |
||||
} |
||||
|
||||
public static class Ceil extends UniformSynth { |
||||
|
||||
public Ceil(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return Math.ceil(a); |
||||
} |
||||
} |
||||
|
||||
public static class Floor extends UniformSynth { |
||||
|
||||
public Floor(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return Math.floor(a); |
||||
} |
||||
} |
||||
|
||||
public static class Neg extends UniformSynth { |
||||
|
||||
public Neg(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return -a; |
||||
} |
||||
} |
||||
|
||||
public static class Half extends UniformSynth { |
||||
|
||||
public Half(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return a / 2; |
||||
} |
||||
} |
||||
|
||||
public static class Norm extends HeteroSynth { |
||||
|
||||
public Norm(Vec observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processX(double x) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processY(double y) |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processZ(double z) |
||||
{ |
||||
return 0; |
||||
} |
||||
} |
||||
} |
@ -1,177 +0,0 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
import mightypork.gamecore.control.interf.DefaultImpl; |
||||
import mightypork.utils.math.constraints.NumberConstraint; |
||||
|
||||
|
||||
/** |
||||
* Read-only coordinate. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class VecView extends VecMath<VecView> { |
||||
|
||||
/** |
||||
* Get a zero (0,0,0) constant |
||||
* |
||||
* @return new constant vec |
||||
*/ |
||||
public static VecView zero() |
||||
{ |
||||
return ZERO.view(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Get a one (1,1,1) constant |
||||
* |
||||
* @return one constant |
||||
*/ |
||||
public static VecView one() |
||||
{ |
||||
return ONE.view(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a constant vector |
||||
* |
||||
* @param x X value |
||||
* @param y Y value |
||||
* @return new constant vec |
||||
*/ |
||||
public static VecView make(double x, double y) |
||||
{ |
||||
return new ConstVec(x, y); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a constant vector |
||||
* |
||||
* @param x X value |
||||
* @param y Y value |
||||
* @param z Z value |
||||
* @return new constant vector |
||||
*/ |
||||
public static VecView make(double x, double y, double z) |
||||
{ |
||||
return new ConstVec(x, y, z); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a view at number constraints, reflecting their future changes. |
||||
* |
||||
* @param x X value |
||||
* @param y Y value |
||||
* @return view at the values |
||||
*/ |
||||
public static VecView make(NumberConstraint x, NumberConstraint y) |
||||
{ |
||||
return new NumConstrVec(x, y); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a view at number constraints, reflecting their future changes. |
||||
* |
||||
* @param x X value |
||||
* @param y Y value |
||||
* @param z Z value |
||||
* @return view at the values |
||||
*/ |
||||
public static VecView make(NumberConstraint x, NumberConstraint y, NumberConstraint z) |
||||
{ |
||||
return new NumConstrVec(x, y, z); |
||||
} |
||||
|
||||
// synth views
|
||||
private VecView view_round; |
||||
private VecView view_floor; |
||||
private VecView view_ceil; |
||||
private VecView view_neg; |
||||
private VecView view_half; |
||||
|
||||
|
||||
@Override |
||||
public VecView result(double x, double y, double z) |
||||
{ |
||||
return new ConstVec(x, y, z); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
@Deprecated |
||||
public VecView view() |
||||
{ |
||||
return this; // already not mutable
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
public abstract double x(); |
||||
|
||||
|
||||
@Override |
||||
public abstract double y(); |
||||
|
||||
|
||||
@Override |
||||
@DefaultImpl |
||||
public double z() |
||||
{ |
||||
return 0; // implemented for ease with 2D anonymous subtypes
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView round() |
||||
{ |
||||
// lazy init
|
||||
if (view_round == null) view_round = new Synths.Round(this); |
||||
|
||||
return view_round; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView floor() |
||||
{ |
||||
// lazy init
|
||||
if (view_floor == null) view_floor = new Synths.Floor(this); |
||||
|
||||
return view_floor; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView ceil() |
||||
{ |
||||
// lazy init
|
||||
if (view_ceil == null) view_ceil = new Synths.Ceil(this); |
||||
|
||||
return view_ceil; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView half() |
||||
{ |
||||
// lazy init
|
||||
if (view_half == null) view_half = new Synths.Half(this); |
||||
|
||||
return view_half; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView neg() |
||||
{ |
||||
// lazy init
|
||||
if (view_neg == null) view_neg = new Synths.Neg(this); |
||||
|
||||
return view_neg; |
||||
} |
||||
} |
@ -1,47 +0,0 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
class ConstRect extends RectValue { |
||||
|
||||
private final VecView pos; |
||||
private final VecView size; |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param x |
||||
* @param y |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public ConstRect(double x, double y, double width, double height) { |
||||
pos = VecView.make(x, y); |
||||
size = VecView.make(Math.abs(width), Math.abs(height)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public ConstRect value() |
||||
{ |
||||
return this; // nothing can change.
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getOrigin() |
||||
{ |
||||
return pos; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getSize() |
||||
{ |
||||
return size; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,137 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
import mightypork.utils.math.vect.Vect; |
||||
import mightypork.utils.math.vect.VectVal; |
||||
import mightypork.utils.math.vect.VectView; |
||||
|
||||
|
||||
public class RectVal extends RectView { |
||||
|
||||
/** |
||||
* Create at 0,0 with zero size |
||||
* |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectVal zero() |
||||
{ |
||||
return make(0, 0, 0, 0); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 1,1 with zero size |
||||
* |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectVal one() |
||||
{ |
||||
return make(0, 0, 1, 1); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size |
||||
* |
||||
* @param width |
||||
* @param height |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectVal make(double width, double height) |
||||
{ |
||||
return make(0, 0, width, height); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param width |
||||
* @param height |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectVal make(Vect origin, double width, double height) |
||||
{ |
||||
return make(origin, VectVal.make(width, height)); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size. |
||||
* |
||||
* @param size |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectVal make(Vect size) |
||||
{ |
||||
return make(Vect.ZERO, size); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param x |
||||
* @param y |
||||
* @param width |
||||
* @param height |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectVal make(double x, double y, double width, double height) |
||||
{ |
||||
return new RectVal(x, y, width, height); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param size |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectVal make(Vect origin, Vect size) |
||||
{ |
||||
return make(origin.x(), origin.y(), size.x(), size.y()); |
||||
} |
||||
|
||||
private final VectVal pos; |
||||
private final VectVal size; |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param x |
||||
* @param y |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public RectVal(double x, double y, double width, double height) { |
||||
pos = VectVal.make(x, y); |
||||
size = VectVal.make(width, height); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectVal value() |
||||
{ |
||||
return this; // nothing can change.
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VectVal getOrigin() |
||||
{ |
||||
return pos; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VectVal getSize() |
||||
{ |
||||
return size; |
||||
} |
||||
|
||||
} |
@ -1,138 +0,0 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.Vec; |
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
/** |
||||
* Immutable rect |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class RectValue extends RectMath<RectValue> { |
||||
|
||||
/** |
||||
* Create at 0,0 with zero size |
||||
* |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectValue zero() |
||||
{ |
||||
return make(0, 0, 0, 0); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 1,1 with zero size |
||||
* |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectValue one() |
||||
{ |
||||
return make(0, 0, 1, 1); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size |
||||
* |
||||
* @param width |
||||
* @param height |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectValue make(double width, double height) |
||||
{ |
||||
return make(0, 0, width, height); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param width |
||||
* @param height |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectValue make(Vec origin, double width, double height) |
||||
{ |
||||
return make(origin, VecView.make(width, height)); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size. |
||||
* |
||||
* @param size |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectValue make(Vec size) |
||||
{ |
||||
return make(VecView.zero(), size); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param x |
||||
* @param y |
||||
* @param width |
||||
* @param height |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectValue make(double x, double y, double width, double height) |
||||
{ |
||||
return new ConstRect(x, y, width, height); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param size |
||||
* @return new mutable rect |
||||
*/ |
||||
public static RectValue make(Vec origin, Vec size) |
||||
{ |
||||
return make(origin.x(), origin.y(), size.x(), size.y()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectValue move(double x, double y) |
||||
{ |
||||
return RectValue.make(getOrigin().add(x, y), getSize()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectValue shrink(double left, double right, double top, double bottom) |
||||
{ |
||||
return RectValue.make(getOrigin().add(left, top), getSize().sub(left + right, top + bottom)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectValue grow(double left, double right, double top, double bottom) |
||||
{ |
||||
return RectValue.make(getOrigin().sub(left, top), getSize().add(left + right, top + bottom)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectValue round() |
||||
{ |
||||
return RectValue.make(getOrigin().round(), getSize().round()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectValue view() |
||||
{ |
||||
return this; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,50 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
|
||||
|
||||
/** |
||||
* Immutable rect |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class RectView extends RectMath<RectVal> { |
||||
|
||||
/** |
||||
* Get a proxy at given rect |
||||
* |
||||
* @param observed observed rect |
||||
* @return view |
||||
*/ |
||||
public static RectView make(Rect observed) { |
||||
return observed.view(); |
||||
} |
||||
|
||||
@Override |
||||
public RectVal move(double x, double y) |
||||
{ |
||||
return RectVal.make(getOrigin().add(x, y), getSize()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectVal shrink(double left, double right, double top, double bottom) |
||||
{ |
||||
return RectVal.make(getOrigin().add(left, top), getSize().sub(left + right, top + bottom)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectVal grow(double left, double right, double top, double bottom) |
||||
{ |
||||
return RectVal.make(getOrigin().sub(left, top), getSize().add(left + right, top + bottom)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectVal round() |
||||
{ |
||||
return RectVal.make(getOrigin().round(), getSize().round()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,219 @@ |
||||
package mightypork.utils.math.vect; |
||||
|
||||
|
||||
import mightypork.utils.math.constraints.NumberConstraint; |
||||
|
||||
|
||||
public abstract class AbstractVect implements Vect { |
||||
|
||||
private VectView proxy; |
||||
private NumberConstraint xc; |
||||
private NumberConstraint yc; |
||||
private NumberConstraint zc; |
||||
|
||||
|
||||
@Override |
||||
public final VectVal getVec() |
||||
{ |
||||
return value(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public abstract double x(); |
||||
|
||||
|
||||
@Override |
||||
public abstract double y(); |
||||
|
||||
|
||||
@Override |
||||
public abstract double z(); |
||||
|
||||
|
||||
@Override |
||||
public final int xi() |
||||
{ |
||||
return (int) Math.round(x()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final int yi() |
||||
{ |
||||
return (int) Math.round(y()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final int zi() |
||||
{ |
||||
return (int) Math.round(z()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final NumberConstraint xc() |
||||
{ |
||||
if (xc == null) xc = new NumberConstraint() { |
||||
|
||||
@Override |
||||
public double getValue() |
||||
{ |
||||
return x(); |
||||
} |
||||
}; |
||||
|
||||
return xc; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final NumberConstraint yc() |
||||
{ |
||||
if (yc == null) yc = new NumberConstraint() { |
||||
|
||||
@Override |
||||
public double getValue() |
||||
{ |
||||
return y(); |
||||
} |
||||
}; |
||||
|
||||
return yc; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final NumberConstraint zc() |
||||
{ |
||||
if (zc == null) zc = new NumberConstraint() { |
||||
|
||||
@Override |
||||
public double getValue() |
||||
{ |
||||
return z(); |
||||
} |
||||
}; |
||||
|
||||
return zc; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final double size() |
||||
{ |
||||
final double x = x(), y = y(), z = z(); |
||||
return Math.sqrt(x * x + y * y + z * z); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final boolean isZero() |
||||
{ |
||||
return x() == 0 && y() == 0 && z() == 0; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VectVal value() |
||||
{ |
||||
return new VectVal(this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final double distTo(Vect point) |
||||
{ |
||||
final double dx = x() - point.x(); |
||||
final double dy = y() - point.y(); |
||||
final double dz = z() - point.z(); |
||||
|
||||
return Math.sqrt(dx * dx + dy * dy + dz * dz); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final VectVal midTo(Vect point) |
||||
{ |
||||
final double dx = (point.x() - x()) * 0.5; |
||||
final double dy = (point.y() - y()) * 0.5; |
||||
final double dz = (point.z() - z()) * 0.5; |
||||
|
||||
return VectVal.make(dx, dy, dz); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final VectVal vecTo(Vect point) |
||||
{ |
||||
return VectVal.make(point.x() - x(), point.y() - y(), point.z() - z()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final VectVal cross(Vect vec) |
||||
{ |
||||
//@formatter:off
|
||||
return VectVal.make( |
||||
y() * vec.z() - z() * vec.y(), |
||||
z() * vec.x() - x() * vec.z(), |
||||
x() * vec.y() - y() * vec.x()); |
||||
//@formatter:on
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
public final double dot(Vect vec) |
||||
{ |
||||
return x() * vec.x() + y() * vec.y() + z() * vec.z(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VectMutable mutable() |
||||
{ |
||||
return VectMutable.make(this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VectView view() |
||||
{ |
||||
if (proxy == null) proxy = new VectProxy(this); |
||||
|
||||
return proxy; |
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public int hashCode() |
||||
{ |
||||
final 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 Vect)) return false; |
||||
final Vect other = (Vect) obj; |
||||
|
||||
return x() == other.x() && y() == other.y() && z() == other.z(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String toString() |
||||
{ |
||||
return String.format("(%.1f %.1f %.1f)", x(), y(), z()); |
||||
} |
||||
} |
@ -1,12 +1,12 @@ |
||||
package mightypork.utils.math.coord; |
||||
package mightypork.utils.math.vect; |
||||
|
||||
|
||||
public abstract class AbstractVecProxy extends VecView { |
||||
public abstract class VectAdapter extends VectView { |
||||
|
||||
/** |
||||
* @return the proxied coord |
||||
*/ |
||||
protected abstract Vec getSource(); |
||||
protected abstract Vect getSource(); |
||||
|
||||
|
||||
@Override |
@ -0,0 +1,106 @@ |
||||
package mightypork.utils.math.vect; |
||||
|
||||
|
||||
public class VectFilters { |
||||
|
||||
private static abstract class Uniform extends VectProxy { |
||||
|
||||
public Uniform(Vect observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processX(double x) |
||||
{ |
||||
return super.processX(x); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processY(double y) |
||||
{ |
||||
return super.processY(y); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double processZ(double z) |
||||
{ |
||||
return super.processZ(z); |
||||
} |
||||
|
||||
|
||||
protected abstract double process(double a); |
||||
} |
||||
|
||||
public static class Round extends Uniform { |
||||
|
||||
public Round(Vect observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return Math.round(a); |
||||
} |
||||
} |
||||
|
||||
public static class Ceil extends Uniform { |
||||
|
||||
public Ceil(Vect observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return Math.ceil(a); |
||||
} |
||||
} |
||||
|
||||
public static class Floor extends Uniform { |
||||
|
||||
public Floor(Vect observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return Math.floor(a); |
||||
} |
||||
} |
||||
|
||||
public static class Neg extends Uniform { |
||||
|
||||
public Neg(Vect observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return -a; |
||||
} |
||||
} |
||||
|
||||
public static class Half extends Uniform { |
||||
|
||||
public Half(Vect observed) { |
||||
super(observed); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected double process(double a) |
||||
{ |
||||
return a / 2D; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,97 @@ |
||||
package mightypork.utils.math.vect; |
||||
|
||||
|
||||
/** |
||||
* Coordinate with immutable numeric values.<br> |
||||
* This coordinate is guaranteed to never change, as opposed to view, which can |
||||
* be a proxy or a synthetic vector. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public final class VectVal extends VectView { |
||||
|
||||
/** |
||||
* Make a constant vector |
||||
* |
||||
* @param value source vector |
||||
* @return new constant vec |
||||
*/ |
||||
public static VectVal make(Vect value) |
||||
{ |
||||
return value.value(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a constant vector |
||||
* |
||||
* @param x X value |
||||
* @param y Y value |
||||
* @return new constant vec |
||||
*/ |
||||
public static VectVal make(double x, double y) |
||||
{ |
||||
return make(x, y, 0); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a constant vector |
||||
* |
||||
* @param x X value |
||||
* @param y Y value |
||||
* @param z Z value |
||||
* @return new constant vector |
||||
*/ |
||||
public static VectVal make(double x, double y, double z) |
||||
{ |
||||
return new VectVal(x, y, z); |
||||
} |
||||
|
||||
private final double x, y, z; |
||||
|
||||
|
||||
protected VectVal(Vect other) { |
||||
this(other.x(), other.y(), other.z()); |
||||
} |
||||
|
||||
|
||||
protected VectVal(double x, double y, double z) { |
||||
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; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @deprecated It's constant already. |
||||
*/ |
||||
@Override |
||||
@Deprecated |
||||
public VectVal value() |
||||
{ |
||||
return this; // it's constant already
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,79 @@ |
||||
package mightypork.utils.math.vect; |
||||
|
||||
|
||||
import mightypork.gamecore.control.interf.DefaultImpl; |
||||
import mightypork.utils.math.constraints.NumberConstraint; |
||||
|
||||
|
||||
/** |
||||
* Read-only coordinate. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class VectView extends VectMath<VectVal> { // returns constant value on edit
|
||||
|
||||
/** |
||||
* Make a proxy view at a vector. |
||||
* |
||||
* @param observed vector to observe |
||||
* @return view |
||||
*/ |
||||
public static VectView make(Vect observed) |
||||
{ |
||||
return observed.view(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a view at number constraints, reflecting their future changes. |
||||
* |
||||
* @param xc X value |
||||
* @param yc Y value |
||||
* @return view at the values |
||||
*/ |
||||
public static VectView make(NumberConstraint xc, NumberConstraint yc) |
||||
{ |
||||
return new NumConstrVect(xc, yc); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Make a view at number constraints, reflecting their future changes. |
||||
* |
||||
* @param xc X value |
||||
* @param yc Y value |
||||
* @param zc Z value |
||||
* @return view at the values |
||||
*/ |
||||
public static VectView make(NumberConstraint xc, NumberConstraint yc, NumberConstraint zc) |
||||
{ |
||||
return new NumConstrVect(xc, yc, zc); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VectVal result(double x, double y, double z) |
||||
{ |
||||
return VectVal.make(x, y, z); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @deprecated VecView is not mutable, making a proxy has no effect. |
||||
*/ |
||||
@Override |
||||
@Deprecated |
||||
public VectView view() |
||||
{ |
||||
return this; // already not mutable
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
@DefaultImpl |
||||
public double z() |
||||
{ |
||||
return 0; // implemented for ease with 2D anonymous subtypes
|
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue