diff --git a/include/junction.h b/include/junction.h index 9ddbda41c10460f401aa57e8e7727ac557bc03dd..d7c7cc2a7de862a84b22cb7a0e9b3cf71fb15daa 100644 --- a/include/junction.h +++ b/include/junction.h @@ -39,6 +39,9 @@ class CJunction void link_roads_by_index(unsigned int incomming_road,unsigned int outgoing_road); void unlink_roads_by_index(unsigned int incomming_road,unsigned int outgoing_road); bool are_roads_linked_by_index(unsigned int incomming_road,unsigned int outgoing_road); + CRoadSegment *link_road_to_point(unsigned int incomming_road,TPoint &outgoing_point,unsigned int outgoing_num_lanes); + CRoadSegment *link_point_to_road(TPoint &incomming_point,unsigned int incomming_num_lanes,unsigned int outgoing_road); + CRoadSegment *link_point_to_point(TPoint &incomming_point,unsigned int incomming_num_lanes,TPoint &outgoing_point,unsigned int outgoing_num_lanes); void link_lanes_by_index(unsigned int incomming_road,unsigned int lane_in,unsigned int outgoing_road,unsigned int lane_out); void unlink_lanes_by_index(unsigned int incomming_road,unsigned int lane_in,unsigned int outgoing_road,unsigned int lane_out); bool are_lanes_linked_by_index(unsigned int incomming_road,unsigned int lane_in,unsigned int outgoing_road,unsigned int lane_out); diff --git a/src/junction.cpp b/src/junction.cpp index be2db05e9f48e2a5d3ff91ae4957ff932a3dd325..dff89aa2ff92ababc12de8d9e3b828997d200620 100644 --- a/src/junction.cpp +++ b/src/junction.cpp @@ -339,6 +339,81 @@ bool CJunction::are_roads_linked_by_id(unsigned int incomming_road,unsigned int return this->are_roads_linked_by_index(incomming_index,outgoing_index); } +CRoadSegment *CJunction::link_road_to_point(unsigned int incomming_road,TPoint &outgoing_point,unsigned int outgoing_num_lanes) +{ + CRoadSegment *new_segment,*in_last_segment; + TPoint start_point,end_point; + unsigned int incomming_index; + + incomming_index=CRoad::get_index_by_id(this->incomming_roads,incomming_road); + if(incomming_index<0 || incomming_index >= this->incomming_roads.size()) + throw CException(_HERE_,"Invalid incomming road index"); + /* connectivity not updated */ + /* create a new road segment */ + in_last_segment=this->incomming_roads[incomming_index]->get_last_segment(); + in_last_segment->get_end_point(start_point); + end_point=outgoing_point; + new_segment=new CRoadSegment(this->incomming_roads[incomming_index]->get_num_lanes(),outgoing_num_lanes); + new_segment->set_resolution(this->resolution); + new_segment->set_parent_junction(this); + new_segment->set_geometry(start_point,end_point); + in_last_segment->add_next_segment(new_segment); + new_segment->add_prev_segment(in_last_segment); + if(this->parent_roadmap!=NULL) + new_segment->id=this->parent_roadmap->get_next_segment_id(); + this->segments.push_back(new_segment); + + return new_segment; +} + +CRoadSegment *CJunction::link_point_to_road(TPoint &incomming_point,unsigned int incomming_num_lanes,unsigned int outgoing_road) +{ + CRoadSegment *new_segment,*out_first_segment; + TPoint start_point,end_point; + unsigned int outgoing_index; + + outgoing_index=CRoad::get_index_by_id(this->outgoing_roads,outgoing_road); + if(outgoing_index<0 || outgoing_index >= this->outgoing_roads.size()) + throw CException(_HERE_,"Invalid outgoing road index"); + /* connectivity not updated */ + /* create a new road segment */ + out_first_segment=this->outgoing_roads[outgoing_index]->get_first_segment(); + start_point=incomming_point; + out_first_segment->get_start_point(end_point); + new_segment=new CRoadSegment(incomming_num_lanes,this->outgoing_roads[outgoing_index]->get_num_lanes()); + new_segment->set_resolution(this->resolution); + new_segment->set_parent_junction(this); + new_segment->set_geometry(start_point,end_point); + new_segment->add_next_segment(out_first_segment); + out_first_segment->add_prev_segment(new_segment); + if(this->parent_roadmap!=NULL) + new_segment->id=this->parent_roadmap->get_next_segment_id(); + this->segments.push_back(new_segment); + + return new_segment; +} + +CRoadSegment *CJunction::link_point_to_point(TPoint &incomming_point,unsigned int incomming_num_lanes,TPoint &outgoing_point,unsigned int outgoing_num_lanes) +{ + CRoadSegment *new_segment; + TPoint start_point,end_point; + + /* connectivity not updated */ + /* create a new road segment */ + start_point=incomming_point; + end_point=outgoing_point; + new_segment=new CRoadSegment(incomming_num_lanes,outgoing_num_lanes); + new_segment->set_resolution(this->resolution); + new_segment->set_parent_junction(this); + new_segment->set_geometry(start_point,end_point); + if(this->parent_roadmap!=NULL) + new_segment->id=this->parent_roadmap->get_next_segment_id(); + this->segments.push_back(new_segment); + + return new_segment; +} + + void CJunction::link_lanes_by_index(unsigned int incomming_road,unsigned int lane_in,unsigned int outgoing_road,unsigned int lane_out) { CRoadSegment *segment;