double HyperbolicRoutingCalculator::getHyperbolicDistance(Map& map, Lsdb& lsdb, ndn::Name src, ndn::Name dest) { _LOG_TRACE("Calculating hyperbolic distance from " << src << " to " << dest); double distance = UNKNOWN_DISTANCE; ndn::Name srcLsaKey = src; srcLsaKey.append("coordinate"); CoordinateLsa* srcLsa = lsdb.findCoordinateLsa(srcLsaKey); ndn::Name destLsaKey = dest; destLsaKey.append("coordinate"); CoordinateLsa* destLsa = lsdb.findCoordinateLsa(destLsaKey); // Coordinate LSAs do not exist for these routers if (srcLsa == NULL || destLsa == NULL) { return UNKNOWN_DISTANCE; } double srcTheta = srcLsa->getCorTheta(); double destTheta = destLsa->getCorTheta(); double diffTheta = fabs(srcTheta - destTheta); if (diffTheta > MATH_PI) { diffTheta = 2 * MATH_PI - diffTheta; } double srcRadius = srcLsa->getCorRadius(); double destRadius = destLsa->getCorRadius(); if (srcRadius == UNKNOWN_RADIUS && destRadius == UNKNOWN_RADIUS) { return UNKNOWN_DISTANCE; } if (diffTheta == 0) { distance = fabs(srcRadius - destRadius); } else { distance = acosh((cosh(srcRadius) * cosh(destRadius)) - (sinh(srcRadius) * sinh(destRadius) * cos(diffTheta))); } _LOG_TRACE("Distance from " << src << " to " << dest << " is " << distance); return distance; }
bool CoordinateLsa::isEqualContent(const CoordinateLsa& clsa) { return (std::abs(m_corRad - clsa.getCorRadius()) < std::numeric_limits<double>::epsilon()) && (std::abs(m_corTheta - clsa.getCorTheta()) < std::numeric_limits<double>::epsilon()); }