Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00023 #include <ProxNodeHandle.h>
00024
00025 #include <CoordinateSystem.h>
00026
00027
00028 uint8_t EuclideanNcsNodeInfo::dim;
00029
00030 Prox EuclideanNcsNodeInfo::getDistance(const AbstractNcsNodeInfo& abstractInfo) const
00031 {
00032 if (!dynamic_cast<const EuclideanNcsNodeInfo*>(&abstractInfo)) {
00033 return Prox::PROX_UNKNOWN;
00034 }
00035 const EuclideanNcsNodeInfo& info =
00036 *(static_cast<const EuclideanNcsNodeInfo*>(&abstractInfo));
00037
00038 double dist = 0.0;
00039
00040 for (uint8_t i = 0; i < info.getDimension(); ++i) {
00041 dist += pow(getCoords(i) - info.getCoords(i), 2);
00042 }
00043 dist = sqrt(dist);
00044
00045 return Prox(dist, 0.7);
00046 }
00047
00048 bool GnpNpsCoordsInfo::update(const AbstractNcsNodeInfo& abstractInfo)
00049 {
00050 if (!dynamic_cast<const GnpNpsCoordsInfo*>(&abstractInfo)) return false;
00051
00052 const GnpNpsCoordsInfo& temp =
00053 static_cast<const GnpNpsCoordsInfo&>(abstractInfo);
00054
00055 coordinates = temp.coordinates;
00056 npsLayer = temp.npsLayer;
00057
00058 return true;
00059 }
00060
00061 GnpNpsCoordsInfo::operator std::vector<double>() const
00062 {
00063 std::vector<double> temp;
00064 for (uint8_t i = 0; i < coordinates.size(); ++i) {
00065 temp.push_back(coordinates[i]);
00066 }
00067 temp.push_back(npsLayer);
00068
00069 return temp;
00070 }
00071
00072 std::ostream& operator<<(std::ostream& os, const GnpNpsCoordsInfo& info)
00073 {
00074 if (!info.getCoords().size()) throw cRuntimeError("dim = 0");
00075
00076 os << "< ";
00077 uint8_t i;
00078 for (i = 0; i < info.getCoords().size() - 1; ++i) {
00079 os << info.getCoords(i) << ", ";
00080 }
00081 os << info.getCoords(i) << " >";
00082 if (info.getLayer() != -1)
00083 os << ", NPS-Layer = " << (int)info.getLayer();
00084
00085 return os;
00086 }
00087
00088 Prox VivaldiCoordsInfo::getDistance(const AbstractNcsNodeInfo& abstractInfo) const
00089 {
00090 if (!dynamic_cast<const VivaldiCoordsInfo*>(&abstractInfo)) {
00091 return Prox::PROX_UNKNOWN;
00092 }
00093 const VivaldiCoordsInfo& info =
00094 *(static_cast<const VivaldiCoordsInfo*>(&abstractInfo));
00095
00096 double dist = 0.0, accuracy = 0.0;
00097
00098 for (uint8_t i = 0; i < info.getDimension(); ++i) {
00099 dist += pow(getCoords(i) - info.getCoords(i), 2);
00100 }
00101 dist = sqrt(dist);
00102
00103 accuracy = 1 - ((info.getError() + getError()) / 2);
00104 if (info.getError() >= 1.0 || getError() >= 1.0) accuracy = 0.0;
00105 if (accuracy < 0) accuracy = 0.0;
00106 if (accuracy > 1) accuracy = 1;
00107
00108 if (getHeightVector() != -1.0 && info.getHeightVector() != -1.0) {
00109 return Prox(dist + getHeightVector() + info.getHeightVector(),
00110 info.getError());
00111 }
00112 return Prox(dist, accuracy);
00113 }
00114
00115 bool VivaldiCoordsInfo::update(const AbstractNcsNodeInfo& info)
00116 {
00117 if (!dynamic_cast<const VivaldiCoordsInfo*>(&info)) return false;
00118
00119 const VivaldiCoordsInfo& temp = static_cast<const VivaldiCoordsInfo&>(info);
00120 if (coordErr > temp.coordErr) {
00121 coordErr = temp.coordErr;
00122 coordinates = temp.coordinates;
00123 heightVector = temp.heightVector;
00124
00125 return true;
00126 }
00127 return false;
00128 }
00129
00130 VivaldiCoordsInfo::operator std::vector<double>() const
00131 {
00132 std::vector<double> temp;
00133 for (uint8_t i = 0; i < coordinates.size(); ++i) {
00134 temp.push_back(coordinates[i]);
00135 }
00136 temp.push_back(coordErr);
00137 if (heightVector >= 0) temp.push_back(heightVector);
00138
00139 return temp;
00140 }
00141
00142 std::ostream& operator<<(std::ostream& os, const VivaldiCoordsInfo& info)
00143 {
00144 if (!info.getCoords().size()) throw cRuntimeError("dim = 0");
00145
00146 os << "< ";
00147 uint8_t i;
00148 for (i = 0; i < info.getCoords().size() - 1; ++i) {
00149 os << info.getCoords(i) << ", ";
00150 }
00151 os << info.getCoords(i) << " >";
00152 os << ", Err = " << info.getError();
00153 if (info.getHeightVector() != -1.0)
00154 os << ", HeightVec = " << info.getHeightVector();
00155
00156 return os;
00157 }
00158
00159
00160 Prox SimpleCoordsInfo::getDistance(const AbstractNcsNodeInfo& abstractInfo) const
00161 {
00162 const SimpleCoordsInfo& temp =
00163 dynamic_cast<const SimpleCoordsInfo&>(abstractInfo);
00164
00165 return Prox(2 * (accessDelay +
00166 temp.getAccessDelay() +
00167 EuclideanNcsNodeInfo::getDistance(abstractInfo)));
00168 }
00169
00170
00171 bool SimpleCoordsInfo::update(const AbstractNcsNodeInfo& abstractInfo)
00172 {
00173 if (!dynamic_cast<const SimpleCoordsInfo*>(&abstractInfo)) return false;
00174
00175 const SimpleCoordsInfo& temp =
00176 static_cast<const SimpleCoordsInfo&>(abstractInfo);
00177
00178 coordinates = temp.coordinates;
00179
00180 return true;
00181 }
00182
00183
00184 SimpleCoordsInfo::operator std::vector<double>() const
00185 {
00186 std::vector<double> temp;
00187 for (uint8_t i = 0; i < coordinates.size(); ++i) {
00188 temp.push_back(coordinates[i]);
00189 }
00190 temp.push_back(SIMTIME_DBL(accessDelay));
00191
00192 return temp;
00193 }