// =========================================================================== // method definitions // =========================================================================== MSParkingArea::MSParkingArea(const std::string& id, const std::vector<std::string>& lines, MSLane& lane, double begPos, double endPos, unsigned int capacity, double width, double length, double angle, const std::string& name) : MSStoppingPlace(id, lines, lane, begPos, endPos, name), myCapacity(capacity), myWidth(width), myLength(length), myAngle(angle) { // initialize unspecified defaults if (myWidth == 0) { myWidth = SUMO_const_laneWidth; } if (myLength == 0) { myLength = getSpaceDim(); } const double offset = MSNet::getInstance()->lefthand() ? -1 : 1; myShape = lane.getShape().getSubpart( lane.interpolateLanePosToGeometryPos(begPos), lane.interpolateLanePosToGeometryPos(endPos)); myShape.move2side((lane.getWidth() / 2. + myWidth / 2.) * offset); // Initialize space occupancies if there is a road-side capacity // The overall number of lots is fixed and each lot accepts one vehicle regardless of size if (myCapacity > 0) { for (int i = 1; i <= myCapacity; ++i) { mySpaceOccupancies[i] = LotSpaceDefinition(); mySpaceOccupancies[i].index = i; mySpaceOccupancies[i].vehicle = 0; mySpaceOccupancies[i].myWidth = myWidth; mySpaceOccupancies[i].myLength = myLength; mySpaceOccupancies[i].myEndPos = myBegPos + getSpaceDim() * i; const Position& f = myShape.positionAtOffset(getSpaceDim() * (i - 1)); const Position& s = myShape.positionAtOffset(getSpaceDim() * (i)); double lot_angle = ((double) atan2((s.x() - f.x()), (f.y() - s.y())) * (double) 180.0 / (double) M_PI) + myAngle; mySpaceOccupancies[i].myRotation = lot_angle; if (myAngle == 0) { // parking parallel to the road mySpaceOccupancies[i].myPosition = s; } else { // angled parking mySpaceOccupancies[i].myPosition = (f + s) * 0.5; } } } computeLastFreePos(); }