Sirikata
space/src/caches/Geometry.hpp
Go to the documentation of this file.
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