/* * Copyright (C) 2011-2015, Peter Abeles. All Rights Reserved. * * This file is part of Geometric Regression Library (GeoRegression). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package georegression.metric; import georegression.struct.point.Point3D_I32; import georegression.struct.shapes.Box3D_I32; /** * @author Peter Abeles */ public class Intersection3D_I32 { /** * Returns true if the point is contained inside the box. The point is considered to be inside the box * if the following test passes for each dimension. box.p0.x ≤ point.x {@code <} box.p1.x + box.lengthX * * @param box Box * @param point Point which is tested to see if it is inside the box * @return true for inside and false for not */ public static boolean contained( Box3D_I32 box , Point3D_I32 point ) { return( box.p0.x <= point.x && point.x < box.p1.x && box.p0.y <= point.y && point.y < box.p1.y && box.p0.z <= point.z && point.z < box.p1.z ); } /** * Returns true if boxB is contained inside of or is identical to boxA. * * @param boxA Box * @param boxB Box which is being tested to see if it is inside of boxA * @return true if inside/identical or false if outside */ public static boolean contained( Box3D_I32 boxA , Box3D_I32 boxB ) { return( boxA.p0.x <= boxB.p0.x && boxA.p1.x >= boxB.p1.x && boxA.p0.y <= boxB.p0.y && boxA.p1.y >= boxB.p1.y && boxA.p0.z <= boxB.p0.z && boxA.p1.z >= boxB.p1.z ); } /** * Returns true if the two boxes intersect each other. p0 is inclusive and p1 is exclusive. * So if the p0 edge and p1 edge overlap perfectly there is no intersection. * * @param boxA Box * @param boxB Box * @return true for intersection and false if no intersection */ public static boolean intersect( Box3D_I32 boxA , Box3D_I32 boxB ) { return( intersect(boxA.p0.x , boxB.p0.x , boxA.p1.x , boxB.p1.x ) && intersect(boxA.p0.y , boxB.p0.y , boxA.p1.y , boxB.p1.y ) && intersect(boxA.p0.z , boxB.p0.z , boxA.p1.z , boxB.p1.z ) ); } protected static boolean intersect( int a0 , int b0 , int a1, int b1 ) { if( a0 <= b0 ) { return b0 < a1; } else { return a0 < b1; } } }