/****************************************************************************/1// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo2// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.3// activitygen module4// Copyright 2010 TUM (Technische Universitaet Muenchen, http://www.tum.de/)5// This program and the accompanying materials are made available under the6// terms of the Eclipse Public License 2.0 which is available at7// https://www.eclipse.org/legal/epl-2.0/8// This Source Code may also be made available under the following Secondary9// Licenses when the conditions for such availability set forth in the Eclipse10// Public License 2.0 are satisfied: GNU General Public License, version 211// or later which is available at12// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html13// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later14/****************************************************************************/15/// @file AGPosition.cpp16/// @author Piotr Woznica17/// @author Walter Bamberger18/// @author Daniel Krajzewicz19/// @author Michael Behrisch20/// @date July 201021///22// References a street of the city and defines a position in this street23/****************************************************************************/24#include <config.h>2526#include "AGPosition.h"27#include "AGStreet.h"28#include "router/ROEdge.h"29#include "utils/common/RandHelper.h"30#include <iostream>31#include <limits>323334// ===========================================================================35// method definitions36// ===========================================================================37AGPosition::AGPosition(const AGStreet& str, double pos) :38street(&str), position(pos), pos2d(compute2dPosition()) {39}404142AGPosition::AGPosition(const AGStreet& str) :43street(&str), position(randomPositionInStreet(str)), pos2d(compute2dPosition()) {44}454647void48AGPosition::print() const {49std::cout << "- AGPosition: *Street=" << street << " position=" << position << "/" << street->getLength() << std::endl;50}515253bool54AGPosition::operator==(const AGPosition& pos) const {55return pos2d.almostSame(pos.pos2d);56}575859double60AGPosition::distanceTo(const AGPosition& otherPos) const {61return pos2d.distanceTo(otherPos.pos2d);62}636465double66AGPosition::minDistanceTo(const std::list<AGPosition>& positions) const {67double minDist = std::numeric_limits<double>::infinity();68double tempDist;69std::list<AGPosition>::const_iterator itt;7071for (itt = positions.begin(); itt != positions.end(); ++itt) {72tempDist = this->distanceTo(*itt);73if (tempDist < minDist) {74minDist = tempDist;75}76}77return minDist;78}798081double82AGPosition::minDistanceTo(const std::map<int, AGPosition>& positions) const {83double minDist = std::numeric_limits<double>::infinity();84double tempDist;85std::map<int, AGPosition>::const_iterator itt;8687for (itt = positions.begin(); itt != positions.end(); ++itt) {88tempDist = this->distanceTo(itt->second);89if (tempDist < minDist) {90minDist = tempDist;91}92}93return minDist;94}959697const AGStreet&98AGPosition::getStreet() const {99return *street;100}101102103double104AGPosition::getPosition() const {105return position;106}107108109double110AGPosition::randomPositionInStreet(const AGStreet& s) {111return RandHelper::rand(0.0, s.getLength());112}113114115Position116AGPosition::compute2dPosition() const {117// P = From + pos*(To - From) = pos*To + (1-pos)*From118Position From = street->getFromJunction()->getPosition();119Position To = street->getToJunction()->getPosition();120Position position2d(To);121122position2d.sub(From);123position2d.mul(position / street->getLength());124position2d.add(From);125126return position2d;127}128129130/****************************************************************************/131132133