001/* 002 * Trident - A Multithreaded Server Alternative 003 * Copyright 2014 The TridentSDK Team 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package net.tridentsdk.base; 018 019/** 020 * An axis-aligned, rectangular polygon in which entities reside 021 * 022 * @author The TridentSDK Team 023 * @since 0.4-alpha 024 */ 025public class BoundingBox implements Cloneable { 026 private double minX; 027 private double minY; 028 private double minZ; 029 private double maxX; 030 private double maxY; 031 private double maxZ; 032 033 public BoundingBox(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { 034 set(minX, minY, minZ, maxX, maxY, maxZ); 035 } 036 037 public BoundingBox set(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { 038 this.minX = minX; 039 this.minY = minY; 040 this.minZ = minZ; 041 this.maxX = maxX; 042 this.maxY = maxY; 043 this.maxZ = maxZ; 044 return this; 045 } 046 047 public BoundingBox add(double x, double y, double z) { 048 this.minX = this.minX() + x; 049 this.minY = this.minY() + y; 050 this.minZ = this.minZ() + z; 051 this.maxX = this.maxX() + x; 052 this.maxY = this.maxY() + y; 053 this.maxZ = this.maxZ() + z; 054 return this; 055 } 056 057 public BoundingBox grow(double x, double y, double z) { 058 return new BoundingBox(this.minX() - x, this.minY() - y, this.minZ() - z, this.maxX() + x, this.maxY() + y, this.maxZ() + z); 059 } 060 061 public BoundingBox shrink(double x, double y, double z) { 062 return new BoundingBox(this.minX() + x, this.minY() + y, this.minZ() + z, this.maxX() - x, this.maxY() - y, this.maxZ() - z); 063 } 064 065 public boolean collidesWith(BoundingBox box){ 066 return !(this.maxX() < box.minX() || this.minX() > box.maxX()) && !(this.maxY() < box.minY() || this.minY() > box.maxY()) && !(this.maxZ() < box.minZ() || this.minZ() > box.maxZ()); 067 } 068 069 public BoundingBox clone() { 070 return new BoundingBox(this.minX(), this.minY(), this.minZ(), this.maxX(), this.maxY(), this.maxZ()); 071 } 072 073 public String toString() { 074 return "BoundingBox{" + this.minX() + ", " + this.minY() + ", " + this.minZ() + " -> " + this.maxX() + ", " + this.maxY() + ", " + this.maxZ() + "}"; 075 } 076 077 public double minX() { 078 return minX; 079 } 080 081 public double minY() { 082 return minY; 083 } 084 085 public double minZ() { 086 return minZ; 087 } 088 089 public double maxX() { 090 return maxX; 091 } 092 093 public double maxY() { 094 return maxY; 095 } 096 097 public double maxZ() { 098 return maxZ; 099 } 100}