wxBoundingBox Route::GetBBox( void ) { if(!m_bNeedsUpdateBBox) return RBBox; double bbox_xmin = 180.; // set defaults double bbox_ymin = 90.; double bbox_xmax = -180; double bbox_ymax = -90.; RBBox.Reset(); // TODO: incorrect logic. It fails if a route crosses the idl and prime meridan. m_bcrosses_idl = CalculateCrossesIDL(); wxRoutePointListNode *node = pRoutePointList->GetFirst(); RoutePoint *data; if( !m_bcrosses_idl ) { while( node ) { data = node->GetData(); if( data->m_lon > bbox_xmax ) bbox_xmax = data->m_lon; if( data->m_lon < bbox_xmin ) bbox_xmin = data->m_lon; if( data->m_lat > bbox_ymax ) bbox_ymax = data->m_lat; if( data->m_lat < bbox_ymin ) bbox_ymin = data->m_lat; node = node->GetNext(); } } else { // For Routes that cross the IDL, we compute and store // the bbox as positive definite while( node ) { data = node->GetData(); double lon = data->m_lon; if( lon < 0. ) lon += 360.; if( lon > bbox_xmax ) bbox_xmax = lon; if( lon < bbox_xmin ) bbox_xmin = lon; if( data->m_lat > bbox_ymax ) bbox_ymax = data->m_lat; if( data->m_lat < bbox_ymin ) bbox_ymin = data->m_lat; node = node->GetNext(); } } RBBox.Expand( bbox_xmin, bbox_ymin ); RBBox.Expand( bbox_xmax, bbox_ymax ); m_bNeedsUpdateBBox = false; return RBBox; }
void Route::CalculateBBox() { double bbox_xmin = 180.; // set defaults double bbox_ymin = 90.; double bbox_xmax = -180; double bbox_ymax = -90.; RBBox.Reset(); m_bcrosses_idl = CalculateCrossesIDL(); wxRoutePointListNode *node = pRoutePointList->GetFirst(); RoutePoint *data; if( !m_bcrosses_idl ) { while( node ) { data = node->GetData(); if( data->m_lon > bbox_xmax ) bbox_xmax = data->m_lon; if( data->m_lon < bbox_xmin ) bbox_xmin = data->m_lon; if( data->m_lat > bbox_ymax ) bbox_ymax = data->m_lat; if( data->m_lat < bbox_ymin ) bbox_ymin = data->m_lat; node = node->GetNext(); } } else { // For Routes that cross the IDL, we compute and store // the bbox as positive definite while( node ) { data = node->GetData(); double lon = data->m_lon; if( lon < 0. ) lon += 360.; if( lon > bbox_xmax ) bbox_xmax = lon; if( lon < bbox_xmin ) bbox_xmin = lon; if( data->m_lat > bbox_ymax ) bbox_ymax = data->m_lat; if( data->m_lat < bbox_ymin ) bbox_ymin = data->m_lat; node = node->GetNext(); } } RBBox.Expand( bbox_xmin, bbox_ymin ); RBBox.Expand( bbox_xmax, bbox_ymax ); }