SUMOReal GUIEdge::getBruttoOccupancy() const { SUMOReal occ = 0; for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { occ += segment->getBruttoOccupancy(); } return occ / (*myLanes)[0]->getLength() / (SUMOReal)(myLanes->size()); }
void GUIEdge::drawMesoVehicles(const GUIVisualizationSettings& s) const { const GUIVisualizationTextSettings& nameSettings = s.vehicleName; const SUMOReal exaggeration = s.vehicleSize.getExaggeration(s); GUIMEVehicleControl* vehicleControl = GUINet::getGUIInstance()->getGUIMEVehicleControl(); if (vehicleControl != 0) { // draw the meso vehicles vehicleControl->secureVehicles(); size_t laneIndex = 0; MESegment::Queue queue; for (std::vector<MSLane*>::const_iterator msl = myLanes->begin(); msl != myLanes->end(); ++msl, ++laneIndex) { GUILane* l = static_cast<GUILane*>(*msl); // go through the vehicles SUMOReal segmentOffset = 0; // offset at start of current segment for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*this); segment != 0; segment = segment->getNextSegment()) { const SUMOReal length = segment->getLength() * segment->getLengthGeometryFactor(); if (laneIndex < segment->numQueues()) { // make a copy so we don't have to worry about synchronization queue = segment->getQueue(laneIndex); const SUMOReal avgCarSize = segment->getBruttoOccupancy() / segment->getCarNumber(); const SUMOReal avgCarHalfSize = 0.5 * avgCarSize; const size_t queueSize = queue.size(); SUMOReal vehiclePosition = segmentOffset + length; // draw vehicles beginning with the leader at the end of the segment SUMOReal xOff = 0; for (size_t i = 0; i < queueSize; ++i) { MSBaseVehicle* veh = queue[queueSize - i - 1]; const SUMOReal vehLength = veh->getVehicleType().getLengthWithGap(); setVehicleColor(s, veh); while (vehiclePosition < segmentOffset) { // if there is only a single queue for a // multi-lane edge shift vehicles and start // drawing again from the end of the segment vehiclePosition += length; xOff += 2; } const Position p = l->geometryPositionAtOffset(vehiclePosition); const SUMOReal angle = -l->getShape().rotationDegreeAtOffset(l->interpolateLanePosToGeometryPos(vehiclePosition)); glPushMatrix(); glTranslated(p.x(), p.y(), 0); glRotated(angle, 0, 0, 1); glTranslated(xOff, 0, GLO_VEHICLE); glScaled(exaggeration, vehLength * exaggeration, 1); glBegin(GL_TRIANGLES); glVertex2d(0, 0); glVertex2d(0 - 1.25, 1); glVertex2d(0 + 1.25, 1); glEnd(); glPopMatrix(); if (nameSettings.show) { glPushMatrix(); glRotated(angle, 0, 0, 1); glTranslated(xOff, 0, 0); glRotated(-angle, 0, 0, 1); GLHelper::drawText(veh->getID(), l->geometryPositionAtOffset(vehiclePosition - 0.5 * vehLength), GLO_MAX, nameSettings.size / s.scale, nameSettings.color); glPopMatrix(); } vehiclePosition -= vehLength; } } segmentOffset += length; } glPopMatrix(); } vehicleControl->releaseVehicles(); } }