parent
91f54133b3
commit
a5c32834c0
@ -0,0 +1,32 @@ |
|||||||
|
package mightypork.gamecore.gui.components; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.control.AppAccess; |
||||||
|
import mightypork.gamecore.control.AppSubModule; |
||||||
|
import mightypork.gamecore.control.bus.BusAccess; |
||||||
|
import mightypork.gamecore.control.bus.clients.BusNode; |
||||||
|
import mightypork.utils.math.constraints.RectBound; |
||||||
|
import mightypork.utils.math.rect.RectView; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class AbstractComponent extends AppSubModule implements PluggableRenderable { |
||||||
|
|
||||||
|
private RectBound context; |
||||||
|
|
||||||
|
public AbstractComponent(AppAccess app) { |
||||||
|
super(app); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setContext(RectBound context) |
||||||
|
{ |
||||||
|
this.context = context; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public RectView getRect() |
||||||
|
{ |
||||||
|
return context.getRect(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package mightypork.test; |
||||||
|
|
||||||
|
|
||||||
|
import java.util.Locale; |
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumBound; |
||||||
|
import mightypork.utils.math.num.Num; |
||||||
|
import mightypork.utils.math.num.NumView; |
||||||
|
import mightypork.utils.math.vect.VectMutable; |
||||||
|
import mightypork.utils.math.vect.VectView; |
||||||
|
|
||||||
|
|
||||||
|
public class TestCoords { |
||||||
|
|
||||||
|
public static void main(String[] args) |
||||||
|
{ |
||||||
|
Locale.setDefault(Locale.ENGLISH); |
||||||
|
|
||||||
|
// test
|
||||||
|
VectMutable var = VectMutable.make(1, 2, 3); |
||||||
|
|
||||||
|
VectView cubicRoot = var.view().mul(var).mul(var); |
||||||
|
VectView half = var.view().half(); |
||||||
|
|
||||||
|
System.out.println("x, x^3, x/5"); |
||||||
|
System.out.println(var); |
||||||
|
System.out.println(cubicRoot); |
||||||
|
System.out.println(half); |
||||||
|
|
||||||
|
var.mul(10); |
||||||
|
|
||||||
|
System.out.println("x = x*10; x, x^3, x/5"); |
||||||
|
System.out.println(var); |
||||||
|
System.out.println(cubicRoot); |
||||||
|
System.out.println(half); |
||||||
|
|
||||||
|
NumView y = var.view().yn(); |
||||||
|
System.out.println("y: "+y.value()); |
||||||
|
|
||||||
|
var.add(100,100); |
||||||
|
|
||||||
|
System.out.println("x = x*100; x.y(), x, x^3, x/5"); |
||||||
|
System.out.println(y.value()); |
||||||
|
System.out.println(var); |
||||||
|
System.out.println(cubicRoot); |
||||||
|
System.out.println(half); |
||||||
|
|
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -1,20 +1,20 @@ |
|||||||
package mightypork.utils.math.constraints; |
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
import mightypork.utils.math.num.Num; |
||||||
|
import mightypork.utils.math.num.NumVal; |
||||||
|
import mightypork.utils.math.num.NumView; |
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* Numeric constraint |
* Numeric constraint |
||||||
* |
* |
||||||
* @author MightyPork |
* @author MightyPork |
||||||
*/ |
*/ |
||||||
public interface NumBound { |
public interface NumBound { |
||||||
|
|
||||||
public static final NumBound ZERO = new NumberConst(0); |
|
||||||
public static final NumBound ONE = new NumberConst(1); |
|
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* @return current value |
* @return current value |
||||||
*/ |
*/ |
||||||
double getValue(); |
Num getNum(); |
||||||
|
|
||||||
} |
} |
||||||
|
@ -1,25 +0,0 @@ |
|||||||
package mightypork.utils.math.constraints; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Constant number {@link NumBound} |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
*/ |
|
||||||
public class NumberConst implements NumBound { |
|
||||||
|
|
||||||
private final double value; |
|
||||||
|
|
||||||
|
|
||||||
public NumberConst(double value) { |
|
||||||
this.value = value; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public double getValue() |
|
||||||
{ |
|
||||||
return value; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,23 +1,16 @@ |
|||||||
package mightypork.utils.math.constraints; |
package mightypork.utils.math.constraints; |
||||||
|
|
||||||
|
|
||||||
import mightypork.utils.math.rect.RectView; |
|
||||||
|
|
||||||
|
|
||||||
/** |
/** |
||||||
* Interface for constraints that can be assigned context |
* Interface for constraints that can be assigned context |
||||||
* |
* |
||||||
* @author MightyPork |
* @author MightyPork |
||||||
*/ |
*/ |
||||||
public interface PluggableRect extends RectBound { |
public interface PluggableRectBound extends RectBound { |
||||||
|
|
||||||
/** |
/** |
||||||
* @param rect context to set |
* @param rect context to set |
||||||
*/ |
*/ |
||||||
abstract void setContext(RectBound rect); |
abstract void setContext(RectBound rect); |
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
abstract RectView getRect(); |
|
||||||
|
|
||||||
} |
} |
@ -1,19 +1,41 @@ |
|||||||
package mightypork.utils.math.constraints.builder; |
//package mightypork.utils.math.constraints.builder;
|
||||||
|
//
|
||||||
|
//
|
||||||
import mightypork.utils.math.constraints.RectBound; |
//import mightypork.utils.math.constraints.ConstraintFactory;
|
||||||
|
//import mightypork.utils.math.constraints.RectBound;
|
||||||
|
//import mightypork.utils.math.constraints.VectBound;
|
||||||
public class Bounds { |
//import mightypork.utils.math.rect.Rect;
|
||||||
|
//import mightypork.utils.math.vect.Vect;
|
||||||
public static class RectBB { |
//
|
||||||
|
//
|
||||||
private final RectBound parent; |
//public class Bounds {
|
||||||
|
//
|
||||||
|
// public RectBB box(Object side) {
|
||||||
public RectBB(RectBound parent) { |
// return wrap(ConstraintFactory.box(side));
|
||||||
this.parent = parent; |
// }
|
||||||
} |
// public RectBB box(VectBound origin, Object width, Object height){
|
||||||
|
// return wrap(ConstraintFactory.box(origin, width, height));
|
||||||
} |
// }
|
||||||
} |
//
|
||||||
|
// public RectBB box(Object width, Object height){
|
||||||
|
// return wrap(ConstraintFactory.box(width, height));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public RectBB box(Object x, Object y, Object width, Object height){
|
||||||
|
// return wrap(ConstraintFactory.box(Rect.ZERO, x,y,width,height));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public RectBB wrap(RectBound rb) {
|
||||||
|
// return new RectBB(rb);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public static class RectBB {
|
||||||
|
//
|
||||||
|
// private final RectBound parent;
|
||||||
|
//
|
||||||
|
// public RectBB(RectBound parent) {
|
||||||
|
// this.parent = parent;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
@ -0,0 +1,23 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class AbstractNum implements Num { |
||||||
|
|
||||||
|
@Override |
||||||
|
public Num getNum() { |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView view() |
||||||
|
{ |
||||||
|
return new NumProxy(this); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal copy() |
||||||
|
{ |
||||||
|
return new NumVal(this); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumBound; |
||||||
|
|
||||||
|
|
||||||
|
public interface Num extends NumBound { |
||||||
|
|
||||||
|
Num ZERO = NumVal.make(0); |
||||||
|
Num ONE = NumVal.make(1); |
||||||
|
|
||||||
|
|
||||||
|
double value(); |
||||||
|
|
||||||
|
|
||||||
|
NumView view(); |
||||||
|
|
||||||
|
|
||||||
|
NumVal copy(); |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class NumAdapter extends NumView { |
||||||
|
|
||||||
|
protected abstract Num getSource(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return getSource().value(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,157 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Math operations for numbers |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
* @param <N> functions return type |
||||||
|
*/ |
||||||
|
interface NumMath<N extends NumMath<N>> extends Num { |
||||||
|
|
||||||
|
double CMP_EPSILON = 0.0000001; |
||||||
|
|
||||||
|
|
||||||
|
N add(Num addend); |
||||||
|
|
||||||
|
|
||||||
|
N sub(Num subtrahend); |
||||||
|
|
||||||
|
|
||||||
|
N mul(Num factor); |
||||||
|
|
||||||
|
|
||||||
|
N div(Num factor); |
||||||
|
|
||||||
|
|
||||||
|
N perc(Num percent); |
||||||
|
|
||||||
|
|
||||||
|
N max(Num other); |
||||||
|
|
||||||
|
|
||||||
|
N min(Num other); |
||||||
|
|
||||||
|
|
||||||
|
N pow(Num other); |
||||||
|
|
||||||
|
|
||||||
|
N average(Num other); |
||||||
|
|
||||||
|
|
||||||
|
N add(double addend); |
||||||
|
|
||||||
|
|
||||||
|
N sub(double subtrahend); |
||||||
|
|
||||||
|
|
||||||
|
N mul(double factor); |
||||||
|
|
||||||
|
|
||||||
|
N div(double factor); |
||||||
|
|
||||||
|
|
||||||
|
N perc(double percent); |
||||||
|
|
||||||
|
|
||||||
|
N neg(); |
||||||
|
|
||||||
|
|
||||||
|
N abs(); |
||||||
|
|
||||||
|
|
||||||
|
N max(double other); |
||||||
|
|
||||||
|
|
||||||
|
N min(double other); |
||||||
|
|
||||||
|
|
||||||
|
N pow(double other); |
||||||
|
|
||||||
|
|
||||||
|
N square(); |
||||||
|
|
||||||
|
|
||||||
|
N cube(); |
||||||
|
|
||||||
|
|
||||||
|
N sqrt(); |
||||||
|
|
||||||
|
|
||||||
|
N cbrt(); |
||||||
|
|
||||||
|
|
||||||
|
N sin(); |
||||||
|
|
||||||
|
|
||||||
|
N cos(); |
||||||
|
|
||||||
|
|
||||||
|
N tan(); |
||||||
|
|
||||||
|
|
||||||
|
N asin(); |
||||||
|
|
||||||
|
|
||||||
|
N acos(); |
||||||
|
|
||||||
|
|
||||||
|
N atan(); |
||||||
|
|
||||||
|
|
||||||
|
N round(); |
||||||
|
|
||||||
|
|
||||||
|
N floor(); |
||||||
|
|
||||||
|
|
||||||
|
N ceil(); |
||||||
|
|
||||||
|
|
||||||
|
N signum(); |
||||||
|
|
||||||
|
|
||||||
|
N half(); |
||||||
|
|
||||||
|
|
||||||
|
N average(double other); |
||||||
|
|
||||||
|
|
||||||
|
boolean lt(Num other); |
||||||
|
|
||||||
|
|
||||||
|
boolean lte(Num other); |
||||||
|
|
||||||
|
|
||||||
|
boolean gt(Num other); |
||||||
|
|
||||||
|
|
||||||
|
boolean gte(Num other); |
||||||
|
|
||||||
|
|
||||||
|
boolean eq(Num other); |
||||||
|
|
||||||
|
|
||||||
|
boolean lt(double other); |
||||||
|
|
||||||
|
|
||||||
|
boolean lte(double other); |
||||||
|
|
||||||
|
|
||||||
|
boolean gt(double other); |
||||||
|
|
||||||
|
|
||||||
|
boolean gte(double other); |
||||||
|
|
||||||
|
|
||||||
|
boolean eq(double other); |
||||||
|
|
||||||
|
|
||||||
|
boolean isNegative(); |
||||||
|
|
||||||
|
|
||||||
|
boolean isPositive(); |
||||||
|
|
||||||
|
|
||||||
|
boolean isZero(); |
||||||
|
} |
@ -0,0 +1,151 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumBound; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class NumMathBase<N extends NumMath<N>> extends AbstractNum implements NumMath<N> { |
||||||
|
|
||||||
|
/** |
||||||
|
* Convert to double, turning null into zero. |
||||||
|
* |
||||||
|
* @param a num |
||||||
|
* @return double |
||||||
|
*/ |
||||||
|
protected static double eval(final NumBound a) |
||||||
|
{ |
||||||
|
return toNum(a).value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Convert {@link NumBound} to {@link Num}, turning null to Num.ZERO. |
||||||
|
* @param a numeric bound |
||||||
|
* @return num |
||||||
|
*/ |
||||||
|
protected static Num toNum(final NumBound a) |
||||||
|
{ |
||||||
|
return (a == null) ? Num.ZERO : (a.getNum() == null ? Num.ZERO : a.getNum()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public Num getNum() |
||||||
|
{ |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean lt(double other) |
||||||
|
{ |
||||||
|
return !gte(other); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean lt(final Num other) |
||||||
|
{ |
||||||
|
return !gte(other); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean lte(double other) |
||||||
|
{ |
||||||
|
return !gt(other); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean lte(final Num other) |
||||||
|
{ |
||||||
|
return !gt(other); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean gt(double other) |
||||||
|
{ |
||||||
|
return Math.signum(value() - other) >= 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean gt(final Num other) |
||||||
|
{ |
||||||
|
return gt(eval(other)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean gte(double other) |
||||||
|
{ |
||||||
|
return Math.signum(value() - other) >= 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean gte(final Num other) |
||||||
|
{ |
||||||
|
return gte(eval(other)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean eq(double other) |
||||||
|
{ |
||||||
|
return Math.abs(value() - other) <= CMP_EPSILON; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean eq(final Num a) |
||||||
|
{ |
||||||
|
return eq(eval(a)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isNegative() |
||||||
|
{ |
||||||
|
return Math.signum(value()) < 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPositive() |
||||||
|
{ |
||||||
|
return Math.signum(value()) > 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isZero() |
||||||
|
{ |
||||||
|
return Math.abs(value()) <= CMP_EPSILON; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() |
||||||
|
{ |
||||||
|
final int prime = 31; |
||||||
|
int result = 1; |
||||||
|
long temp; |
||||||
|
temp = Double.doubleToLongBits(value()); |
||||||
|
result = prime * result + (int) (temp ^ (temp >>> 32)); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object obj) |
||||||
|
{ |
||||||
|
if (this == obj) return true; |
||||||
|
if (obj == null) return false; |
||||||
|
if (!(obj instanceof NumMathBase)) return false; |
||||||
|
NumMathBase<?> other = (NumMathBase<?>) obj; |
||||||
|
|
||||||
|
return eq(other); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,558 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class NumMathDynamic extends NumMathBase<NumView>{ |
||||||
|
|
||||||
|
private NumView ceil; |
||||||
|
private NumView floor; |
||||||
|
private NumView sgn; |
||||||
|
private NumView round; |
||||||
|
private NumView atan; |
||||||
|
private NumView acos; |
||||||
|
private NumView asin; |
||||||
|
private NumView tan; |
||||||
|
private NumView cos; |
||||||
|
private NumView sin; |
||||||
|
private NumView cbrt; |
||||||
|
private NumView sqrt; |
||||||
|
private NumView cube; |
||||||
|
private NumView square; |
||||||
|
private NumView neg; |
||||||
|
private NumView abs; |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView add(final double addend) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
private Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.value() + addend; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView sub(final double subtrahend) |
||||||
|
{ |
||||||
|
return add(-subtrahend); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView mul(final double factor) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
private Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.value() + factor; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView div(final double factor) |
||||||
|
{ |
||||||
|
return mul(1/factor); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView perc(final double percent) |
||||||
|
{ |
||||||
|
return mul(percent/100); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView neg() |
||||||
|
{ |
||||||
|
if(neg==null) neg = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return -1*t.value(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return neg; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView abs() |
||||||
|
{ |
||||||
|
if(abs==null) abs = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.abs(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return abs; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView max(final double other) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.max(t.value(), other); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView min(final double other) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.min(t.value(), other); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView pow(final double other) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.pow(t.value(), other); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView square() |
||||||
|
{ |
||||||
|
if(square==null) square = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
final double v = t.value(); |
||||||
|
return v*v; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return square; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView cube() |
||||||
|
{ |
||||||
|
if(cube==null) cube = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
final double v = t.value(); |
||||||
|
return v*v*v; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return cube; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView sqrt() |
||||||
|
{ |
||||||
|
if(sqrt==null) sqrt = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.sqrt(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return sqrt; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView cbrt() |
||||||
|
{ |
||||||
|
if(cbrt==null) cbrt = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.cbrt(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return cbrt; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView sin() |
||||||
|
{ |
||||||
|
if(sin==null) sin = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.sin(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return sin; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView cos() |
||||||
|
{ |
||||||
|
if(cos==null) cos = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.cos(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return cos; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView tan() |
||||||
|
{ |
||||||
|
if(tan==null) tan = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.tan(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return tan; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView asin() |
||||||
|
{ |
||||||
|
if(asin==null) asin = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.asin(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return asin; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView acos() |
||||||
|
{ |
||||||
|
if(acos==null) acos = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.acos(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return acos; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView atan() |
||||||
|
{ |
||||||
|
if(atan==null) atan = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.atan(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return atan; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView round() |
||||||
|
{ |
||||||
|
if(round==null) round = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.round(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return round; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView floor() |
||||||
|
{ |
||||||
|
if(floor==null) floor = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.floor(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return floor; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView ceil() |
||||||
|
{ |
||||||
|
if(ceil==null) ceil = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.round(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return ceil; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView signum() |
||||||
|
{ |
||||||
|
if(sgn==null) sgn = new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.signum(t.value()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return sgn; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView average(final double other) |
||||||
|
{ |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView half() |
||||||
|
{ |
||||||
|
return mul(0.5); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView add(final Num addend) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.value() + eval(addend); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView sub(final Num subtrahend) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.value() - eval(subtrahend); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView mul(final Num factor) |
||||||
|
{ |
||||||
|
|
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.value() * eval(factor); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView div(final Num factor) |
||||||
|
{ |
||||||
|
|
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.value() / eval(factor); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView perc(final Num percent) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.value() * (eval(percent) / 100); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView max(final Num other) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.max(t.value(), eval(other)); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView min(final Num other) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.min(t.value(), eval(other)); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView pow(final Num power) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return Math.pow(t.value(), eval(power)); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView average(final Num other) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final Num t = NumMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return (t.value() + eval(other)) / 2; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,261 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class NumMathStatic<N extends NumMathStatic<N>> extends NumMathBase<N> { |
||||||
|
|
||||||
|
protected abstract N result(double a); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N add(double addend) |
||||||
|
{ |
||||||
|
return result(value() + addend); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N sub(double subtrahend) |
||||||
|
{ |
||||||
|
return add(-subtrahend); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N mul(double factor) |
||||||
|
{ |
||||||
|
return result(value() * factor); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N div(double factor) |
||||||
|
{ |
||||||
|
return mul(1 / factor); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N perc(double percents) |
||||||
|
{ |
||||||
|
return mul(percents / 100); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N neg() |
||||||
|
{ |
||||||
|
return mul(-1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N abs() |
||||||
|
{ |
||||||
|
return result(Math.abs(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N max(double other) |
||||||
|
{ |
||||||
|
return result(Math.max(value(), other)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N min(double other) |
||||||
|
{ |
||||||
|
return result(Math.min(value(), other)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N pow(double power) |
||||||
|
{ |
||||||
|
return result(Math.pow(value(), power)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N square() |
||||||
|
{ |
||||||
|
final double v = value(); |
||||||
|
return result(v * v); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N cube() |
||||||
|
{ |
||||||
|
final double v = value(); |
||||||
|
return result(v * v * v); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N sqrt() |
||||||
|
{ |
||||||
|
return result(Math.sqrt(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N cbrt() |
||||||
|
{ |
||||||
|
return result(Math.cbrt(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N sin() |
||||||
|
{ |
||||||
|
return result(Math.sin(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N cos() |
||||||
|
{ |
||||||
|
return result(Math.cos(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N tan() |
||||||
|
{ |
||||||
|
return result(Math.tan(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N asin() |
||||||
|
{ |
||||||
|
return result(Math.asin(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N acos() |
||||||
|
{ |
||||||
|
return result(Math.acos(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N atan() |
||||||
|
{ |
||||||
|
return result(Math.atan(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N signum() |
||||||
|
{ |
||||||
|
return result(Math.signum(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N average(double other) |
||||||
|
{ |
||||||
|
return result((value() + other) / 2); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N round() |
||||||
|
{ |
||||||
|
return result(Math.round(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N ceil() |
||||||
|
{ |
||||||
|
return result(Math.ceil(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N floor() |
||||||
|
{ |
||||||
|
return result(Math.floor(value())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N half() |
||||||
|
{ |
||||||
|
return mul(0.5); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N add(final Num addend) |
||||||
|
{ |
||||||
|
return add(eval(addend)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N sub(final Num subtrahend) |
||||||
|
{ |
||||||
|
return sub(eval(subtrahend)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N mul(final Num factor) |
||||||
|
{ |
||||||
|
return mul(eval(factor)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N div(final Num factor) |
||||||
|
{ |
||||||
|
return div(eval(factor)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N perc(final Num percent) |
||||||
|
{ |
||||||
|
return perc(eval(percent)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N max(final Num other) |
||||||
|
{ |
||||||
|
return min(eval(other)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N min(final Num other) |
||||||
|
{ |
||||||
|
return min(eval(other)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N pow(final Num power) |
||||||
|
{ |
||||||
|
return pow(eval(power)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public N average(final Num other) |
||||||
|
{ |
||||||
|
return average(eval(other)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return String.format("{%.1f}", value()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,104 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.annotations.FactoryMethod; |
||||||
|
import mightypork.utils.math.constraints.NumBound; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Mutable numeric variable |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class NumMutable extends NumMathStatic<NumMutable> { |
||||||
|
|
||||||
|
/** |
||||||
|
* Make a new mutable number initialized as zero (0) |
||||||
|
* |
||||||
|
* @return new mutable number |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumMutable zero() |
||||||
|
{ |
||||||
|
return make(0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Make a new mutable number initialized as one (1) |
||||||
|
* |
||||||
|
* @return new mutable number |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumMutable one() |
||||||
|
{ |
||||||
|
return make(1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Make as copy of another |
||||||
|
* |
||||||
|
* @param value copied number |
||||||
|
* @return new mutable number with the same value |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumMutable make(double value) |
||||||
|
{ |
||||||
|
return new NumMutableImpl(value); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Make as copy of another |
||||||
|
* |
||||||
|
* @param copied copied number |
||||||
|
* @return new mutable number with the same value |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumMutable make(Num copied) |
||||||
|
{ |
||||||
|
return new NumMutableImpl(eval(copied)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Make as copy of another |
||||||
|
* |
||||||
|
* @param copied copied number |
||||||
|
* @return new mutable number with the same value |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumMutable make(NumBound copied) |
||||||
|
{ |
||||||
|
return new NumMutableImpl(eval(copied)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected NumMutable result(double a) |
||||||
|
{ |
||||||
|
return setTo(a); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Assign a value |
||||||
|
* |
||||||
|
* @param value new value |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public NumMutable set(Num value) |
||||||
|
{ |
||||||
|
return setTo(eval(value)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Assign a value |
||||||
|
* |
||||||
|
* @param value new value |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public abstract NumMutable setTo(double value); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Mutable numeric variable. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
class NumMutableImpl extends NumMutable { |
||||||
|
|
||||||
|
private double value; |
||||||
|
|
||||||
|
|
||||||
|
public NumMutableImpl(Num value) { |
||||||
|
this.value = eval(value); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public NumMutableImpl(double value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumMutable setTo(double value) |
||||||
|
{ |
||||||
|
this.value = value; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
public class NumProxy extends NumAdapter { |
||||||
|
|
||||||
|
private final Num observed; |
||||||
|
|
||||||
|
|
||||||
|
public NumProxy(Num observed) { |
||||||
|
this.observed = observed; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Num getSource() |
||||||
|
{ |
||||||
|
return observed; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.annotations.FactoryMethod; |
||||||
|
import mightypork.utils.math.constraints.NumBound; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Constant number {@link NumBound} |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class NumVal extends NumMathStatic<NumVal> { |
||||||
|
|
||||||
|
@SuppressWarnings("hiding") |
||||||
|
public static final NumVal ZERO = NumVal.make(0); |
||||||
|
@SuppressWarnings("hiding") |
||||||
|
public static final NumVal ONE = NumVal.make(1); |
||||||
|
|
||||||
|
/** |
||||||
|
* Make a new constant |
||||||
|
* |
||||||
|
* @param value constant value |
||||||
|
* @return new constant with the value |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumVal make(double value) |
||||||
|
{ |
||||||
|
return new NumVal(value); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Make a new constant |
||||||
|
* |
||||||
|
* @param copied number whose value to use |
||||||
|
* @return new constant with the value |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumVal make(Num copied) |
||||||
|
{ |
||||||
|
return (copied == null ? ZERO : copied.copy()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Make a new constant |
||||||
|
* |
||||||
|
* @param copied number whose value to use |
||||||
|
* @return new constant with the value |
||||||
|
*/ |
||||||
|
@FactoryMethod |
||||||
|
public static NumVal make(NumBound copied) |
||||||
|
{ |
||||||
|
return new NumVal(eval(copied)); |
||||||
|
} |
||||||
|
|
||||||
|
private final double value; |
||||||
|
|
||||||
|
|
||||||
|
public NumVal(Num copied) { |
||||||
|
this.value = copied.value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public NumVal(double value) { |
||||||
|
this.value = value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
protected NumVal result(double a) |
||||||
|
{ |
||||||
|
return new NumVal(a); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @deprecated it's useless to copy a constant |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
@Deprecated |
||||||
|
public NumVal copy() |
||||||
|
{ |
||||||
|
return super.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package mightypork.utils.math.num; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class NumView extends NumMathDynamic { |
||||||
|
|
||||||
|
/** |
||||||
|
* @deprecated No point in taking view of a view. |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
@Deprecated |
||||||
|
public NumView view() |
||||||
|
{ |
||||||
|
return this; // no work here
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package mightypork.utils.math.rect; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.vect.Vect; |
||||||
|
import mightypork.utils.math.vect.VectAdapter; |
||||||
|
import mightypork.utils.math.vect.VectView; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Rect proxy with abstract method for plugging in / generating rect |
||||||
|
* dynamically. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class RectAdapter extends RectView { |
||||||
|
|
||||||
|
private VectAdapter originAdapter = new VectAdapter() { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Vect getSource() |
||||||
|
{ |
||||||
|
return RectAdapter.this.getSource().origin(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
private VectAdapter sizeAdapter = new VectAdapter() { |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Vect getSource() |
||||||
|
{ |
||||||
|
return RectAdapter.this.getSource().size(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return the proxied coord |
||||||
|
*/ |
||||||
|
protected abstract Rect getSource(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return originAdapter; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return sizeAdapter; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,360 @@ |
|||||||
|
package mightypork.utils.math.rect; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.num.Num; |
||||||
|
import mightypork.utils.math.num.NumView; |
||||||
|
import mightypork.utils.math.vect.Vect; |
||||||
|
import mightypork.utils.math.vect.VectView; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class RectMathDynamic extends RectMath<RectView> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract VectView origin(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract VectView size(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public RectView move(final Vect move) |
||||||
|
{ |
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.add(move); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public RectView move(final double xd, final double yd) |
||||||
|
{ |
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.add(xd, yd); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public RectView move(final Num xd, final Num yd) |
||||||
|
{ |
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.add(xd, yd); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public RectView shrink(final double leftd, final double rightd, final double topd, final double bottomd) |
||||||
|
{ |
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size.sub(leftd + rightd, topd + bottomd); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.add(leftd, topd); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public RectView grow(final double leftd, final double rightd, final double topd, final double bottomd) |
||||||
|
{ |
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size.add(leftd + rightd, topd + bottomd); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.sub(leftd, topd); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public RectView shrink(final Num leftd, final Num rightd, final Num topd, final Num bottomd) |
||||||
|
{ |
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size.sub(leftd.view().add(rightd), topd.view().add(bottomd)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.add(leftd, topd); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public RectView grow(final Num leftd, final Num rightd, final Num topd, final Num bottomd) |
||||||
|
{ |
||||||
|
|
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size.add(leftd.view().add(rightd), topd.view().add(bottomd)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.sub(leftd, topd); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public RectView round() |
||||||
|
{ |
||||||
|
|
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
private RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size.round(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return t.p_origin.round(); |
||||||
|
} |
||||||
|
|
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView x() |
||||||
|
{ |
||||||
|
return p_x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView y() |
||||||
|
{ |
||||||
|
return p_y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView width() |
||||||
|
{ |
||||||
|
return p_width; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView height() |
||||||
|
{ |
||||||
|
return p_height; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView left() |
||||||
|
{ |
||||||
|
return p_left; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView right() |
||||||
|
{ |
||||||
|
return p_right; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView top() |
||||||
|
{ |
||||||
|
return p_top; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView bottom() |
||||||
|
{ |
||||||
|
return p_bottom; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView topLeft() |
||||||
|
{ |
||||||
|
return p_tl; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView topCenter() |
||||||
|
{ |
||||||
|
return p_tc; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView topRight() |
||||||
|
{ |
||||||
|
return p_tr; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView centerLeft() |
||||||
|
{ |
||||||
|
return p_cl; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView center() |
||||||
|
{ |
||||||
|
return p_cc; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView centerRight() |
||||||
|
{ |
||||||
|
return p_cr; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView bottomLeft() |
||||||
|
{ |
||||||
|
return p_bl; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView bottomCenter() |
||||||
|
{ |
||||||
|
return p_bc; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView bottomRight() |
||||||
|
{ |
||||||
|
return p_br; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public RectView centerTo(final Vect point) |
||||||
|
{ |
||||||
|
return new RectView() { |
||||||
|
|
||||||
|
RectMathDynamic t = RectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView size() |
||||||
|
{ |
||||||
|
return t.p_size; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView origin() |
||||||
|
{ |
||||||
|
return point.view().sub(t.p_size.half()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,179 @@ |
|||||||
|
package mightypork.utils.math.rect; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.num.NumVal; |
||||||
|
import mightypork.utils.math.vect.Vect; |
||||||
|
import mightypork.utils.math.vect.VectVal; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class RectMathStatic<R extends RectMathStatic<R>> extends RectMath<R> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract VectVal origin(); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public abstract VectVal size(); |
||||||
|
|
||||||
|
@Override |
||||||
|
public R move(Vect move) |
||||||
|
{ |
||||||
|
return move(move.x(), move.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public R move(double x, double y) { |
||||||
|
return result(p_origin.add(x,y), p_size); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public R shrink(double left, double right, double top, double bottom) |
||||||
|
{ |
||||||
|
return result(p_origin.add(left, top), p_size.sub(left + right, top + bottom)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public R grow(double left, double right, double top, double bottom) |
||||||
|
{ |
||||||
|
return result(p_origin.sub(left, top), p_size.add(left + right, top + bottom)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public R centerTo(final Vect point) |
||||||
|
{ |
||||||
|
return result(p_origin.sub(p_size.half()), p_size); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public R round() |
||||||
|
{ |
||||||
|
return result(p_origin.round(), p_size.round()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
protected abstract R result(Vect newOrigin, Vect newSize); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal x() |
||||||
|
{ |
||||||
|
return p_x.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal y() |
||||||
|
{ |
||||||
|
return p_y.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal width() |
||||||
|
{ |
||||||
|
return p_width.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal height() |
||||||
|
{ |
||||||
|
return p_height.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal left() |
||||||
|
{ |
||||||
|
return p_left.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal right() |
||||||
|
{ |
||||||
|
return p_right.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal top() |
||||||
|
{ |
||||||
|
return p_top.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal bottom() |
||||||
|
{ |
||||||
|
return p_bottom.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal topLeft() |
||||||
|
{ |
||||||
|
return p_tl.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal topCenter() |
||||||
|
{ |
||||||
|
return p_tc.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal topRight() |
||||||
|
{ |
||||||
|
return p_tr.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal centerLeft() |
||||||
|
{ |
||||||
|
return p_cl.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal center() |
||||||
|
{ |
||||||
|
return p_cc.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal centerRight() |
||||||
|
{ |
||||||
|
return p_cr.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal bottomLeft() |
||||||
|
{ |
||||||
|
return p_bl.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal bottomCenter() |
||||||
|
{ |
||||||
|
return p_bc.copy(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectVal bottomRight() |
||||||
|
{ |
||||||
|
return p_br.copy(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,665 @@ |
|||||||
|
package mightypork.utils.math.vect; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.constraints.NumBound; |
||||||
|
import mightypork.utils.math.num.Num; |
||||||
|
import mightypork.utils.math.num.NumVal; |
||||||
|
import mightypork.utils.math.num.NumView; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Dynamic vector math functions, to be used with a view. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
abstract class VectMathDynamic extends VectMath<VectView, NumBound> { |
||||||
|
|
||||||
|
private NumView size; |
||||||
|
private VectView neg; |
||||||
|
private VectView half; |
||||||
|
private VectView abs; |
||||||
|
private NumView xc; |
||||||
|
private NumView yc; |
||||||
|
private NumView zc; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X constraint |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public final NumView xn() |
||||||
|
{ |
||||||
|
if (xc == null) xc = new NumView() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return x(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return xc; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y constraint |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public final NumView yn() |
||||||
|
{ |
||||||
|
if (yc == null) yc = new NumView() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return y(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return yc; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z constraint |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public final NumView zn() |
||||||
|
{ |
||||||
|
if (zc == null) zc = new NumView() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return z(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return zc; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView abs() |
||||||
|
{ |
||||||
|
if (abs == null) abs = new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return Math.abs(t.x()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return Math.abs(t.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return Math.abs(t.z()); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return abs; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView add(Vect vec) |
||||||
|
{ |
||||||
|
return add(vec.view().xn(), vec.view().yn(), vec.view().zn()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView add(double x, double y) |
||||||
|
{ |
||||||
|
return add(x, y, 0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView add(final double x, final double y, final double z) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return t.x() + x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return t.y() + y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return t.z() + z; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView add(Num x, Num y) |
||||||
|
{ |
||||||
|
return add(x, y, Num.ZERO); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView add(final Num x, final Num y, final Num z) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final Vect t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return t.x() + x.value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return t.y() + y.value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return t.z() + z.value(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView half() |
||||||
|
{ |
||||||
|
if (half == null) half = mul(0.5); |
||||||
|
return half; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView mul(double d) |
||||||
|
{ |
||||||
|
return mul(d, d, d); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView mul(Vect vec) |
||||||
|
{ |
||||||
|
return mul(vec.view().xn(), vec.view().yn(), vec.view().zn()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView mul(double x, double y) |
||||||
|
{ |
||||||
|
return mul(x, y, 1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView mul(final double x, final double y, final double z) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return t.x() * x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return t.y() * y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return t.z() * z; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView mul(final Num d) |
||||||
|
{ |
||||||
|
return mul(d, d, d); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView mul(final Num x, final Num y) |
||||||
|
{ |
||||||
|
return mul(x, y, Num.ONE); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView mul(final Num x, final Num y, final Num z) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final Vect t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return t.x() * x.value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return t.y() * y.value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return t.z() * z.value(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView round() |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return Math.round(t.x()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return Math.round(t.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return Math.round(t.z()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView floor() |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return Math.floor(t.x()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return Math.floor(t.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return Math.floor(t.z()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView ceil() |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return Math.ceil(t.x()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return Math.ceil(t.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return Math.ceil(t.z()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView sub(Vect vec) |
||||||
|
{ |
||||||
|
return sub(vec.view().xn(), vec.view().yn(), vec.view().zn()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView sub(double x, double y) |
||||||
|
{ |
||||||
|
return add(-x, -y, 0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView sub(double x, double y, double z) |
||||||
|
{ |
||||||
|
return add(-x, -y, -z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView sub(Num x, Num y) |
||||||
|
{ |
||||||
|
return sub(x, y, Num.ZERO); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView sub(final Num x, final Num y, final Num z) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final Vect t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return t.x() - x.value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return t.y() - y.value(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return t.z() - z.value(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView neg() |
||||||
|
{ |
||||||
|
if (neg == null) neg = mul(-1); |
||||||
|
return neg; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public VectView norm(final Num size) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
final double tSize = t.size().value(); |
||||||
|
final double nSize = size.value(); |
||||||
|
|
||||||
|
if (tSize == 0 || nSize == 0) return 0; |
||||||
|
|
||||||
|
return x() / (nSize / tSize); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
final double tSize = t.size().value(); |
||||||
|
final double nSize = size.value(); |
||||||
|
|
||||||
|
if (tSize == 0 || nSize == 0) return 0; |
||||||
|
|
||||||
|
return y() / (nSize / tSize); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
final double tSize = t.size().value(); |
||||||
|
final double nSize = size.value(); |
||||||
|
|
||||||
|
if (tSize == 0 || nSize == 0) return 0; |
||||||
|
|
||||||
|
return z() / (nSize / tSize); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public VectView norm(final double size) |
||||||
|
{ |
||||||
|
return norm(NumVal.make(size)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView distTo(final Vect point) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
final double dx = t.x() - point.x(); |
||||||
|
final double dy = t.y() - point.y(); |
||||||
|
final double dz = t.z() - point.z(); |
||||||
|
|
||||||
|
return Math.sqrt(dx * dx + dy * dy + dz * dz); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final VectView midTo(final Vect point) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return (point.x() + t.x()) * 0.5; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return (point.y() + t.y()) * 0.5; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return (point.z() + t.z()) * 0.5; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final VectView vectTo(final Vect point) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return (point.x() - t.x()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return (point.y() - t.y()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return (point.z() - t.z()); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final VectView cross(final Vect vec) |
||||||
|
{ |
||||||
|
return new VectView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return t.y() * vec.z() - t.z() * vec.y(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return t.z() * vec.x() - t.x() * vec.z(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return t.x() * vec.y() - t.y() * vec.x(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumView dot(final Vect vec) |
||||||
|
{ |
||||||
|
return new NumView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
return t.x() * vec.x() + t.y() * vec.y() + t.z() * vec.z(); |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public Num size() |
||||||
|
{ |
||||||
|
if (size == null) size = new NumView() { |
||||||
|
|
||||||
|
final VectMathDynamic t = VectMathDynamic.this; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public double value() |
||||||
|
{ |
||||||
|
final double x = t.x(), y = t.y(), z = t.z(); |
||||||
|
return Math.sqrt(x * x + y * y + z * z); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
return size; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,280 @@ |
|||||||
|
package mightypork.utils.math.vect; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.utils.math.num.Num; |
||||||
|
import mightypork.utils.math.num.NumVal; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Implementation of coordinate methods |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
* @param <V> Return type of methods |
||||||
|
*/ |
||||||
|
public abstract class VectMathStatic<V extends VectMathStatic<V>> extends VectMath<V, NumVal> { |
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal xn() |
||||||
|
{ |
||||||
|
return NumVal.make(x()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal yn() |
||||||
|
{ |
||||||
|
return NumVal.make(yn()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal zn() |
||||||
|
{ |
||||||
|
return NumVal.make(z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* Some operation was performed and this result was obtained. |
||||||
|
* </p> |
||||||
|
* <p> |
||||||
|
* It's now up to implementing class what to do - mutable ones can alter |
||||||
|
* it's data values, immutable can return a new Vec. |
||||||
|
* </p> |
||||||
|
* |
||||||
|
* @param x |
||||||
|
* @param y |
||||||
|
* @param z |
||||||
|
* @return the result Vec |
||||||
|
*/ |
||||||
|
public abstract V result(double x, double y, double z); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V abs() |
||||||
|
{ |
||||||
|
return result(Math.abs(x()), Math.abs(y()), Math.abs(z())); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V add(Vect 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 V add(Num x, Num y) |
||||||
|
{ |
||||||
|
return add(x, y, Num.ZERO); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V add(final Num x, final Num y, final Num z) |
||||||
|
{ |
||||||
|
return add(x.value(), y.value(), z.value()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V half() |
||||||
|
{ |
||||||
|
return mul(0.5); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(double d) |
||||||
|
{ |
||||||
|
return mul(d, d, d); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(Vect 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 mul(final Num d) |
||||||
|
{ |
||||||
|
return mul(d, d, d); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(final Num x, final Num y) |
||||||
|
{ |
||||||
|
return mul(x, y, Num.ONE); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V mul(final Num x, final Num y, final Num z) |
||||||
|
{ |
||||||
|
return mul(x.value(), y.value(), z.value()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@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(Vect 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 sub(Num x, Num y) |
||||||
|
{ |
||||||
|
return sub(x, y, Num.ZERO); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public V sub(final Num x, final Num y, final Num z) |
||||||
|
{ |
||||||
|
return sub(x.value(), y.value(), z.value()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@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 NumVal k = size().mul(1 / size); |
||||||
|
|
||||||
|
return mul(k); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal distTo(Vect point) |
||||||
|
{ |
||||||
|
final double dx = x() - point.x(); |
||||||
|
final double dy = y() - point.y(); |
||||||
|
final double dz = z() - point.z(); |
||||||
|
|
||||||
|
return NumVal.make(Math.sqrt(dx * dx + dy * dy + dz * dz)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final V midTo(Vect point) |
||||||
|
{ |
||||||
|
final double dx = (point.x() - x()) * 0.5; |
||||||
|
final double dy = (point.y() - y()) * 0.5; |
||||||
|
final double dz = (point.z() - z()) * 0.5; |
||||||
|
|
||||||
|
return result(dx, dy, dz); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final V vectTo(Vect point) |
||||||
|
{ |
||||||
|
return result(point.x() - x(), point.y() - y(), point.z() - z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final V cross(Vect 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 NumVal dot(Vect vec) |
||||||
|
{ |
||||||
|
return NumVal.make(x() * vec.x() + y() * vec.y() + z() * vec.z()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public NumVal size() |
||||||
|
{ |
||||||
|
final double x = x(), y = y(), z = z(); |
||||||
|
return NumVal.make(Math.sqrt(x * x + y * y + z * z)); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue