parent
65bfbbd16a
commit
4221d5430a
@ -0,0 +1,25 @@ |
||||
package mightypork.utils.math.constraints; |
||||
|
||||
|
||||
/** |
||||
* Constant number {@link NumberConstraint} |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class FixedNumberConstraint implements NumberConstraint { |
||||
|
||||
private final double value; |
||||
|
||||
|
||||
public FixedNumberConstraint(double value) { |
||||
this.value = value; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public double getValue() |
||||
{ |
||||
return value; |
||||
} |
||||
|
||||
} |
@ -1,33 +0,0 @@ |
||||
package mightypork.utils.math.constraints; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
public abstract class VecConstraintSynth implements VecConstraint { |
||||
|
||||
@Override |
||||
public abstract VecView getVec(); |
||||
|
||||
|
||||
@Override |
||||
public NumberConstraint xc() |
||||
{ |
||||
return Constraints.cX(getVec()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public NumberConstraint yc() |
||||
{ |
||||
return Constraints.cY(getVec()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public NumberConstraint zc() |
||||
{ |
||||
return Constraints.cZ(getVec()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,188 @@ |
||||
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; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,68 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
public abstract class AbstractVecProxy extends VecView { |
||||
|
||||
/** |
||||
* @return the proxied coord |
||||
*/ |
||||
protected abstract Vec getSource(); |
||||
|
||||
|
||||
@Override |
||||
public double x() |
||||
{ |
||||
return processX(getSource().x()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public double y() |
||||
{ |
||||
return processY(getSource().y()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public double z() |
||||
{ |
||||
return processZ(getSource().z()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Process X before it's returned by x() |
||||
* |
||||
* @param x original X |
||||
* @return output X |
||||
*/ |
||||
protected double processX(double x) |
||||
{ |
||||
return x; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Process Y before it's returned by y() |
||||
* |
||||
* @param y original Y |
||||
* @return output Y |
||||
*/ |
||||
protected double processY(double y) |
||||
{ |
||||
return y; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Process Z before it's returned by z() |
||||
* |
||||
* @param z original Z |
||||
* @return output Z |
||||
*/ |
||||
protected double processZ(double z) |
||||
{ |
||||
return z; |
||||
} |
||||
|
||||
} |
@ -1,155 +0,0 @@ |
||||
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 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(Vec offset, double speed) |
||||
{ |
||||
animate(offset.x() - x(), offset.y() - y(), offset.z() - z(), speed); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
public AnimCoord animate(double x, double y, double z, double duration) |
||||
{ |
||||
this.x.animate(x, duration); |
||||
this.y.animate(y, duration); |
||||
this.z.animate(z, duration); |
||||
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) |
||||
{ |
||||
final double dist = distTo(target); |
||||
final 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
|
||||
} |
||||
|
||||
|
||||
public double getDuration() |
||||
{ |
||||
return x.getDuration(); // BUNO
|
||||
} |
||||
|
||||
|
||||
public double getElapsed() |
||||
{ |
||||
return x.getElapsed(); // BUNO
|
||||
} |
||||
|
||||
|
||||
public double getProgress() |
||||
{ |
||||
return x.getProgress(); // BUNO
|
||||
} |
||||
} |
@ -1,58 +0,0 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
/** |
||||
* <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,86 +0,0 @@ |
||||
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 { |
||||
|
||||
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,25 +0,0 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
/** |
||||
* 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; |
||||
} |
||||
} |
@ -1,23 +0,0 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
/** |
||||
* 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,153 @@ |
||||
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,398 +0,0 @@ |
||||
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 VecMathImpl<V> implements VecMath<V> { |
||||
|
||||
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(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getVec() |
||||
{ |
||||
return this.view(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* <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 VecMutable copy() |
||||
{ |
||||
return new MutableCoord(this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView 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() |
||||
{ |
||||
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 V abs() |
||||
{ |
||||
return result(Math.abs(x()), Math.abs(y()), Math.abs(z())); |
||||
} |
||||
|
||||
|
||||
@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() + x, y() + y, z() + z); |
||||
} |
||||
|
||||
|
||||
@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 V 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 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
|
||||
|
||||
final double k = size / size(); |
||||
|
||||
return mul(k); |
||||
} |
||||
|
||||
|
||||
@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 Vec)) return false; |
||||
final Vec other = (Vec) obj; |
||||
|
||||
return x() == other.x() && y() == other.y() && z() == other.z(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String toString() |
||||
{ |
||||
return String.format("(%.1f %.1f %.1f)", x(), y(), z()); |
||||
} |
||||
} |
@ -0,0 +1,192 @@ |
||||
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 VecMutableAnim extends VecMutable implements Pauseable, Updateable { |
||||
|
||||
private final AnimDouble x, y, z; |
||||
private double defaultDuration = 0; |
||||
|
||||
|
||||
VecMutableAnim(AnimDouble x, AnimDouble y, AnimDouble z) { |
||||
this.x = x; |
||||
this.y = y; |
||||
this.z = z; |
||||
} |
||||
|
||||
|
||||
VecMutableAnim(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(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* @return the default duration (seconds) |
||||
*/ |
||||
public double getDefaultDuration() |
||||
{ |
||||
return defaultDuration; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Set default animation duration (when changed without using animate()) |
||||
* |
||||
* @param defaultDuration default duration (seconds) |
||||
*/ |
||||
public void setDefaultDuration(double defaultDuration) |
||||
{ |
||||
this.defaultDuration = defaultDuration; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecMutableAnim result(double x, double y, double z) |
||||
{ |
||||
this.x.animate(x, defaultDuration); |
||||
this.y.animate(y, defaultDuration); |
||||
this.z.animate(z, defaultDuration); |
||||
|
||||
return this; |
||||
} |
||||
|
||||
|
||||
public VecMutableAnim add(Vec offset, double speed) |
||||
{ |
||||
animate(view().add(offset), speed); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
public VecMutableAnim animate(double x, double y, double z, double duration) |
||||
{ |
||||
this.x.animate(x, duration); |
||||
this.y.animate(y, duration); |
||||
this.z.animate(z, duration); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
public VecMutableAnim animate(Vec target, double duration) |
||||
{ |
||||
animate(target.x(), target.y(), target.z(), duration); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
@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(); // BÚNO
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* @return true if the animation is finished |
||||
*/ |
||||
public boolean isFinished() |
||||
{ |
||||
return x.isFinished(); // BÚNO
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* @return current animation duration |
||||
*/ |
||||
public double getDuration() |
||||
{ |
||||
return x.getDuration(); // BÚNO
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* @return elapsed time since the start of the animation |
||||
*/ |
||||
public double getElapsed() |
||||
{ |
||||
return x.getElapsed(); // BÚNO
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* @return animation progress (elapsed / duration) |
||||
*/ |
||||
public double getProgress() |
||||
{ |
||||
return x.getProgress(); // BÚNO
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* Set easing for all three coordinates |
||||
* |
||||
* @param easing |
||||
*/ |
||||
public void setEasing(Easing easing) |
||||
{ |
||||
x.setEasing(easing); |
||||
y.setEasing(easing); |
||||
z.setEasing(easing); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,32 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
/** |
||||
* View of another coordinate, immutable.<br> |
||||
* GetVec() |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
class VecProxy extends AbstractVecProxy { |
||||
|
||||
final Vec observed; |
||||
|
||||
|
||||
/** |
||||
* Protected, in order to enforce the use of view() method on Vec, which |
||||
* uses caching. |
||||
* |
||||
* @param observed |
||||
*/ |
||||
public VecProxy(Vec observed) { |
||||
this.observed = observed; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected Vec getSource() |
||||
{ |
||||
return observed; |
||||
} |
||||
|
||||
} |
@ -1,24 +1,177 @@ |
||||
package mightypork.utils.math.coord; |
||||
|
||||
|
||||
import mightypork.gamecore.control.interf.DefaultImpl; |
||||
import mightypork.utils.math.constraints.NumberConstraint; |
||||
|
||||
|
||||
/** |
||||
* Read-only coordinate, operations with it will yield a new |
||||
* {@link MutableCoord} with the result. |
||||
* Read-only coordinate. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class VecView extends VecMathImpl<VecView> { |
||||
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 FixedCoord(x, y, 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; |
||||
} |
||||
} |
||||
|
@ -0,0 +1,47 @@ |
||||
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; |
||||
} |
||||
|
||||
} |
@ -1,105 +0,0 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.FixedCoord; |
||||
import mightypork.utils.math.coord.Vec; |
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
public class FixedRect extends RectView { |
||||
|
||||
private final VecView pos; |
||||
private final VecView size; |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with zero size |
||||
*/ |
||||
public FixedRect() { |
||||
pos = Vec.ZERO; |
||||
size = Vec.ZERO; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size |
||||
* |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public FixedRect(double width, double height) { |
||||
this(0, 0, width, height); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public FixedRect(Vec origin, double width, double height) { |
||||
this(origin.x(), origin.y(), width, height); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size. |
||||
* |
||||
* @param size |
||||
*/ |
||||
public FixedRect(Vec size) { |
||||
this(0, 0, size.x(), size.y()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param size |
||||
*/ |
||||
public FixedRect(Vec origin, Vec size) { |
||||
this(origin.x(), origin.y(), size.x(), size.y()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param x |
||||
* @param y |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public FixedRect(double x, double y, double width, double height) { |
||||
pos = new FixedCoord(x, y); |
||||
size = new FixedCoord(Math.abs(width), Math.abs(height)); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create as copy of another |
||||
* |
||||
* @param other copied |
||||
*/ |
||||
public FixedRect(Rect other) { |
||||
this(other.getOrigin(), other.getSize()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getOrigin() |
||||
{ |
||||
return pos; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getSize() |
||||
{ |
||||
return size; |
||||
} |
||||
|
||||
} |
@ -1,233 +0,0 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.MutableCoord; |
||||
import mightypork.utils.math.coord.Vec; |
||||
import mightypork.utils.math.coord.VecMutable; |
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
public class MutableRect extends RectImpl<RectMutable> implements RectMutable { |
||||
|
||||
private final VecMutable pos = new MutableCoord(); |
||||
private final VecMutable size = new MutableCoord(); |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with zero size |
||||
*/ |
||||
public MutableRect() { |
||||
// keep default zeros
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size |
||||
* |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public MutableRect(double width, double height) { |
||||
this.pos.setTo(0, 0); |
||||
this.size.setTo(width, height).abs(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public MutableRect(Vec origin, double width, double height) { |
||||
this.pos.setTo(origin); |
||||
this.size.setTo(width, height).abs(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at 0,0 with given size. |
||||
* |
||||
* @param size |
||||
*/ |
||||
public MutableRect(Vec size) { |
||||
this(0, 0, size.x(), size.y()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param size |
||||
*/ |
||||
public MutableRect(Vec origin, Vec size) { |
||||
this.pos.setTo(origin); |
||||
this.size.setTo(size).abs(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param x |
||||
* @param y |
||||
* @param width |
||||
* @param height |
||||
*/ |
||||
public MutableRect(double x, double y, double width, double height) { |
||||
pos.setTo(x, y); |
||||
size.setTo(width, height).abs(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Create as copy of another |
||||
* |
||||
* @param other copied |
||||
*/ |
||||
public MutableRect(Rect other) { |
||||
this(other.getOrigin(), other.getSize()); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Set to other rect's coordinates |
||||
* |
||||
* @param rect other rect |
||||
*/ |
||||
@Override |
||||
public void setTo(Rect rect) |
||||
{ |
||||
setTo(rect.getOrigin(), rect.getSize()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void setTo(Vec origin, Vec size) |
||||
{ |
||||
this.pos.setTo(origin); |
||||
this.size.setTo(size).abs(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void setTo(Vec origin, double width, double height) |
||||
{ |
||||
this.pos.setTo(origin); |
||||
this.size.setTo(width, height).abs(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void setOrigin(Vec origin) |
||||
{ |
||||
this.pos.setTo(origin); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void setSize(Vec size) |
||||
{ |
||||
this.size.setTo(size).abs(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Add X and Y to origin |
||||
* |
||||
* @param x x to add |
||||
* @param y y to add |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutable move(double x, double y) |
||||
{ |
||||
pos.add(x, y); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Get a copy |
||||
* |
||||
* @return copy |
||||
*/ |
||||
@Override |
||||
public RectMutable copy() |
||||
{ |
||||
return new MutableRect(this); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Shrink the rect |
||||
* |
||||
* @param left shrink |
||||
* @param right shrink |
||||
* @param top shrink |
||||
* @param bottom shrink |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutable shrink(double left, double right, double top, double bottom) |
||||
{ |
||||
pos.add(left, top); |
||||
size.sub(left + right, top + bottom).abs(); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Grow the rect |
||||
* |
||||
* @param left growth |
||||
* @param right growth |
||||
* @param top growth |
||||
* @param bottom growth |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutable grow(double left, double right, double top, double bottom) |
||||
{ |
||||
pos.sub(left, top); |
||||
size.add(left + right, top + bottom).abs(); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Round coords |
||||
* |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutable round() |
||||
{ |
||||
pos.round(); |
||||
size.round(); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getOrigin() |
||||
{ |
||||
return pos.view(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getSize() |
||||
{ |
||||
return size.view(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectView view() |
||||
{ |
||||
return new FixedRect(this); |
||||
} |
||||
} |
@ -0,0 +1,120 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.Vec; |
||||
import mightypork.utils.math.coord.VecMutable; |
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
class RectMutableImpl extends RectMutable { |
||||
|
||||
final VecMutable pos = VecMutable.zero(); |
||||
final VecMutable size = VecMutable.zero(); |
||||
|
||||
|
||||
/** |
||||
* Create at given origin, with given size. |
||||
* |
||||
* @param origin |
||||
* @param size |
||||
*/ |
||||
public RectMutableImpl(Vec origin, Vec size) { |
||||
this.pos.setTo(origin); |
||||
this.size.setTo(size).abs(); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Add X and Y to origin |
||||
* |
||||
* @param x x to add |
||||
* @param y y to add |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutableImpl move(double x, double y) |
||||
{ |
||||
pos.add(x, y); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Shrink the rect |
||||
* |
||||
* @param left shrink |
||||
* @param right shrink |
||||
* @param top shrink |
||||
* @param bottom shrink |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutableImpl shrink(double left, double right, double top, double bottom) |
||||
{ |
||||
pos.add(left, top); |
||||
size.sub(left + right, top + bottom).abs(); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Grow the rect |
||||
* |
||||
* @param left growth |
||||
* @param right growth |
||||
* @param top growth |
||||
* @param bottom growth |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutableImpl grow(double left, double right, double top, double bottom) |
||||
{ |
||||
pos.sub(left, top); |
||||
size.add(left + right, top + bottom).abs(); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Round coords |
||||
* |
||||
* @return result |
||||
*/ |
||||
@Override |
||||
public RectMutableImpl round() |
||||
{ |
||||
pos.round(); |
||||
size.round(); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getOrigin() |
||||
{ |
||||
return pos.view(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public VecView getSize() |
||||
{ |
||||
return size.view(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectMutable setOrigin(Vec origin) |
||||
{ |
||||
this.pos.setTo(origin); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectMutable setSize(Vec size) |
||||
{ |
||||
this.size.setTo(size).abs(); |
||||
return this; |
||||
} |
||||
} |
@ -0,0 +1,138 @@ |
||||
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; |
||||
} |
||||
|
||||
} |
@ -1,69 +0,0 @@ |
||||
package mightypork.utils.math.rect; |
||||
|
||||
|
||||
import mightypork.utils.math.coord.VecView; |
||||
|
||||
|
||||
/** |
||||
* Immutable rect |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public abstract class RectView extends RectImpl<RectView> { |
||||
|
||||
protected RectView result(VecView origin, VecView size) |
||||
{ |
||||
return new FixedRect(origin, size); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectView move(double x, double y) |
||||
{ |
||||
return result(getOrigin().add(x, y), getSize()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectView shrink(double left, double right, double top, double bottom) |
||||
{ |
||||
return result(getOrigin().add(left, top), getSize().sub(left + right, top + bottom)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectView grow(double left, double right, double top, double bottom) |
||||
{ |
||||
return result(getOrigin().sub(left, top), getSize().add(left + right, top + bottom)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectView round() |
||||
{ |
||||
return result(getOrigin().round(), getSize().round()); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public MutableRect copy() |
||||
{ |
||||
return new MutableRect(this); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public RectView view() |
||||
{ |
||||
return this; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public abstract VecView getOrigin(); |
||||
|
||||
|
||||
@Override |
||||
public abstract VecView getSize(); |
||||
|
||||
} |
Loading…
Reference in new issue