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,13 +1,13 @@ |
|||||||
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 |
* @return the proxied coord |
||||||
*/ |
*/ |
||||||
protected abstract Vec getSource(); |
protected abstract Vect getSource(); |
||||||
|
|
||||||
|
|
||||||
@Override |
@Override |
||||||
public double x() |
public double x() |
@ -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