/* --------------------------------------------------------- * * __________ D E L T A S C R I P T * * (_________() * * / === / - A fast, dynamic scripting language * * | == | - Version 4.13.11.0 * * / === / - Developed by Adam R. Nelson * * | = = | - 2011-2013 * * / === / - Distributed under GNU LGPL v3 * * (________() - http://github.com/ar-nelson/deltascript * * * * --------------------------------------------------------- */ package com.sector91.delta.script.objects.geom; import com.sector91.delta.script.DScriptContext; import com.sector91.delta.script.Operator; import com.sector91.delta.script.annotations.DSDynamicField; import com.sector91.delta.script.annotations.DSInaccessible; import com.sector91.delta.script.annotations.DSName; import com.sector91.delta.script.annotations.DSType; import com.sector91.delta.script.objects.DS_Object; import com.sector91.delta.script.objects.DS_Scalar; import com.sector91.delta.script.objects.DS_Vector; import com.sector91.geom.Box; import com.sector91.geom.DimensionMismatchException; import com.sector91.geom.Vector; import com.sector91.geom.algorithms.Algorithms; @DSType("Box") public abstract class DS_Box extends DS_AbstractShape implements Box { public static final String TYPE_NAME = "Box"; @DSInaccessible public DS_Box(DeltaScriptGeometry geom) {super(geom);} @DSName("solidDimensions") @DSDynamicField public final int solidDimensions() {return dimensions();} @DSName({"boundingBox", "bbox"}) @DSDynamicField public DS_Box boundingBox() {return this;} public abstract DS_Vector origin(); public abstract DS_Vector span(); @DSName("center") @DSDynamicField public DS_Vector center() {return origin().add(span().div(2));} @DSName("curved") @DSDynamicField public final boolean curved() {return false;} @DSName("contains") public boolean contains(Vector pt) { DimensionMismatchException.check("contains", this, pt); return Algorithms.testBoxContains(this, pt); } @DSName("contains") public boolean contains(Box box) { DimensionMismatchException.check("contains", this, box); return Algorithms.testBoxContains(this, box); } @DSName("convex") @DSDynamicField public final boolean convex() {return true;} @DSName("compound") @DSDynamicField public final boolean compound() {return false;} @DSName("clamp") public DS_Vector clamp(Vector vec) { DimensionMismatchException.check("clamp", this, vec); final DS_Vector min = origin(); final DS_Vector max = min.add(span()); final float[] result = new float[vec.dimensions()]; for (int i=0; i<result.length; i++) result[i] = Math.min(max.component(i), Math.max(min.component(i), vec.component(i))); return geom.vec(result); } @DSName("min") public float min(int dim) {return origin().component(dim);} @DSName("max") public float max(int dim) {return origin().add(span()).component(dim);} @DSName("diagonal") @DSDynamicField public DS_Line diagonal() {return geom.line(origin(), origin().add(span()));} @DSName("empty") @DSDynamicField public final boolean empty() {return false;} @Override public DS_Vector random() { final DS_Vector o = origin(), s = span(); final float[] result = new float[dimensions()]; for (int i=0; i<dimensions(); i++) result[i] = o.component(i) + (float)(Math.random()*s.component(i)); return geom.vec(result); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); final float[] span = span().floatArrayValue(); sb.append(span[0]); for (int i=1; i<span.length; i++) sb.append(" by " + span[i]); sb.append(" at "); sb.append(origin()); return standardToString(sb.toString()); } @Override public DS_Object operator(Operator op, DS_Object other) { if (op == Operator.RANGE_STEP && other instanceof DS_Scalar) { float[] arr1 = new float[dimensions()+1], arr2 = new float[dimensions()+1]; System.arraycopy(origin().toArray(),0, arr1, 0, dimensions()); System.arraycopy(span().toArray(), 0, arr2, 0, dimensions()); arr2[dimensions()] = ((DS_Scalar)other).floatValue(); final DeltaScriptGeometry geom = DScriptContext.getContextGeometry(); return geom.box(geom.vec(arr1), geom.vec(arr2)); } return super.operator(op, other); } }