package edu.stanford.rsl.conrad.geometry.bounds; import edu.stanford.rsl.conrad.geometry.shapes.simple.Plane3D; import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND; import edu.stanford.rsl.conrad.numerics.SimpleOperators; import edu.stanford.rsl.conrad.numerics.SimpleVector; import edu.stanford.rsl.conrad.utils.CONRAD; /** * This class describes the bounds defined by a {@link PointND}. This class is useful when a plane describes the extremum of an arbitrary shape. * @author Rotimi X Ojo * @author Akm */ public class HalfSpaceBoundingCondition extends AbstractBoundingCondition { private static final long serialVersionUID = -1161793937985226484L; protected Plane3D plane; private boolean isFlipped = false; /** * Initialize new HalfSpace Bounding Condition with a plane. * @param plane is plane describing the extremum of an arbitrary shape. */ public HalfSpaceBoundingCondition(Plane3D plane){ this.plane = plane; } /** * Initialize new HalfSpace Bounding Condition with a plane defined by two points. * @param one is first point on plane describing the extremum of an arbitrary shape. * @param two is second point on plane describing the extremum of an arbitrary shape. */ public HalfSpaceBoundingCondition(PointND one, PointND two){ this.plane = new Plane3D(one, SimpleOperators.subtract(two.getAbstractVector(), one.getAbstractVector()), new SimpleVector(0, 0, 1)); } public HalfSpaceBoundingCondition(HalfSpaceBoundingCondition hsbc){ super(hsbc); plane = (hsbc.plane!=null) ? new Plane3D(hsbc.plane) : null; isFlipped = hsbc.isFlipped; } @Override public boolean isSatisfiedBy(PointND point) { boolean val = (plane.computeDistance(point) > -CONRAD.FLOAT_EPSILON); if(isFlipped){ return val == true? false: true; } return val; } @Override public Plane3D getBoundingSurface() { return plane; } @Override public void flipCondition() { isFlipped = isFlipped==true ? false:true; } @Override public AbstractBoundingCondition clone() { return new HalfSpaceBoundingCondition(this); } } /* * Copyright (C) 2010 - Rotimi X Ojo, Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */