void Link_Bearings (Link_Data &link_rec, int &bearing_in, int &bearing_out) { int xa, ya, xb, yb; double dx, dy; Node_Data *node_ptr; node_ptr = &dat->node_array [link_rec.Anode ()]; xa = node_ptr->X (); ya = node_ptr->Y (); node_ptr = &dat->node_array [link_rec.Bnode ()]; xb = node_ptr->X (); yb = node_ptr->Y (); dx = dy = 0; if (link_rec.Shape () >= 0 && (dat->Bearing_Offset () + MAX (link_rec.Aoffset (), link_rec.Boffset ())) < link_rec.Length ()) { int i, num, offset, len1, len2, xy_len, x1, y1; XYZ *point; Shape_Data *shape_ptr; shape_ptr = &dat->shape_array [link_rec.Shape ()]; num = (int) shape_ptr->size (); //---- from the A node --- offset = dat->Bearing_Offset () + link_rec.Aoffset (); len1 = xy_len = 0; x1 = xa; y1 = ya; for (i=0; i < num; i++) { point = &((*shape_ptr) [i]); dx = point->x - x1; dy = point->y - y1; xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5); len2 = len1 + xy_len; if (len2 > offset) break; len1 = len2; x1 = point->x; y1 = point->y; } if (i == num) { dx = xb - x1; dy = yb - y1; xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5); len2 = len1 + xy_len; } offset -= len1; if (xy_len == 0) xy_len = 1; dx = x1 + (dx * offset / xy_len) - xa; dy = y1 + (dy * offset / xy_len) - ya; bearing_in = dat->compass.Direction (dx, dy); //---- from the B node ---- offset = dat->Bearing_Offset () + link_rec.Boffset (); len1 = xy_len = 0; x1 = xb; y1 = yb; for (i=num-1; i >= 0; i--) { point = &((*shape_ptr) [i]); dx = point->x - x1; dy = point->y - y1; xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5); len2 = len1 + xy_len; if (len2 > offset) break; len1 = len2; x1 = point->x; y1 = point->y; } if (i < 0) { dx = xa - x1; dy = ya - y1; xy_len = (int) (sqrt (dx * dx + dy * dy) + 0.5); len2 = len1 + xy_len; } offset -= len1; if (xy_len == 0) xy_len = 1; dx = x1 + (dx * offset / xy_len) - xb; dy = y1 + (dy * offset / xy_len) - yb; bearing_out = dat->compass.Direction (-dx, -dy); } else { dx = xb - xa; dy = yb - ya; bearing_in = bearing_out = dat->compass.Direction (dx, dy); } }
bool Relocate::Get_Link_Data (Link_File &file, Link_Data &link_rec, Dir_Data &ab_rec, Dir_Data &ba_rec) { if (!Data_Service::Get_Link_Data (file, link_rec, ab_rec, ba_rec)) return (false); if (target_flag) { link_rec.Divided (2); ab_rec.Sign (2); ba_rec.Sign (2); Int_Map_Itr map_itr = link_map.find (link_rec.Link ()); if (map_itr != link_map.end ()) { Dir_Data *dir_ptr; Link_Data *link_ptr = &link_array [map_itr->second]; if (link_ptr->Anode () == link_rec.Anode () && link_ptr->Bnode () == link_rec.Bnode ()) { link_ptr->Divided (1); if (shape_flag) { Int_Map_Itr map_itr = target_shape_map.find (link_rec.Link ()); if (map_itr != target_shape_map.end ()) { link_ptr->Shape (map_itr->second); } } if (link_ptr->AB_Dir () >= 0) { dir_ptr = &dir_array [link_ptr->AB_Dir ()]; dir_ptr->Sign (1); } if (link_ptr->BA_Dir () >= 0) { dir_ptr = &dir_array [link_ptr->BA_Dir ()]; dir_ptr->Sign (1); } return (false); } else if (link_ptr->Anode () == link_rec.Anode () || link_ptr->Bnode () == link_rec.Bnode ()) { link_ptr->Divided (3); if (shape_flag) { Int_Map_Itr map_itr = target_shape_map.find (link_rec.Link ()); if (map_itr != target_shape_map.end ()) { link_ptr->Shape (map_itr->second); } } } if (link_rec.AB_Dir () >= 0) { link_rec.AB_Dir ((int) dir_array.size ()); target_dir_map.insert (Int_Map_Data (ab_rec.Link_Dir (), link_rec.AB_Dir ())); dir_array.push_back (ab_rec); } if (link_rec.BA_Dir () >= 0) { link_rec.BA_Dir ((int) dir_array.size ()); target_dir_map.insert (Int_Map_Data (ba_rec.Link_Dir (), link_rec.BA_Dir ())); dir_array.push_back (ba_rec); } target_link_map.insert (Int_Map_Data (link_rec.Link (), (int) link_array.size ())); link_array.push_back (link_rec); return (false); } } else { link_rec.Divided (0); ab_rec.Sign (0); ba_rec.Sign (0); } return (true); }
int Data_Service::Put_Link_Data (Link_File &file, Link_Data &data) { if (file.Model_Format () == TPPLUS) { int a, b, count; double length; Dir_Data *dir_ptr; if (data.Length () == 0) return (0); count = 0; a = data.Anode (); b = data.Bnode (); length = UnRound (data.Length ()); if (System_Data_Flag (NODE)) { a = node_array [a].Node (); b = node_array [b].Node (); } if (data.AB_Dir () >= 0) { file.Node_A (a); file.Node_B (b); file.Length (length); file.Type (data.Type ()); dir_ptr = &dir_array [data.AB_Dir ()]; file.Lanes_AB (dir_ptr->Lanes ()); file.Speed_AB (UnRound (dir_ptr->Speed ())); file.Cap_AB (dir_ptr->Capacity ()); if (file.Dbase_Format () == ARCVIEW) { Link_Shape (&data, 0, *((Arc_Link_File *) &file)); } if (!file.Write_Record ()) { Error (String ("Writing %s") % file.File_Type ()); } count++; } if (data.BA_Dir () >= 0) { file.Node_A (b); file.Node_B (a); file.Length (length); file.Type (data.Type ()); dir_ptr = &dir_array [data.BA_Dir ()]; file.Lanes_AB (dir_ptr->Lanes ()); file.Speed_AB (UnRound (dir_ptr->Speed ())); file.Cap_AB (dir_ptr->Capacity ()); if (file.Dbase_Format () == ARCVIEW) { Link_Shape (&data, 1, *((Arc_Link_File *) &file)); } if (!file.Write_Record ()) { Error (String ("Writing %s") % file.File_Type ()); } count++; } return (count); } Dir_Data *dir_ptr; if (data.Length () == 0) return (0); file.Link (data.Link ()); file.Name (data.Name ()); file.Node_A (node_array [data.Anode ()].Node ()); file.Node_B (node_array [data.Bnode ()].Node ()); file.Length (UnRound (data.Length ())); file.Setback_A (UnRound (data.Aoffset ())); file.Setback_B (UnRound (data.Boffset ())); file.Type (data.Type ()); file.Divided (data.Divided ()); file.Area_Type (data.Area_Type ()); file.Use (data.Use ()); file.Grade (UnRound (data.Grade ())); file.Notes (data.Notes ()); if (data.AB_Dir () >= 0) { dir_ptr = &dir_array [data.AB_Dir ()]; file.Lanes_AB (dir_ptr->Lanes ()); file.Speed_AB (UnRound (dir_ptr->Speed ())); if (dir_ptr->Time0 () > 0) { file.Fspd_AB ((double) data.Length () / dir_ptr->Time0 ()); } else { file.Fspd_AB (UnRound (dir_ptr->Speed ())); } if (file.Fspd_AB () > file.Speed_AB () && file.Speed_AB () > 0) { if ((file.Fspd_AB () - file.Speed_AB ()) > 0.5) { if (Metric_Flag ()) { Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_AB (), MPH) % External_Units (file.Speed_AB (), MPH)); } else { Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_AB (), MPH) % External_Units (file.Speed_AB (), MPH)); } } file.Fspd_AB (file.Speed_AB ()); } file.Cap_AB (dir_ptr->Capacity ()); file.Bearing_A (dir_ptr->In_Bearing ()); file.Bearing_B (dir_ptr->Out_Bearing ()); } else { file.Lanes_AB (0); file.Speed_AB (0); file.Fspd_AB (0); file.Cap_AB (0); } if (data.BA_Dir () >= 0) { dir_ptr = &dir_array [data.BA_Dir ()]; file.Lanes_BA (dir_ptr->Lanes ()); file.Speed_BA (UnRound (dir_ptr->Speed ())); if (dir_ptr->Time0 () > 0) { file.Fspd_BA ((double) data.Length () / dir_ptr->Time0 ()); } else { file.Fspd_BA (UnRound (dir_ptr->Speed ())); } if (file.Fspd_BA () > file.Speed_BA () && file.Speed_BA () > 0) { if ((file.Fspd_BA () - file.Speed_BA ()) > 0.5) { if (Metric_Flag ()) { Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_BA (), MPH) % External_Units (file.Speed_BA (), MPH)); } else { Warning (String ("Link %d Free Flow Speed %.1lf > Maximum Speed %.1lf") % data.Link () % External_Units (file.Fspd_BA (), MPH) % External_Units (file.Speed_BA (), MPH)); } } file.Fspd_BA (file.Speed_BA ()); } file.Cap_BA (dir_ptr->Capacity ()); if (data.AB_Dir () < 0) { file.Bearing_B (compass.Flip (dir_ptr->In_Bearing ())); file.Bearing_A (compass.Flip (dir_ptr->Out_Bearing ())); } } else { file.Lanes_BA (0); file.Speed_BA (0); file.Fspd_BA (0); file.Cap_BA (0); } if (file.Dbase_Format () == ARCVIEW) { Link_Shape (&data, 0, *((Arc_Link_File *) &file)); } if (!file.Write_Record ()) { Error (String ("Writing %s") % file.File_Type ()); } return (1); }