![]() |
User Manual, Developers Guide and API Documentation |
![]() |
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
1.5.5