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); } }
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); }