std::pair<ptrobot2D_test_world::point_type, bool> ptrobot2D_test_world::random_walk(const ptrobot2D_test_world::point_type& p_u) const {
  ptrobot2D_test_world::point_type p_rnd, p_v;
  unsigned int i = 0;
  do {
    p_rnd = m_rand_sampler(m_space);
    double dist = m_distance(p_u, p_rnd, m_space);
    p_v = move_position_toward(p_u, boost::uniform_01<global_rng_type&,double>(get_global_rng())() * max_edge_length / dist, p_rnd);
    ++i;
  } while((m_distance(p_u, p_v, m_space) < 1.0) && (i <= 10));
  if(i > 10) {
    //could not expand vertex u, then just generate a random C-free point.
    return std::make_pair(p_v, false);
  };
  return std::make_pair(p_v, true);
};
float min_distance(CvScalar center_values[], CvScalar s){
    float min = 100000;
    for (int i = 0; i < NCLUSTER; i++) {
        float temp = m_distance(s, center_values[i]);
        min = (temp < min)? temp:min;
    }
    return min;
}
void ptrobot2D_test_world::draw_edge(const ptrobot2D_test_world::point_type& p_u, const ptrobot2D_test_world::point_type& p_v, bool goal_path) const {
  double dist = m_distance(p_v, p_u, m_space);
  if(dist < 1.0)
    return;
  double d = 0.0;
  while(d <= dist) {
    ptrobot2D_test_world::point_type p = m_space.move_position_toward(p_u, (d / dist), p_v);
    if(p[0] < 0) p[0] = 0;
    if(p[1] < 0) p[1] = 0;
    if(p[0] >= pimpl->grid_width) p[0] = pimpl->grid_width-1;
    if(p[1] >= pimpl->grid_height) p[1] = pimpl->grid_height-1;
    pimpl->draw_pixel(p,goal_path);
    d += 1.0;
  };
};
ptrobot2D_test_world::point_type ptrobot2D_test_world::move_position_back_to(const ptrobot2D_test_world::point_type& p1, double fraction, const ptrobot2D_test_world::point_type& p2) const {
  double dist = m_distance(p1, p2, m_space);
  if(dist * fraction > max_edge_length)
    fraction = max_edge_length / dist;
  double d = 1.0;
  while(d < dist * fraction) {
    if (!pimpl->is_free(m_space.move_position_back_to(p1, (d / dist), p2))) {
      return m_space.move_position_back_to(p1,((d - 1.0) / dist), p2);
    };
    d += 1.0;
  };
  if(fraction == 1.0) //these equal comparison are used for when exact end fractions are used.
    return p1;
  else if(fraction == 0.0)
    return p2;
  else
    return m_space.move_position_back_to(p1, fraction, p2);
};
double ptrobot2D_test_world::bird_fly_to_start(const ptrobot2D_test_world::point_type& p_u) const {
  return m_distance(pimpl->start_pos, p_u, m_space);
};
double ptrobot2D_test_world::bird_fly_to_goal(const ptrobot2D_test_world::point_type& p_u) const {
  return m_distance(p_u, pimpl->goal_pos, m_space);
};
double ptrobot2D_test_world::norm(const ptrobot2D_test_world::point_difference_type& dp) const {
  return m_distance(dp, m_space);
};
double ptrobot2D_test_world::distance(const ptrobot2D_test_world::point_type& p1, const ptrobot2D_test_world::point_type& p2) const {
  if(m_distance(p2,move_position_toward(p1,1.0,p2), m_space) < std::numeric_limits< double >::epsilon())
    return m_distance(p1, p2, m_space); //if p2 is reachable from p1, use Euclidean distance.
  else
    return std::numeric_limits<double>::infinity(); //p2 is not reachable from p1.
};