// lane.cc for traffic simulation #include "vehicle.h" #include "lane.h" lane::lane(float Aposition_x, float Aposition_y, float Aspeed_limit, direction Amoving, float Alength) { id = unique_id(); position_x = Aposition_x; position_y = Aposition_y; speed_limit = Aspeed_limit; moving = Amoving; length = Alength; vehicle_list = 0; } void lane::operate(void) { vehicle *a_vehicle = vehicle_list; while( a_vehicle != 0 ) { a_vehicle->move(); a_vehicle = a_vehicle->next(); // walk down list } } void lane::vehicle_start( float Alength, float Aweight, float Aaccel, float Adecell) { vehicle_list = new vehicle( Alength, Aweight, Aaccel, Adecell, 0.0, 0.0, speed_limit, position_x, position_y, moving, length, signal, vehicle_list); vehicle_list->set_signal( signal ); } bool lane::vehicle_exiting( void ) { vehicle *a_vehicle; if( this == 0 ) { return false; } a_vehicle = vehicle_list; while( a_vehicle != 0) { if(a_vehicle->next() == 0) break; a_vehicle = a_vehicle->next(); } return a_vehicle->exiting(); } vehicle * lane::vehicle_remove( void ) { vehicle *a_vehicle = vehicle_list; vehicle *p_vehicle = 0; while( a_vehicle != 0 ) { if(a_vehicle->next() == 0) break; p_vehicle = a_vehicle; a_vehicle = a_vehicle->next(); } if( p_vehicle != 0) // unlink last vehicle { p_vehicle->new_next(0); } else { vehicle_list = 0; // remove last vehicle from list } return a_vehicle; } void lane::vehicle_add( vehicle *a_vehicle ) { a_vehicle->new_next(vehicle_list); a_vehicle->set_new_lane_data(speed_limit, position_x, position_y, moving, length, signal); vehicle_list = a_vehicle; } void lane::lane_end( float & x_lane_end, float & y_lane_end) { float x_offset; float y_offset; get_offsets(moving, x_offset, y_offset); x_lane_end = position_x+x_offset*length/my_scale; y_lane_end = position_y+y_offset*length/my_scale; } void lane::set_signal(signal_state Asignal) { vehicle * a_vehicle = vehicle_list; signal = Asignal; while( a_vehicle != 0 ) { a_vehicle-> set_signal(Asignal); a_vehicle = a_vehicle->next(); } } void lane::draw(void) { float x_offset; float y_offset; get_offsets(moving, x_offset, y_offset); DRAW_LINE((position_x-0.5), (position_y+0.25), (position_x-0.5)+x_offset*length/my_scale, (position_y+0.25)+y_offset*length/my_scale); } // end lane.cc