parent
							
								
									3320678f36
								
							
						
					
					
						commit
						2690e6c5f3
					
				@ -1,37 +0,0 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
abstract class AbstractNum implements Num { | 
				
			||||
	 | 
				
			||||
	private NumView proxy; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num getNum() | 
				
			||||
	{ | 
				
			||||
		return this; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumView view() | 
				
			||||
	{ | 
				
			||||
		if (proxy == null) proxy = new NumProxy(this); | 
				
			||||
		 | 
				
			||||
		return proxy; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal copy() | 
				
			||||
	{ | 
				
			||||
		return new NumVal(this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public String toString() | 
				
			||||
	{ | 
				
			||||
		return String.format("#{%.1f}",value()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,20 +1,768 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.annotations.FactoryMethod; | 
				
			||||
import mightypork.utils.math.Calc; | 
				
			||||
import mightypork.utils.math.constraints.NumBound; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
public interface Num extends NumBound { | 
				
			||||
public abstract class Num implements NumBound { | 
				
			||||
	 | 
				
			||||
	Num ZERO = NumVal.make(0); | 
				
			||||
	Num ONE = NumVal.make(1); | 
				
			||||
	static final double CMP_EPSILON = 0.0000001; | 
				
			||||
	 | 
				
			||||
	public static final NumConst ZERO = Num.make(0); | 
				
			||||
	public static final NumConst ONE = Num.make(1); | 
				
			||||
	 | 
				
			||||
	double value(); | 
				
			||||
	 | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static NumConst make(double value) | 
				
			||||
	{ | 
				
			||||
		return new NumConst(value); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static NumVar makeVar() | 
				
			||||
	{ | 
				
			||||
		return makeVar(0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static NumVar makeVar(double value) | 
				
			||||
	{ | 
				
			||||
		return new NumVar(value); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static NumVar makeVar(Num copied) | 
				
			||||
	{ | 
				
			||||
		return new NumVar(eval(copied)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	private Num p_ceil; | 
				
			||||
	private Num p_floor; | 
				
			||||
	private Num p_sgn; | 
				
			||||
	private Num p_round; | 
				
			||||
	private Num p_atan; | 
				
			||||
	private Num p_acos; | 
				
			||||
	private Num p_asin; | 
				
			||||
	private Num p_tan; | 
				
			||||
	private Num p_cos; | 
				
			||||
	private Num p_sin; | 
				
			||||
	private Num p_cbrt; | 
				
			||||
	private Num p_sqrt; | 
				
			||||
	private Num p_cube; | 
				
			||||
	private Num p_square; | 
				
			||||
	private Num p_neg; | 
				
			||||
	private Num p_abs; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * 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()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public NumConst freeze() | 
				
			||||
	{ | 
				
			||||
		return new NumConst(value()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num getNum() | 
				
			||||
	{ | 
				
			||||
		return this; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return the number | 
				
			||||
	 */ | 
				
			||||
	public abstract double value(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num abs() | 
				
			||||
	{ | 
				
			||||
		if (p_abs == null) p_abs = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.abs(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_abs; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num acos() | 
				
			||||
	{ | 
				
			||||
		if (p_acos == null) p_acos = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.acos(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_acos; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num add(final double addend) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			private final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return t.value() + addend; | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num add(final Num addend) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return t.value() + eval(addend); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num asin() | 
				
			||||
	{ | 
				
			||||
		if (p_asin == null) p_asin = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.asin(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_asin; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num atan() | 
				
			||||
	{ | 
				
			||||
		if (p_atan == null) p_atan = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.atan(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_atan; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num average(final double other) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return (t.value() + other) / 2; | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num average(final Num other) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return (t.value() + eval(other)) / 2; | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num cbrt() | 
				
			||||
	{ | 
				
			||||
		if (p_cbrt == null) p_cbrt = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.cbrt(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_cbrt; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num ceil() | 
				
			||||
	{ | 
				
			||||
		if (p_ceil == null) p_ceil = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.round(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_ceil; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num cos() | 
				
			||||
	{ | 
				
			||||
		if (p_cos == null) p_cos = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.cos(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_cos; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num cube() | 
				
			||||
	{ | 
				
			||||
		if (p_cube == null) p_cube = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				final double v = t.value(); | 
				
			||||
				return v * v * v; | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_cube; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num div(final double factor) | 
				
			||||
	{ | 
				
			||||
		return mul(1 / factor); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num div(final Num factor) | 
				
			||||
	{ | 
				
			||||
		 | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return t.value() / eval(factor); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean eq(double other) | 
				
			||||
	{ | 
				
			||||
		return value() == other; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean eq(final Num a) | 
				
			||||
	{ | 
				
			||||
		return eq(eval(a)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num floor() | 
				
			||||
	{ | 
				
			||||
		if (p_floor == null) p_floor = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.floor(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_floor; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean gt(double other) | 
				
			||||
	{ | 
				
			||||
		return Math.signum(value() - other) >= 0; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean gt(final Num other) | 
				
			||||
	{ | 
				
			||||
		return gt(eval(other)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean gte(double other) | 
				
			||||
	{ | 
				
			||||
		return Math.signum(value() - other) >= 0; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean gte(final Num other) | 
				
			||||
	{ | 
				
			||||
		return gte(eval(other)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num half() | 
				
			||||
	{ | 
				
			||||
		return mul(0.5); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean isNegative() | 
				
			||||
	{ | 
				
			||||
		return value() < 0; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean isPositive() | 
				
			||||
	{ | 
				
			||||
		return value() > 0; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean isZero() | 
				
			||||
	{ | 
				
			||||
		return value() == 0; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean lt(double other) | 
				
			||||
	{ | 
				
			||||
		return !gte(other); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean lt(final Num other) | 
				
			||||
	{ | 
				
			||||
		return !gte(other); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean lte(double other) | 
				
			||||
	{ | 
				
			||||
		return !gt(other); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public boolean lte(final Num other) | 
				
			||||
	{ | 
				
			||||
		return !gt(other); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num max(final double other) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.max(t.value(), other); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num max(final Num other) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.max(t.value(), eval(other)); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num min(final double other) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.min(t.value(), other); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num min(final Num other) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.min(t.value(), eval(other)); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num mul(final double factor) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			private final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return t.value() * factor; | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num mul(final Num factor) | 
				
			||||
	{ | 
				
			||||
		 | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return t.value() * eval(factor); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num neg() | 
				
			||||
	{ | 
				
			||||
		if (p_neg == null) p_neg = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return -1 * t.value(); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_neg; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num perc(final double percent) | 
				
			||||
	{ | 
				
			||||
		return mul(percent / 100); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num perc(final Num percent) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return t.value() * (eval(percent) / 100); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	NumView view(); | 
				
			||||
	 | 
				
			||||
	public Num pow(final double other) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
	NumVal copy(); | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.pow(t.value(), other); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num pow(final Num power) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.pow(t.value(), eval(power)); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num round() | 
				
			||||
	{ | 
				
			||||
		if (p_round == null) p_round = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.round(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_round; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num signum() | 
				
			||||
	{ | 
				
			||||
		if (p_sgn == null) p_sgn = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.signum(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_sgn; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num sin() | 
				
			||||
	{ | 
				
			||||
		if (p_sin == null) p_sin = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.sin(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_sin; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num sqrt() | 
				
			||||
	{ | 
				
			||||
		if (p_sqrt == null) p_sqrt = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.sqrt(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_sqrt; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num square() | 
				
			||||
	{ | 
				
			||||
		if (p_square == null) p_square = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				final double v = t.value(); | 
				
			||||
				return v * v; | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_square; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num sub(final double subtrahend) | 
				
			||||
	{ | 
				
			||||
		return add(-subtrahend); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num sub(final Num subtrahend) | 
				
			||||
	{ | 
				
			||||
		return new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return t.value() - eval(subtrahend); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public Num tan() | 
				
			||||
	{ | 
				
			||||
		if (p_tan == null) p_tan = new Num() { | 
				
			||||
			 | 
				
			||||
			final Num t = Num.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double value() | 
				
			||||
			{ | 
				
			||||
				return Math.tan(t.value()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
		 | 
				
			||||
		return p_tan; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@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 Num)) return false; | 
				
			||||
		final Num other = (Num) obj; | 
				
			||||
		 | 
				
			||||
		return eq(other); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public String toString() | 
				
			||||
	{ | 
				
			||||
		return Calc.toString(value()); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
@ -0,0 +1,251 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.constraints.NumBound; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Constant number {@link NumBound} | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public class NumConst extends Num { | 
				
			||||
	 | 
				
			||||
	private final double value; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	NumConst(Num copied) { | 
				
			||||
		this.value = copied.value(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	NumConst(double value) { | 
				
			||||
		this.value = value; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public double value() | 
				
			||||
	{ | 
				
			||||
		return value; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * No good to copy a constant. | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@Deprecated | 
				
			||||
	public NumConst freeze() | 
				
			||||
	{ | 
				
			||||
		return this; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst add(double addend) | 
				
			||||
	{ | 
				
			||||
		return Num.make(value() + addend); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst sub(double subtrahend) | 
				
			||||
	{ | 
				
			||||
		return add(-subtrahend); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst mul(double factor) | 
				
			||||
	{ | 
				
			||||
		return Num.make(value() * factor); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst div(double factor) | 
				
			||||
	{ | 
				
			||||
		return mul(1 / factor); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst perc(double percents) | 
				
			||||
	{ | 
				
			||||
		return mul(percents / 100); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst neg() | 
				
			||||
	{ | 
				
			||||
		return mul(-1); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst abs() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.abs(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst max(double other) | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.max(value(), other)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst min(double other) | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.min(value(), other)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst pow(double power) | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.pow(value(), power)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst square() | 
				
			||||
	{ | 
				
			||||
		final double v = value(); | 
				
			||||
		return Num.make(v * v); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst cube() | 
				
			||||
	{ | 
				
			||||
		final double v = value(); | 
				
			||||
		return Num.make(v * v * v); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst sqrt() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.sqrt(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst cbrt() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.cbrt(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst sin() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.sin(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst cos() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.cos(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst tan() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.tan(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst asin() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.asin(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst acos() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.acos(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst atan() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.atan(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst signum() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.signum(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst average(double other) | 
				
			||||
	{ | 
				
			||||
		return Num.make((value() + other) / 2); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst round() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.round(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst ceil() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.ceil(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst floor() | 
				
			||||
	{ | 
				
			||||
		return Num.make(Math.floor(value())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst half() | 
				
			||||
	{ | 
				
			||||
		return mul(0.5); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public NumConst add(NumConst addend) | 
				
			||||
	{ | 
				
			||||
		return make(value + addend.value); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public NumConst sub(NumConst addend) | 
				
			||||
	{ | 
				
			||||
		return make(value - addend.value); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public NumConst mul(NumConst addend) | 
				
			||||
	{ | 
				
			||||
		return make(value * addend.value); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public NumConst div(NumConst addend) | 
				
			||||
	{ | 
				
			||||
		return make(value / addend.value); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,168 +0,0 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.rect.Rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * 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(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a square rect with this side, positioned at 0,0 | 
				
			||||
	 *  | 
				
			||||
	 * @return new rect | 
				
			||||
	 */ | 
				
			||||
	Rect box(); | 
				
			||||
} | 
				
			||||
@ -1,153 +0,0 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.constraints.NumBound; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
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; | 
				
			||||
		final NumMathBase<?> other = (NumMathBase<?>) obj; | 
				
			||||
		 | 
				
			||||
		return eq(other); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,613 +0,0 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.rect.RectView; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
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 final 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 final 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; | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView box() | 
				
			||||
	{ | 
				
			||||
		return RectView.make(this, this); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,271 +0,0 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.rect.RectVal; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
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 RectVal box() | 
				
			||||
	{ | 
				
			||||
		return RectVal.make(this, this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public String toString() | 
				
			||||
	{ | 
				
			||||
		return String.format("{%.1f}", value()); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,20 +0,0 @@ | 
				
			||||
package mightypork.utils.math.num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
class NumProxy extends NumAdapter { | 
				
			||||
	 | 
				
			||||
	private final Num observed; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public NumProxy(Num observed) { | 
				
			||||
		this.observed = observed; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	protected Num getSource() | 
				
			||||
	{ | 
				
			||||
		return observed; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,96 +0,0 @@ | 
				
			||||
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; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	NumVal(Num copied) { | 
				
			||||
		this.value = copied.value(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	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(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,16 +0,0 @@ | 
				
			||||
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
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,45 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Abstract {@link Rect}, implementing all but the data getters | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
abstract class AbstractRect implements Rect { | 
				
			||||
	 | 
				
			||||
	private RectProxy proxy; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView getRect() | 
				
			||||
	{ | 
				
			||||
		return this.view(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView view() | 
				
			||||
	{ | 
				
			||||
		// must NOT call RectView.make, it'd cause infinite recursion.		
 | 
				
			||||
		if (proxy == null) proxy = new RectProxy(this); | 
				
			||||
		 | 
				
			||||
		return proxy; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectVal copy() | 
				
			||||
	{ | 
				
			||||
		// must NOT call RectVal.make, it'd cause infinite recursion.
 | 
				
			||||
		return new RectVal(this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public String toString() | 
				
			||||
	{ | 
				
			||||
		return String.format("Rect { %s - %s }", origin(), origin().copy().add(size())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,239 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.num.NumConst; | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
import mightypork.utils.math.vect.VectConst; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Rectangle with constant bounds, that can never change. | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public class RectConst extends Rect { | 
				
			||||
	 | 
				
			||||
	private final VectConst pos; | 
				
			||||
	private final VectConst size; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param x | 
				
			||||
	 * @param y | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 */ | 
				
			||||
	RectConst(double x, double y, double width, double height) { | 
				
			||||
		this.pos = Vect.make(x, y); | 
				
			||||
		this.size = Vect.make(width, height); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param origin | 
				
			||||
	 * @param size | 
				
			||||
	 */ | 
				
			||||
	RectConst(Vect origin, Vect size) { | 
				
			||||
		this.pos = origin.freeze(); | 
				
			||||
		this.size = size.freeze(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param another other coord | 
				
			||||
	 */ | 
				
			||||
	RectConst(Rect another) { | 
				
			||||
		this.pos = another.origin().freeze(); | 
				
			||||
		this.size = another.size().freeze(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @deprecated it's useless to copy a constant | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@Deprecated | 
				
			||||
	public RectConst freeze() | 
				
			||||
	{ | 
				
			||||
		return this; // already constant
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst origin() | 
				
			||||
	{ | 
				
			||||
		return pos; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst size() | 
				
			||||
	{ | 
				
			||||
		return size; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectConst move(Vect move) | 
				
			||||
	{ | 
				
			||||
		return move(move.x(), move.y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectConst move(double x, double y) | 
				
			||||
	{ | 
				
			||||
		return Rect.make(origin().add(x, y), size()).freeze(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectConst shrink(double left, double right, double top, double bottom) | 
				
			||||
	{ | 
				
			||||
		return Rect.make(origin().add(left, top), size().sub(left + right, top + bottom)).freeze(); | 
				
			||||
		 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectConst grow(double left, double right, double top, double bottom) | 
				
			||||
	{ | 
				
			||||
		return Rect.make(origin().sub(left, top), size().add(left + right, top + bottom)).freeze(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectConst round() | 
				
			||||
	{ | 
				
			||||
		final VectConst s = size(); | 
				
			||||
		final VectConst o = origin(); | 
				
			||||
		 | 
				
			||||
		return Rect.make(o.round(), s.round()).freeze(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst x() | 
				
			||||
	{ | 
				
			||||
		return origin().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst y() | 
				
			||||
	{ | 
				
			||||
		return origin().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst width() | 
				
			||||
	{ | 
				
			||||
		return size().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst height() | 
				
			||||
	{ | 
				
			||||
		return size().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst left() | 
				
			||||
	{ | 
				
			||||
		return origin().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst right() | 
				
			||||
	{ | 
				
			||||
		return origin().xn().add(size().xn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst top() | 
				
			||||
	{ | 
				
			||||
		return origin().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst bottom() | 
				
			||||
	{ | 
				
			||||
		return origin().yn().add(size().yn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst topLeft() | 
				
			||||
	{ | 
				
			||||
		return origin(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst topCenter() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x() / 2, 0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst topRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x(), 0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst centerLeft() | 
				
			||||
	{ | 
				
			||||
		return origin().add(0, size().y() / 2); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst center() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().half()).freeze(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst centerRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x(), size().y() / 2); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst bottomLeft() | 
				
			||||
	{ | 
				
			||||
		return origin().add(0, size().y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst bottomCenter() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x() / 2, size().y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst bottomRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size()).freeze(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,139 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
abstract class RectMath<R extends Rect> extends AbstractRect { | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Add vector to origin | 
				
			||||
	 *  | 
				
			||||
	 * @param move offset vector | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract R move(Vect move); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Add X and Y to origin | 
				
			||||
	 *  | 
				
			||||
	 * @param x x to add | 
				
			||||
	 * @param y y to add | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract R move(double x, double y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Shrink to sides | 
				
			||||
	 *  | 
				
			||||
	 * @param shrink shrink size (horisontal and vertical) | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	 | 
				
			||||
	public R shrink(Vect shrink) | 
				
			||||
	{ | 
				
			||||
		return shrink(shrink.x(), shrink.y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Shrink to sides at sides | 
				
			||||
	 *  | 
				
			||||
	 * @param x horizontal shrink | 
				
			||||
	 * @param y vertical shrink | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public R shrink(double x, double y) | 
				
			||||
	{ | 
				
			||||
		return shrink(x, x, y, y); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Shrink the rect | 
				
			||||
	 *  | 
				
			||||
	 * @param left shrink | 
				
			||||
	 * @param right shrink | 
				
			||||
	 * @param top shrink | 
				
			||||
	 * @param bottom shrink | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract R shrink(double left, double right, double top, double bottom); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Grow to sides | 
				
			||||
	 *  | 
				
			||||
	 * @param grow grow size (added to each side) | 
				
			||||
	 * @return grown copy | 
				
			||||
	 */ | 
				
			||||
	public final R grow(Vect grow) | 
				
			||||
	{ | 
				
			||||
		return grow(grow.x(), grow.y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Grow to sides | 
				
			||||
	 *  | 
				
			||||
	 * @param x horizontal grow | 
				
			||||
	 * @param y vertical grow | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public final R grow(double x, double y) | 
				
			||||
	{ | 
				
			||||
		return grow(x, x, y, y); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Grow the rect | 
				
			||||
	 *  | 
				
			||||
	 * @param left growth | 
				
			||||
	 * @param right growth | 
				
			||||
	 * @param top growth | 
				
			||||
	 * @param bottom growth | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract R grow(double left, double right, double top, double bottom); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Round coords | 
				
			||||
	 *  | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract R round(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Center to given point | 
				
			||||
	 *  | 
				
			||||
	 * @param point new center | 
				
			||||
	 * @return centered | 
				
			||||
	 */ | 
				
			||||
	public abstract R centerTo(final Vect point); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Check if point is inside this rectangle | 
				
			||||
	 *  | 
				
			||||
	 * @param point point to test | 
				
			||||
	 * @return is inside | 
				
			||||
	 */ | 
				
			||||
	public boolean contains(Vect point) | 
				
			||||
	{ | 
				
			||||
		final double x = point.x(); | 
				
			||||
		final double y = point.y(); | 
				
			||||
		 | 
				
			||||
		final double x1 = origin().x(); | 
				
			||||
		final double y1 = origin().y(); | 
				
			||||
		final double x2 = x1 + size().x(); | 
				
			||||
		final double y2 = y1 + size().y(); | 
				
			||||
		 | 
				
			||||
		return x >= x1 && y >= y1 && x <= x2 && y <= y2; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,359 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.num.Num; | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
import mightypork.utils.math.vect.VectView; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
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 final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().add(move); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView move(final double x, final double y) | 
				
			||||
	{ | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			private final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().add(x, y); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public RectView move(final Num x, final Num y) | 
				
			||||
	{ | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			private final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().add(x, y); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView shrink(final double left, final double right, final double top, final double bottom) | 
				
			||||
	{ | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			private final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size().sub(left + right, top + bottom); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().add(left, top); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView grow(final double left, final double right, final double top, final double bottom) | 
				
			||||
	{ | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			private final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size().add(left + right, top + bottom); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().sub(left, top); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public RectView shrink(final Num left, final Num right, final Num top, final Num bottom) | 
				
			||||
	{ | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			private final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size().sub(left.view().add(right), top.view().add(bottom)); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().add(left, top); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public RectView grow(final Num left, final Num right, final Num top, final Num bottom) | 
				
			||||
	{ | 
				
			||||
		 | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			private final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size().add(left.view().add(right), top.view().add(bottom)); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().sub(left, top); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView round() | 
				
			||||
	{ | 
				
			||||
		 | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			private final RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size().round(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return t.origin().round(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num x() | 
				
			||||
	{ | 
				
			||||
		return origin().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num y() | 
				
			||||
	{ | 
				
			||||
		return origin().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num width() | 
				
			||||
	{ | 
				
			||||
		return size().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num height() | 
				
			||||
	{ | 
				
			||||
		return size().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num left() | 
				
			||||
	{ | 
				
			||||
		return origin().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num right() | 
				
			||||
	{ | 
				
			||||
		return origin().xn().add(size().xn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num top() | 
				
			||||
	{ | 
				
			||||
		return origin().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Num bottom() | 
				
			||||
	{ | 
				
			||||
		return origin().yn().add(size().yn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView topLeft() | 
				
			||||
	{ | 
				
			||||
		return origin(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView topCenter() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().xn().half(), Num.ZERO); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView topRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().xn(), Num.ZERO); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView centerLeft() | 
				
			||||
	{ | 
				
			||||
		return origin().add(Num.ZERO, size().yn().half()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView center() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().half()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView centerRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().xn(), size().yn().half()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView bottomLeft() | 
				
			||||
	{ | 
				
			||||
		return origin().add(Num.ZERO, size().yn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView bottomCenter() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().xn().half(), size().yn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView bottomRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().xn(), size().yn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public RectView centerTo(final Vect point) | 
				
			||||
	{ | 
				
			||||
		return new RectView() { | 
				
			||||
			 | 
				
			||||
			RectMathDynamic t = RectMathDynamic.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView size() | 
				
			||||
			{ | 
				
			||||
				return t.size(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public VectView origin() | 
				
			||||
			{ | 
				
			||||
				return point.view().sub(t.size().half()); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,189 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.num.NumVal; | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
import mightypork.utils.math.vect.VectVal; | 
				
			||||
import mightypork.utils.math.vect.VectView; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
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(origin().add(x, y), size()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public R shrink(double left, double right, double top, double bottom) | 
				
			||||
	{ | 
				
			||||
		return result(origin().add(left, top), size().sub(left + right, top + bottom)); | 
				
			||||
		 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public R grow(double left, double right, double top, double bottom) | 
				
			||||
	{ | 
				
			||||
		return result(origin().sub(left, top), size().add(left + right, top + bottom)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public R centerTo(final Vect point) | 
				
			||||
	{ | 
				
			||||
		final VectView s = size().view(); | 
				
			||||
		final VectView o = origin().view(); | 
				
			||||
		 | 
				
			||||
		return result(o.sub(s.half()), s); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public R round() | 
				
			||||
	{ | 
				
			||||
		final VectView s = size().view(); | 
				
			||||
		final VectView o = origin().view(); | 
				
			||||
		 | 
				
			||||
		return result(o.round(), s.round()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	protected abstract R result(Vect newOrigin, Vect newSize); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal x() | 
				
			||||
	{ | 
				
			||||
		return origin().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal y() | 
				
			||||
	{ | 
				
			||||
		return origin().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal width() | 
				
			||||
	{ | 
				
			||||
		return size().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal height() | 
				
			||||
	{ | 
				
			||||
		return size().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal left() | 
				
			||||
	{ | 
				
			||||
		return origin().xn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal right() | 
				
			||||
	{ | 
				
			||||
		return origin().xn().add(size().xn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal top() | 
				
			||||
	{ | 
				
			||||
		return origin().yn(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumVal bottom() | 
				
			||||
	{ | 
				
			||||
		return origin().yn().add(size().yn()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal topLeft() | 
				
			||||
	{ | 
				
			||||
		return origin(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal topCenter() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x() / 2, 0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal topRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x(), 0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal centerLeft() | 
				
			||||
	{ | 
				
			||||
		return origin().add(0, size().y() / 2); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal center() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().view().half()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal centerRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x(), size().y() / 2); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal bottomLeft() | 
				
			||||
	{ | 
				
			||||
		return origin().add(0, size().y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal bottomCenter() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().x() / 2, size().y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal bottomRight() | 
				
			||||
	{ | 
				
			||||
		return origin().add(size().view()); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,37 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.vect.VectView; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Immutable rect accessor | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
class RectProxy extends RectView { | 
				
			||||
	 | 
				
			||||
	private final Rect observed; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public RectProxy(Rect observed) { | 
				
			||||
		 | 
				
			||||
		assert (!(observed instanceof RectView)); | 
				
			||||
		 | 
				
			||||
		this.observed = observed; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView origin() | 
				
			||||
	{ | 
				
			||||
		return observed.origin().view(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView size() | 
				
			||||
	{ | 
				
			||||
		return observed.size().view(); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,224 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.annotations.FactoryMethod; | 
				
			||||
import mightypork.utils.math.num.Num; | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
import mightypork.utils.math.vect.VectVal; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Rectangle with constant bounds, that can never change. | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public class RectVal extends RectMathStatic<RectVal> { | 
				
			||||
	 | 
				
			||||
	@SuppressWarnings("hiding") | 
				
			||||
	public static final RectVal ZERO = Rect.ZERO.copy(); | 
				
			||||
	@SuppressWarnings("hiding") | 
				
			||||
	public static final RectVal ONE = Rect.ONE.copy(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get a proxy at given rect | 
				
			||||
	 *  | 
				
			||||
	 * @param observed observed rect | 
				
			||||
	 * @return view | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(Rect observed) | 
				
			||||
	{ | 
				
			||||
		return observed.copy(); // let the rect handle it
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at 0,0 with given size | 
				
			||||
	 *  | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(Num width, Num height) | 
				
			||||
	{ | 
				
			||||
		return make(0, 0, width.value(), height.value()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at 0,0 with given size | 
				
			||||
	 *  | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(double width, double height) | 
				
			||||
	{ | 
				
			||||
		return make(0, 0, width, height); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param origin | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(Vect origin, double width, double height) | 
				
			||||
	{ | 
				
			||||
		return make(origin, VectVal.make(width, height)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param origin | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(Vect origin, Num width, Num height) | 
				
			||||
	{ | 
				
			||||
		return make(origin, VectVal.make(width, height)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at 0,0 with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param size | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(Vect size) | 
				
			||||
	{ | 
				
			||||
		return make(Vect.ZERO, size); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param x | 
				
			||||
	 * @param y | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(double x, double y, double width, double height) | 
				
			||||
	{ | 
				
			||||
		return new RectVal(x, y, width, height); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param x | 
				
			||||
	 * @param y | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(Num x, Num y, Num width, Num height) | 
				
			||||
	{ | 
				
			||||
		return new RectVal(x.value(), y.value(), width.value(), height.value()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param origin | 
				
			||||
	 * @param size | 
				
			||||
	 * @return new mutable rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectVal make(Vect origin, Vect size) | 
				
			||||
	{ | 
				
			||||
		return make(origin.x(), origin.y(), size.x(), size.y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	private final VectVal pos; | 
				
			||||
	private final VectVal size; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param x | 
				
			||||
	 * @param y | 
				
			||||
	 * @param width | 
				
			||||
	 * @param height | 
				
			||||
	 */ | 
				
			||||
	RectVal(double x, double y, double width, double height) { | 
				
			||||
		this.pos = VectVal.make(x, y); | 
				
			||||
		this.size = VectVal.make(width, height); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param origin | 
				
			||||
	 * @param size | 
				
			||||
	 */ | 
				
			||||
	RectVal(Vect origin, Vect size) { | 
				
			||||
		this.pos = origin.copy(); | 
				
			||||
		this.size = size.copy(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create at given origin, with given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param another other coord | 
				
			||||
	 */ | 
				
			||||
	RectVal(Rect another) { | 
				
			||||
		this.pos = another.origin().copy(); | 
				
			||||
		this.size = another.size().copy(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @deprecated it's useless to copy a constant | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@Deprecated | 
				
			||||
	public RectVal copy() | 
				
			||||
	{ | 
				
			||||
		return this; // already constant
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal origin() | 
				
			||||
	{ | 
				
			||||
		return pos; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal size() | 
				
			||||
	{ | 
				
			||||
		return size; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	protected RectVal result(Vect newOrigin, Vect newSize) | 
				
			||||
	{ | 
				
			||||
		return make(newOrigin, newSize); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,37 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Rect made of two {@link VectView}s | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
class RectVectAdapter extends Rect { | 
				
			||||
	 | 
				
			||||
	private final Vect origin; | 
				
			||||
	private final Vect size; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public RectVectAdapter(Vect origin, Vect size) { | 
				
			||||
		this.origin = origin; | 
				
			||||
		this.size = size; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Vect origin() | 
				
			||||
	{ | 
				
			||||
		return origin; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public Vect size() | 
				
			||||
	{ | 
				
			||||
		return size; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,90 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.annotations.FactoryMethod; | 
				
			||||
import mightypork.utils.math.num.Num; | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
import mightypork.utils.math.vect.VectView; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Immutable rect | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public abstract class RectView extends RectMathDynamic { | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get a proxy at given rect | 
				
			||||
	 *  | 
				
			||||
	 * @param observed observed rect | 
				
			||||
	 * @return view | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectView make(Rect observed) | 
				
			||||
	{ | 
				
			||||
		return observed.view(); // let the rect handle it
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get a rect made of numeric constraints | 
				
			||||
	 *  | 
				
			||||
	 * @param width width | 
				
			||||
	 * @param height height | 
				
			||||
	 * @return view rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectView make(Num width, Num height) | 
				
			||||
	{ | 
				
			||||
		final Vect origin = Vect.ZERO; | 
				
			||||
		final Vect size = VectView.make(width, height); | 
				
			||||
		 | 
				
			||||
		return new VectViewRect(origin, size); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get a rect made of numeric constraints | 
				
			||||
	 *  | 
				
			||||
	 * @param x x coord | 
				
			||||
	 * @param y y coord | 
				
			||||
	 * @param width width | 
				
			||||
	 * @param height height | 
				
			||||
	 * @return view rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectView make(Num x, Num y, Num width, Num height) | 
				
			||||
	{ | 
				
			||||
		final Vect origin = VectView.make(x, y); | 
				
			||||
		final Vect size = VectView.make(width, height); | 
				
			||||
		 | 
				
			||||
		return new VectViewRect(origin, size); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get a rect made of two vect views | 
				
			||||
	 *  | 
				
			||||
	 * @param origin origin view | 
				
			||||
	 * @param size size view | 
				
			||||
	 * @return view rect | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static RectView make(final Vect origin, final Vect size) | 
				
			||||
	{ | 
				
			||||
		return new VectViewRect(origin, size); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @deprecated No point in taking view of a view | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@Deprecated | 
				
			||||
	public RectView view() | 
				
			||||
	{ | 
				
			||||
		return this; // wont change
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,38 +0,0 @@ | 
				
			||||
package mightypork.utils.math.rect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.vect.Vect; | 
				
			||||
import mightypork.utils.math.vect.VectView; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Rect made of two {@link VectView}s | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
class VectViewRect extends RectView { | 
				
			||||
	 | 
				
			||||
	private final VectView origin; | 
				
			||||
	private final VectView size; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public VectViewRect(Vect origin, Vect size) { | 
				
			||||
		this.origin = origin.view(); | 
				
			||||
		this.size = size.view(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView origin() | 
				
			||||
	{ | 
				
			||||
		return origin; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView size() | 
				
			||||
	{ | 
				
			||||
		return size; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,83 +0,0 @@ | 
				
			||||
package mightypork.utils.math.vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
abstract class AbstractVect implements Vect { | 
				
			||||
	 | 
				
			||||
	private VectView proxy; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public final int xi() | 
				
			||||
	{ | 
				
			||||
		return (int) Math.round(x()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public final int yi() | 
				
			||||
	{ | 
				
			||||
		return (int) Math.round(y()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public final int zi() | 
				
			||||
	{ | 
				
			||||
		return (int) Math.round(z()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public final VectView getVect() | 
				
			||||
	{ | 
				
			||||
		return view(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal copy() | 
				
			||||
	{ | 
				
			||||
		// must NOT call VectVal.make, it'd cause infinite recursion.
 | 
				
			||||
		return new VectVal(this); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectView view() | 
				
			||||
	{ | 
				
			||||
		if (proxy == null) proxy = new VectProxy(this); | 
				
			||||
		 | 
				
			||||
		return proxy; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public int hashCode() | 
				
			||||
	{ | 
				
			||||
		final int prime = 31; | 
				
			||||
		int result = 1; | 
				
			||||
		result = prime * result + Double.valueOf(x()).hashCode(); | 
				
			||||
		result = prime * result + Double.valueOf(y()).hashCode(); | 
				
			||||
		result = prime * result + Double.valueOf(z()).hashCode(); | 
				
			||||
		return result; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public boolean equals(Object obj) | 
				
			||||
	{ | 
				
			||||
		if (this == obj) return true; | 
				
			||||
		if (obj == null) return false; | 
				
			||||
		if (!(obj instanceof Vect)) return false; | 
				
			||||
		final Vect other = (Vect) obj; | 
				
			||||
		 | 
				
			||||
		return x() == other.x() && y() == other.y() && z() == other.z(); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public String toString() | 
				
			||||
	{ | 
				
			||||
		return String.format("(%.1f|%.1f|%.1f)", x(), y(), z()); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
									
										
											File diff suppressed because it is too large
											Load Diff
										
									
								
							
						@ -0,0 +1,228 @@ | 
				
			||||
package mightypork.utils.math.vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.num.Num; | 
				
			||||
import mightypork.utils.math.num.NumConst; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Coordinate with immutable numeric values.<br> | 
				
			||||
 * This coordinate is guaranteed to never change, as opposed to view. | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public final class VectConst extends Vect { | 
				
			||||
	 | 
				
			||||
	private final double x, y, z; | 
				
			||||
	// non-parametric operations are cached using lazy load.
 | 
				
			||||
	private NumConst v_size; | 
				
			||||
	private VectConst v_neg; | 
				
			||||
	private VectConst v_ceil; | 
				
			||||
	private VectConst v_floor; | 
				
			||||
	private VectConst v_round; | 
				
			||||
	private VectConst v_half; | 
				
			||||
	private VectConst v_abs; | 
				
			||||
	private NumConst v_xc; | 
				
			||||
	private NumConst v_yc; | 
				
			||||
	private NumConst v_zc; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	VectConst(Vect other) { | 
				
			||||
		this(other.x(), other.y(), other.z()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	VectConst(double x, double y, double z) { | 
				
			||||
		this.x = x; | 
				
			||||
		this.y = y; | 
				
			||||
		this.z = z; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public double x() | 
				
			||||
	{ | 
				
			||||
		return x; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public double y() | 
				
			||||
	{ | 
				
			||||
		return y; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public double z() | 
				
			||||
	{ | 
				
			||||
		return z; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return X constraint | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	public final NumConst xn() | 
				
			||||
	{ | 
				
			||||
		if (v_xc == null) v_xc = Num.make(this.x); | 
				
			||||
		 | 
				
			||||
		return v_xc; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return Y constraint | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	public final NumConst yn() | 
				
			||||
	{ | 
				
			||||
		if (v_yc == null) v_yc = Num.make(this.y); | 
				
			||||
		 | 
				
			||||
		return v_yc; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return Z constraint | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	public final NumConst zn() | 
				
			||||
	{ | 
				
			||||
		 | 
				
			||||
		if (v_zc == null) v_zc = Num.make(this.z); | 
				
			||||
		 | 
				
			||||
		return v_zc; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @deprecated it's useless to copy a constant | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@Deprecated | 
				
			||||
	public VectConst freeze() | 
				
			||||
	{ | 
				
			||||
		return this; // it's constant already
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst abs() | 
				
			||||
	{ | 
				
			||||
		if (v_abs != null) return v_abs; | 
				
			||||
		return v_abs = Vect.make(Math.abs(x()), Math.abs(y()), Math.abs(z())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst add(double x, double y) | 
				
			||||
	{ | 
				
			||||
		return add(x, y, 0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst add(double x, double y, double z) | 
				
			||||
	{ | 
				
			||||
		return Vect.make(x() + x, y() + y, z() + z); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst half() | 
				
			||||
	{ | 
				
			||||
		if (v_half != null) return v_half; | 
				
			||||
		return v_half = mul(0.5); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst mul(double d) | 
				
			||||
	{ | 
				
			||||
		return mul(d, d, d); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst mul(double x, double y) | 
				
			||||
	{ | 
				
			||||
		return mul(x, y, 1); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst mul(double x, double y, double z) | 
				
			||||
	{ | 
				
			||||
		return Vect.make(x() * x, y() * y, z() * z); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst round() | 
				
			||||
	{ | 
				
			||||
		if (v_round != null) return v_round; | 
				
			||||
		return v_round = Vect.make(Math.round(x()), Math.round(y()), Math.round(z())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst floor() | 
				
			||||
	{ | 
				
			||||
		if (v_floor != null) return v_floor; | 
				
			||||
		return v_floor = Vect.make(Math.floor(x()), Math.floor(y()), Math.floor(z())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst ceil() | 
				
			||||
	{ | 
				
			||||
		if (v_ceil != null) return v_ceil; | 
				
			||||
		return v_ceil = Vect.make(Math.ceil(x()), Math.ceil(y()), Math.ceil(z())); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst sub(double x, double y) | 
				
			||||
	{ | 
				
			||||
		return sub(x, y, 0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst sub(double x, double y, double z) | 
				
			||||
	{ | 
				
			||||
		return Vect.make(x() - x, y() - y, z() - z); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst neg() | 
				
			||||
	{ | 
				
			||||
		if (v_neg != null) return v_neg; | 
				
			||||
		return v_neg = Vect.make(-x(), -y(), -z()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectConst norm(double size) | 
				
			||||
	{ | 
				
			||||
		if (isZero()) return this; // can't norm zero vector
 | 
				
			||||
			 | 
				
			||||
		final double k = size().mul(1 / size).value(); | 
				
			||||
		 | 
				
			||||
		return mul(k); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public NumConst size() | 
				
			||||
	{ | 
				
			||||
		if (v_size != null) return v_size; | 
				
			||||
		 | 
				
			||||
		final double x = x(), y = y(), z = z(); | 
				
			||||
		return v_size = Num.make(Math.sqrt(x * x + y * y + z * z)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,422 +0,0 @@ | 
				
			||||
package mightypork.utils.math.vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.math.num.Num; | 
				
			||||
import mightypork.utils.math.num.NumVal; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Vec operations | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 * @param <V> return type of vector functions | 
				
			||||
 * @param <N> return type of numeric functions | 
				
			||||
 * @param <B> return type of boolean functions | 
				
			||||
 */ | 
				
			||||
abstract class VectMath<V extends Vect, N> extends AbstractVect { | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return X constraint | 
				
			||||
	 */ | 
				
			||||
	public abstract Num xn(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return Y constraint | 
				
			||||
	 */ | 
				
			||||
	public abstract Num yn(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @return Z constraint | 
				
			||||
	 */ | 
				
			||||
	public abstract Num zn(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Set X coordinate (if immutable, in a copy). | 
				
			||||
	 *  | 
				
			||||
	 * @param x x coordinate | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public VectView withX(double x) | 
				
			||||
	{ | 
				
			||||
		return withX(NumVal.make(x)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Set Y coordinate (if immutable, in a copy). | 
				
			||||
	 *  | 
				
			||||
	 * @param y y coordinate | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public VectView withY(double y) | 
				
			||||
	{ | 
				
			||||
		return withY(NumVal.make(y)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Set Z coordinate (if immutable, in a copy). | 
				
			||||
	 *  | 
				
			||||
	 * @param z z coordinate | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public VectView withZ(double z) | 
				
			||||
	{ | 
				
			||||
		return withZ(NumVal.make(z)); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public VectView withX(final Num x) | 
				
			||||
	{ | 
				
			||||
		return new VectView() { | 
				
			||||
			 | 
				
			||||
			final Vect t = VectMath.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double x() | 
				
			||||
			{ | 
				
			||||
				return x.value(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double y() | 
				
			||||
			{ | 
				
			||||
				return t.z(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double z() | 
				
			||||
			{ | 
				
			||||
				return t.z(); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public VectView withY(final Num y) | 
				
			||||
	{ | 
				
			||||
		return new VectView() { | 
				
			||||
			 | 
				
			||||
			final Vect t = VectMath.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double x() | 
				
			||||
			{ | 
				
			||||
				return t.x(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double y() | 
				
			||||
			{ | 
				
			||||
				return y.value(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double z() | 
				
			||||
			{ | 
				
			||||
				return t.z(); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public VectView withZ(final Num z) | 
				
			||||
	{ | 
				
			||||
		return new VectView() { | 
				
			||||
			 | 
				
			||||
			final Vect t = VectMath.this; | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double x() | 
				
			||||
			{ | 
				
			||||
				return t.x(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double y() | 
				
			||||
			{ | 
				
			||||
				return t.y(); | 
				
			||||
			} | 
				
			||||
			 | 
				
			||||
			 | 
				
			||||
			@Override | 
				
			||||
			public double z() | 
				
			||||
			{ | 
				
			||||
				return z.value(); | 
				
			||||
			} | 
				
			||||
		}; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get absolute value (positive) | 
				
			||||
	 *  | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V abs(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Add a vector. | 
				
			||||
	 *  | 
				
			||||
	 * @param vec offset | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V add(Vect vec); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Add to each component.<br> | 
				
			||||
	 * Z is unchanged. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x offset | 
				
			||||
	 * @param y y offset | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V add(double x, double y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Add to each component. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x offset | 
				
			||||
	 * @param y y offset | 
				
			||||
	 * @param z z offset | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V add(double x, double y, double z); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public abstract V add(Num x, Num y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public abstract V add(final Num x, final Num y, final Num z); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get copy divided by two | 
				
			||||
	 *  | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V half(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Multiply each component. | 
				
			||||
	 *  | 
				
			||||
	 * @param d multiplier | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V mul(double d); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Multiply each component. | 
				
			||||
	 *  | 
				
			||||
	 * @param vec vector of multipliers | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V mul(Vect vec); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Multiply each component.<br> | 
				
			||||
	 * Z is unchanged. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x multiplier | 
				
			||||
	 * @param y y multiplier | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V mul(double x, double y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Multiply each component. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x multiplier | 
				
			||||
	 * @param y y multiplier | 
				
			||||
	 * @param z z multiplier | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V mul(double x, double y, double z); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Multiply each component. | 
				
			||||
	 *  | 
				
			||||
	 * @param d multiplier | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V mul(final Num d); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Multiply each component. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x multiplier | 
				
			||||
	 * @param y y multiplier | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V mul(final Num x, final Num y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Multiply each component. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x multiplier | 
				
			||||
	 * @param y y multiplier | 
				
			||||
	 * @param z z multiplier | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V mul(final Num x, final Num y, final Num z); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Round coordinates. | 
				
			||||
	 *  | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V round(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Round coordinates down. | 
				
			||||
	 *  | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V floor(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Round coordinates up. | 
				
			||||
	 *  | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V ceil(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Subtract vector. | 
				
			||||
	 *  | 
				
			||||
	 * @param vec offset | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V sub(Vect vec); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Subtract a 2D vector.<br> | 
				
			||||
	 * Z is unchanged. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x offset | 
				
			||||
	 * @param y y offset | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V sub(double x, double y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Subtract a 3D vector. | 
				
			||||
	 *  | 
				
			||||
	 * @param x x offset | 
				
			||||
	 * @param y y offset | 
				
			||||
	 * @param z z offset | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V sub(double x, double y, double z); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public abstract V sub(Num x, Num y); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	public abstract V sub(final Num x, final Num y, final Num z); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Negate all coordinates (* -1) | 
				
			||||
	 *  | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V neg(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Scale vector to given size. | 
				
			||||
	 *  | 
				
			||||
	 * @param size size we need | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V norm(double size); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get distance to other point | 
				
			||||
	 *  | 
				
			||||
	 * @param point other point | 
				
			||||
	 * @return distance | 
				
			||||
	 */ | 
				
			||||
	public abstract N distTo(Vect point); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get middle of line to other point | 
				
			||||
	 *  | 
				
			||||
	 * @param point other point | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V midTo(Vect point); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Create vector from this point to other point | 
				
			||||
	 *  | 
				
			||||
	 * @param point second point | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V vectTo(Vect point); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get cross product (vector multiplication) | 
				
			||||
	 *  | 
				
			||||
	 * @param vec other vector | 
				
			||||
	 * @return result | 
				
			||||
	 */ | 
				
			||||
	public abstract V cross(Vect vec); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get dot product (scalar multiplication) | 
				
			||||
	 *  | 
				
			||||
	 * @param vec other vector | 
				
			||||
	 * @return dot product | 
				
			||||
	 */ | 
				
			||||
	public abstract N dot(Vect vec); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Get vector size | 
				
			||||
	 *  | 
				
			||||
	 * @return size | 
				
			||||
	 */ | 
				
			||||
	public abstract N size(); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public boolean isZero() | 
				
			||||
	{ | 
				
			||||
		return x() == 0 && y() == 0 && z() == 0; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,665 +0,0 @@ | 
				
			||||
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; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,280 +0,0 @@ | 
				
			||||
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 | 
				
			||||
 */ | 
				
			||||
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)); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -1,35 +0,0 @@ | 
				
			||||
package mightypork.utils.math.vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * View of another coordinate, immutable.<br> | 
				
			||||
 * GetVec() | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
class VectProxy extends VectAdapter { | 
				
			||||
	 | 
				
			||||
	final Vect observed; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Protected, in order to enforce the use of view() method on Vec, which | 
				
			||||
	 * uses caching. | 
				
			||||
	 *  | 
				
			||||
	 * @param observed | 
				
			||||
	 */ | 
				
			||||
	public VectProxy(Vect observed) { | 
				
			||||
		 | 
				
			||||
		assert (!(observed instanceof VectView)); | 
				
			||||
		 | 
				
			||||
		this.observed = observed; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	protected Vect getSource() | 
				
			||||
	{ | 
				
			||||
		return observed; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,145 +0,0 @@ | 
				
			||||
package mightypork.utils.math.vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.annotations.FactoryMethod; | 
				
			||||
import mightypork.utils.math.num.Num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Coordinate with immutable numeric values.<br> | 
				
			||||
 * This coordinate is guaranteed to never change, as opposed to view. | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public final class VectVal extends VectMathStatic<VectVal> { | 
				
			||||
	 | 
				
			||||
	@SuppressWarnings("hiding") | 
				
			||||
	public static final VectVal ZERO = new VectVal(0, 0, 0); | 
				
			||||
	@SuppressWarnings("hiding") | 
				
			||||
	public static final VectVal ONE = new VectVal(1, 1, 1); | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a constant vector | 
				
			||||
	 *  | 
				
			||||
	 * @param value source vector | 
				
			||||
	 * @return new constant vec | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectVal make(Vect value) | 
				
			||||
	{ | 
				
			||||
		return value.copy(); // let the vect handle it
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a constant vector | 
				
			||||
	 *  | 
				
			||||
	 * @param x X value | 
				
			||||
	 * @param y Y value | 
				
			||||
	 * @return new constant vec | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectVal make(double x, double y) | 
				
			||||
	{ | 
				
			||||
		return make(x, y, 0); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a constant vector | 
				
			||||
	 *  | 
				
			||||
	 * @param x X value | 
				
			||||
	 * @param y Y value | 
				
			||||
	 * @return new constant vec | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectVal make(Num x, Num y) | 
				
			||||
	{ | 
				
			||||
		return make(x, y, Num.ZERO); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a constant vector | 
				
			||||
	 *  | 
				
			||||
	 * @param x X value | 
				
			||||
	 * @param y Y value | 
				
			||||
	 * @param z Z value | 
				
			||||
	 * @return new constant vector | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectVal make(double x, double y, double z) | 
				
			||||
	{ | 
				
			||||
		return new VectVal(x, y, z); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a constant vector | 
				
			||||
	 *  | 
				
			||||
	 * @param x X value | 
				
			||||
	 * @param y Y value | 
				
			||||
	 * @param z Z value | 
				
			||||
	 * @return new constant vector | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectVal make(Num x, Num y, Num z) | 
				
			||||
	{ | 
				
			||||
		return new VectVal(x.value(), y.value(), z.value()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	private final double x, y, z; | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	VectVal(Vect other) { | 
				
			||||
		this(other.x(), other.y(), other.z()); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	VectVal(double x, double y, double z) { | 
				
			||||
		this.x = x; | 
				
			||||
		this.y = y; | 
				
			||||
		this.z = z; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public double x() | 
				
			||||
	{ | 
				
			||||
		return x; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public double y() | 
				
			||||
	{ | 
				
			||||
		return y; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public double z() | 
				
			||||
	{ | 
				
			||||
		return z; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @deprecated it's useless to copy a constant | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@Deprecated | 
				
			||||
	public VectVal copy() | 
				
			||||
	{ | 
				
			||||
		return this; // it's constant already
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	public VectVal result(double x, double y, double z) | 
				
			||||
	{ | 
				
			||||
		return new VectVal(x, y, z); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
@ -1,78 +0,0 @@ | 
				
			||||
package mightypork.utils.math.vect; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import mightypork.utils.annotations.DefaultImpl; | 
				
			||||
import mightypork.utils.annotations.FactoryMethod; | 
				
			||||
import mightypork.utils.math.num.Num; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Read-only immutable dynamic view of a coordinate. When the values change, | 
				
			||||
 * it'll be propagated in all derived coords.<br> | 
				
			||||
 * To take a static copy, use the copy() method. | 
				
			||||
 *  | 
				
			||||
 * @author MightyPork | 
				
			||||
 */ | 
				
			||||
public abstract class VectView extends VectMathDynamic { // returns constant value on edit
 | 
				
			||||
 | 
				
			||||
	/** | 
				
			||||
	 * Make a proxy view at a vector. | 
				
			||||
	 *  | 
				
			||||
	 * @param observed vector to observe | 
				
			||||
	 * @return view | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectView make(Vect observed) | 
				
			||||
	{ | 
				
			||||
		return observed.view(); // let the vect handle it
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a view at number constraints, reflecting their future changes. | 
				
			||||
	 *  | 
				
			||||
	 * @param xc X value | 
				
			||||
	 * @param yc Y value | 
				
			||||
	 * @return view at the values | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectView make(Num xc, Num yc) | 
				
			||||
	{ | 
				
			||||
		return new NumConstrVect(xc, yc); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * Make a view at number constraints, reflecting their future changes. | 
				
			||||
	 *  | 
				
			||||
	 * @param xc X value | 
				
			||||
	 * @param yc Y value | 
				
			||||
	 * @param zc Z value | 
				
			||||
	 * @return view at the values | 
				
			||||
	 */ | 
				
			||||
	@FactoryMethod | 
				
			||||
	public static VectView make(Num xc, Num yc, Num zc) | 
				
			||||
	{ | 
				
			||||
		return new NumConstrVect(xc, yc, zc); | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	@Override | 
				
			||||
	@DefaultImpl | 
				
			||||
	public double z() | 
				
			||||
	{ | 
				
			||||
		return 0; // implemented for ease with 2D anonymous subtypes
 | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
	 | 
				
			||||
	/** | 
				
			||||
	 * @deprectaed No point in taking view of a view. | 
				
			||||
	 */ | 
				
			||||
	@Override | 
				
			||||
	@Deprecated | 
				
			||||
	public VectView view() | 
				
			||||
	{ | 
				
			||||
		return this; | 
				
			||||
	} | 
				
			||||
	 | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue