rrickfox / traffic-sim

GNU General Public License v3.0
2 stars 0 forks source link

Road/Anchors/Edge (Datenstruktur) #20

Closed funketh closed 4 years ago

funketh commented 4 years ago

~Originally posted by @funketh in https://github.com/rrickfox/traffic-sim/issues/14#issuecomment-576053279~

Verschoben nach: #29

rrickfox commented 4 years ago

Fortsetzung der angefangenen Diskussion aus #26

rrickfox commented 4 years ago

Wie wäre es, wenn Road auch noch zwei Point Objekte hat? Dann wäre die Erstellreihenfolge 2 * Point -> Road -> Vertex. Dabei haben wir die points wieder nur für die Koordinaten und der Vertex verweist auf die Road und umgekehrt. Dann kann man die Anchor halt meinetwegen weglassen.

funketh commented 4 years ago

Eine vollständige Implementation der Idee aus #26:

using System.Collections.Generic;

namespace DataTypes
{
    public struct RoadView
    {
        public Vertex otherVertex;
        public Point point;
        public List<Lane> startingLanes;

        public RoadView(Vertex otherVertex, Point point, List<Lane> startingLanes)
        {
            this.otherVertex = otherVertex;
            this.point = point;
            this.startingLanes = startingLanes;
        }
    }

    public class Road
    {
        public float length;
        public RoadShape shape;
        private Dictionary<Vertex, RoadView> _roadViews;

        public Road(float length, RoadShape shape, Vertex vertex1, Vertex vertex2,
            Point point1, Point point2, List<Lane> startingLanes, List<Lane> endingLanes)
        {
            this.length = length;
            this.shape = shape;
            _roadViews = new Dictionary<Vertex, RoadView>
            {
                {vertex1, new RoadView(vertex2, point1, startingLanes)},
                {vertex2, new RoadView(vertex1, point2, endingLanes)}
            };
        }

        public Vertex OtherVertex(Vertex vertex)
        {
            return _roadViews[vertex].otherVertex;
        }

        public Point EndsAt(Vertex vertex)
        {
            return _roadViews[vertex].point;
        }

        public List<Lane> StartingLanes(Vertex vertex)
        {
            return _roadViews[vertex].startingLanes;
        }

        public List<Lane> EndingLanes(Vertex vertex)
        {
            return StartingLanes(OtherVertex(vertex));
        }
    }
}

Der Punkt ist, dass man entweder:

Beides nicht super schön, aber ich tendiere zum 2. Ansatz (also nicht der, den ich hier implementierte).

funketh commented 4 years ago

Implementation des 2. Ansatzes

public class RoadView : Point {
    public RoadView other;
    public List<Lane> outgoingLanes;
    public List<Lane> incomingLanes {
        get => other.outgoingLanes;
        set => other.outgoingLanes = value;
    }
    private float _length;
    public float length {
        get => _length;
        set => _length = other._length = value;
    }
    private RoadShape _shape;
    public RoadShape shape {
        get => _shape;
        set => _shape = other._shape = value;
    }
}

public class Edge : RoadView {
    public Vertex vertex;
}
funketh commented 4 years ago

33