Exemplo n.º 1
0
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());
}
Exemplo n.º 2
0
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;
}