User Manual, Developers Guide and API Documentation

TwoDimensional.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * This file is part of openWNS (open Wireless Network Simulator)
00003  * _____________________________________________________________________________
00004  *
00005  * Copyright (C) 2004-2007
00006  * Chair of Communication Networks (ComNets)
00007  * Kopernikusstr. 5, D-52074 Aachen, Germany
00008  * phone: ++49-241-80-27910,
00009  * fax: ++49-241-80-22242
00010  * email: info@openwns.org
00011  * www: http://www.openwns.org
00012  * _____________________________________________________________________________
00013  *
00014  * openWNS is free software; you can redistribute it and/or modify it under the
00015  * terms of the GNU Lesser General Public License version 2 as published by the
00016  * Free Software Foundation;
00017  *
00018  * openWNS is distributed in the hope that it will be useful, but WITHOUT ANY
00019  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
00020  * A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
00021  * details.
00022  *
00023  * You should have received a copy of the GNU Lesser General Public License
00024  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
00025  *
00026  ******************************************************************************/
00027 
00028 #include <RISE/antenna/pattern/kernel/TwoDimensional.hpp>
00029 
00030 #include <RISE/antenna/pattern/twodimensional/Isotropic.hpp>
00031 #include <RISE/antenna/pattern/twodimensional/OmniDirectional.hpp>
00032 #include <RISE/antenna/pattern/twodimensional/OmniDirectional7.hpp>
00033 #include <RISE/antenna/pattern/twodimensional/OmniDirectional9.hpp>
00034 #include <RISE/antenna/pattern/twodimensional/LambdaHalf.hpp>
00035 #include <RISE/antenna/pattern/twodimensional/Directed13.hpp>
00036 #include <RISE/antenna/pattern/twodimensional/Directed17.hpp>
00037 #include <RISE/antenna/pattern/twodimensional/Directed30.hpp>
00038 #include <RISE/antenna/pattern/twodimensional/Directed66.hpp>
00039 #include <RISE/antenna/pattern/twodimensional/Directed90.hpp>
00040 #include <RISE/antenna/pattern/twodimensional/Directed120.hpp>
00041 #include <RISE/antenna/pattern/twodimensional/WINNER70.hpp>
00042 
00043 using namespace rise::antenna::pattern::kernel;
00044 
00045 TwoDimensional::TwoDimensional()
00046     : Kernel(),
00047       pd_elevationAngleStep(0),
00048       pd_azimuthAngleStep(0),
00049       pd_elevationVector(Double64Vector()),
00050       pd_azimuthVector(Double64Vector())
00051 {}
00052 
00053 
00054 TwoDimensional::TwoDimensional(const std::string type,
00055                                  const std::string pattern)
00056     : Kernel(type, pattern),
00057       pd_elevationAngleStep(0),
00058       pd_azimuthAngleStep(0),
00059       pd_elevationVector(Double64Vector()),
00060       pd_azimuthVector(Double64Vector())
00061 {}
00062 
00063 Kernel* TwoDimensional::createPatternKernel(const std::string,
00064                                             const std::string pattern)
00065 {
00066     Kernel* pk = 0;
00067     if (pattern == (std::string)"Isotropic")
00068         pk = twodimensional::Isotropic::getInstance();
00069     else if (pattern == (std::string)"Omnidirectional")
00070         pk = twodimensional::OmniDirectional::getInstance();
00071     else if (pattern == (std::string)"Omnidirectional7")
00072         pk = twodimensional::OmniDirectional7::getInstance();
00073     else if (pattern == (std::string)"Omnidirectional9")
00074         pk = twodimensional::OmniDirectional9::getInstance();
00075     else if (pattern == (std::string)"Lambda_Half")
00076         pk = twodimensional::LambdaHalf::getInstance();
00077     else if (pattern == (std::string)"Directed_13")
00078         pk = twodimensional::Directed13::getInstance();
00079     else if (pattern == (std::string)"Directed_17")
00080         pk = twodimensional::Directed17::getInstance();
00081     else if (pattern == (std::string)"Directed_30")
00082         pk = twodimensional::Directed30::getInstance();
00083     else if (pattern == (std::string)"Directed_66")
00084         pk = twodimensional::Directed66::getInstance();
00085     else if (pattern == (std::string)"Directed_90")
00086         pk = twodimensional::Directed90::getInstance();
00087     else if (pattern == (std::string)"Directed_120")
00088         pk = twodimensional::Directed120::getInstance();
00089     else if (pattern == (std::string)"WINNER_70")
00090         pk = twodimensional::WINNER70::getInstance();
00091     else throw wns::Exception("TwoDimensional: The following antenna pattern is not supported Internal pattern: " + pattern);
00092 
00093     return pk;
00094 }
00095 
00096 void TwoDimensional::pd_startUp()
00097 {
00098     pd_elevationAngleStep = M_PI / pd_elevationVector.size();
00099     pd_azimuthAngleStep = 2 * M_PI / pd_azimuthVector.size();
00100 }
00101 
00102 wns::Ratio TwoDimensional::getGain(const wns::Direction& direction)
00103 {
00104     unsigned long int elevation_index = ((unsigned long int)(direction.getElevation()/pd_elevationAngleStep));
00105     elevation_index %= pd_elevationVector.size();
00106 
00107     unsigned long int azimuth_index = ((unsigned long int)(direction.getAzimuth()/pd_azimuthAngleStep));
00108     azimuth_index %= pd_azimuthVector.size();
00109 
00110     assure(pd_elevationVector.size() > elevation_index, "Elevation Range exception");
00111     assure(pd_azimuthVector.size() > azimuth_index, "Azimuth Range exception");
00112 
00113     return wns::Ratio::from_dB(pd_elevationVector[elevation_index] +
00114                                pd_azimuthVector[azimuth_index] +
00115                                pd_gain);
00116 }
00117 

Generated on Sat May 26 03:31:53 2012 for openWNS by  doxygen 1.5.5