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; |
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 |
* Read-only coordinate. |
||||||
* {@link MutableCoord} with the result. |
|
||||||
* |
* |
||||||
* @author MightyPork |
* @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 |
@Override |
||||||
public VecView result(double x, double y, double z) |
public VecView result(double x, double y, double z) |
||||||
{ |
{ |
||||||
return new FixedCoord(x, y, z); |
return new ConstVec(x, y, z); |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
@Override |
@Override |
||||||
|
@Deprecated |
||||||
public VecView view() |
public VecView view() |
||||||
{ |
{ |
||||||
return this; // already not mutable
|
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