Sirikata
|
00001 /* Sirikata 00002 * Geometry.hpp 00003 * 00004 * Copyright (c) 2010, Behram Mistree 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions are 00009 * met: 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in 00014 * the documentation and/or other materials provided with the 00015 * distribution. 00016 * * Neither the name of Sirikata nor the names of its contributors may 00017 * be used to endorse or promote products derived from this software 00018 * without specific prior written permission. 00019 * 00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 00021 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00022 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00023 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 00024 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00026 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 */ 00032 00033 #include <iostream> 00034 #include <iomanip> 00035 #include "Utility.hpp" 00036 #include <map> 00037 00038 #ifndef __CACHE_GEOMETRY_HPP__ 00039 #define __CACHE_GEOMETRY_HPP__ 00040 00041 namespace Sirikata 00042 { 00043 00044 struct Point 00045 { 00046 float x,y,z; 00047 void printPoint() const; 00048 Point(float a, float b,float c); 00049 Point(const Point& pt); 00050 Point(); 00051 }; 00052 00053 00054 struct WorldBoundary 00055 { 00056 Point bottomLeft, bottomRight, topLeft, topRight; 00057 }; 00058 00059 struct WorldDimensions 00060 { 00061 std::map<ServerID,Point*> mBidToPoint; 00062 WorldBoundary wb; 00063 int blocksWide, blocksTall; 00064 float blockSideLen; 00065 00066 BlockID getBlockNum(const Point& pt, bool secondTime=false, const Point* originalPoint = NULL) const; 00067 00068 bool inWorldX(float positionX) const; 00069 bool inWorldY(float positionY) const; 00070 Point randomPoint() const; 00071 Point* returnCenterOfBlock(BlockID bid); 00072 ServerID getCenterBlockID() const; 00073 const Point& getWraparoundPoint(const Point& pt); 00074 const Point& getWraparoundPoint(Point* pt); 00075 float getWidth() const; 00076 float getHeight() const; 00077 00078 Point returningPoint; 00079 00080 ~WorldDimensions(); //need to write this. 00081 }; 00082 00083 00084 float findDistance(Point* a,Point* b); 00085 float findDistance(const Point& a,Point* b); 00086 float findDistance(const Point& a,const Point& b); 00087 float findDistance(const Point& a,const Point& b, WorldDimensions* wd,bool secondTime =false); 00088 float findDistance(const Point& a,Point* b, WorldDimensions* wd,bool secondTime =false); 00089 00090 float findDistanceSquared(const Point& a,const Point& b, WorldDimensions* wd,bool secondTime =false); 00091 float findDistanceSquared(const Point& a,Point* b, WorldDimensions* wd,bool secondTime =false); 00092 float findDistanceSquared(Point* a,Point* b); 00093 float findDistanceSquared(const Point& a,Point* b); 00094 00095 const static float ONE_KM_IN_METERS = 1000; 00096 const static float FIVE_KM_IN_METERS = 5000; 00097 const static float TEN_KM_IN_METERS = 10000; 00098 const static float FIFTEEN_KM_IN_METERS = 15000; 00099 } 00100 00101 #endif