Beispiel #1
0
    private static float[,] generateGraphMatrix(RoadNetwork roadNetwork)
    {
        float[,] result = new float[roadNetwork.crossroads.Count, roadNetwork.crossroads.Count];
        for (int i = 0; i < roadNetwork.crossroads.Count; i++)
        {
            for (int j = 0; j < roadNetwork.crossroads.Count; j++)
            {
                result[i, j] = float.MaxValue;
            }
        }

        for (int i = 0; i < roadNetwork.crossroads.Count; i++)
        {
            Crossroad cr = roadNetwork.crossroads[i];
            foreach (RoadSegment segment in cr.adjacentSegemnts)
            {
                Crossroad otherCrossroad = segment.getEnd() == cr?segment.getStart() : segment.getEnd();

                int j = roadNetwork.crossroads.IndexOf(otherCrossroad);
                result[i, j] = segment.getLength();
                result[j, i] = segment.getLength();
            }
            result[i, i] = 0;
        }

        return(result);
    }
Beispiel #2
0
        public static IFeatureSet RoadNetworkToShapefile(RoadNetwork rn, string writefilename)
        {
            FeatureSet fs       = new FeatureSet(FeatureType.Line);
            string     filename = Path.GetFileNameWithoutExtension(writefilename);

            fs.Name = filename;
            fs.DataTable.Columns.Add("RoadID", typeof(long));
            fs.DataTable.Columns.Add("RoadName", typeof(string));
            fs.DataTable.Columns.Add("RoadFunction", typeof(byte));
            fs.DataTable.Columns.Add("RoadLength", typeof(double));
            fs.DataTable.Columns.Add("RoadAttribute", typeof(string));
            for (int i = 0; i < rn.RoadCount; i++)
            {
                Road r  = rn.GetRoadByIndex(i);
                var  fe = fs.AddFeature(r);
                fe.DataRow.BeginEdit();
                fe.DataRow["RoadID"]       = r.RoadID;
                fe.DataRow["RoadName"]     = r.RoadName;
                fe.DataRow["RoadFunction"] = r.RoadFunction;
                fe.DataRow["RoadLength"]   = r.RoadLength;
                string attr = string.Empty;
                for (int j = 0; j < r.RoadAttribute.Count; j++)
                {
                    attr += r.RoadAttribute[j].RoadFunction.ToString() + r.RoadAttribute[j].RoadAtrribute.ToString();
                    if (j != r.RoadAttribute.Count - 1)
                    {
                        attr += "|";
                    }
                }
                fe.DataRow["RoadAttribute"] = attr;
                fe.DataRow.EndEdit();
            }
            fs.SaveAs(writefilename, true);
            return(fs);
        }
Beispiel #3
0
 public static RoadSegment getRelatedRoadSegment(RoadNetwork roadNetwork, float x1, float y1, float x2, float y2)
 {
     if (x1 > x2)
     {
         float tmp = x2;
         x2 = x1;
         x1 = tmp;
     }
     if (y1 > y2)
     {
         float tmp = y2;
         y2 = y1;
         y1 = tmp;
     }
     foreach (RoadSegment segment in roadNetwork.roadSegments)
     {
         if (segment.getStart().x == segment.getEnd().x&& x1 == x2 && x1 == segment.getStart().x)  // Road segment and tested segment are horizontal
         {
             if (segment.getStart().y <= y1 && segment.getEnd().y >= y2 ||
                 segment.getStart().y >= y1 && segment.getEnd().y <= y2)
             {
                 return(segment);
             }
         }
         else if (segment.getStart().y == segment.getEnd().y&& y1 == y2 && y1 == segment.getStart().y)  // Road segment and tested segment are vertical
         {
             if (segment.getStart().x <= x1 && segment.getEnd().x >= x2 ||
                 segment.getStart().x >= x1 && segment.getEnd().x <= x2)
             {
                 return(segment);
             }
         }
     }
     return(null);
 }
Beispiel #4
0
    public override void OnInspectorGUI()
    {
        RoadNetwork roadNetwork = (RoadNetwork)target;

        if (GUILayout.Button("Build Random Road Network"))
        {
            roadNetwork.BuildRandom();
        }

        jsonOutputPath = GUILayout.TextField(jsonOutputPath, 100);
        if (GUILayout.Button("Save to json file"))
        {
            string jsonOutput = roadNetwork.ToJson(true);
            File.WriteAllText(jsonOutputPath, jsonOutput);
        }

        if (GUILayout.Button("Load from json file"))
        {
            roadNetwork.FromJsonOverwrite(roadNetwork.inputJsonFile.text);
        }

        if (GUILayout.Button("Build Road Mesh"))
        {
            ProBuilderMesh roadMesh = Mesher.MeshRoadNetwork(roadNetwork);
            roadMesh.GetComponent <MeshRenderer>().sharedMaterial = roadNetwork.roadMaterial;
            roadMesh.transform.position = roadNetwork.transform.position;
            roadMesh.transform.rotation = roadNetwork.transform.rotation;
        }

        DrawDefaultInspector();
    }
    private void OnEnable()
    {
        network = (RoadNetwork)target;

        // If this is the first time selecting a road, the global settings will not have been set yet so call ResetGlobals
        if (!areGlobalsSet)
        {
            ResetGlobals();
        }

        if (network.roads == null || network.roads.Count == 0)
        {
            network.InitialiseRoadNetwork(defaultMaterial);
        }

        selectedRoad = network.ActiveRoad;

        // Disables the default transform/rotation/other handle when first selecting the road network
        previousTool  = Tools.current;
        Tools.current = Tool.None;

        // Ensures the mesh is regenerated when the developer undos or redos
        Undo.undoRedoPerformed += GenerateMesh;

        network.OnRoadSelected += SelectRoad;
    }
Beispiel #6
0
 public HashSet <RoadSegment> getRelatedRoadSegments(RoadNetwork roadNetwork)
 {
     if (relatedRoadSegments == null)
     {
         relatedRoadSegments = new HashSet <RoadSegment>();
         foreach (DistrictCell cell in this.cells)
         {
             if (cell.edgeBottom)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x, cell.y + 1, cell.x + 1, cell.y + 1));
             }
             if (cell.edgeLeft)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x, cell.y, cell.x, cell.y + 1));
             }
             if (cell.edgeUp)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x, cell.y, cell.x + 1, cell.y));
             }
             if (cell.edgeRight)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x + 1, cell.y, cell.x + 1, cell.y + 1));
             }
         }
     }
     return(relatedRoadSegments);
 }
    protected static District detectDistrict(RoadNetwork roadNetwork, float dimension, int startX, int startY, bool[,] visited)
    {
        District        result   = new District();
        Queue <Vector2> bfsQueue = new Queue <Vector2>();

        bfsQueue.Enqueue(new Vector2(startX, startY));
        while (bfsQueue.Count > 0)
        {
            Vector2 position = bfsQueue.Dequeue();
            int     px = (int)position.x, py = (int)position.y;
            if (px < 0 || px >= dimension || py < 0 || py >= dimension || visited[px, py])
            {
                continue;
            }

            result.cells.Add(new DistrictCell(position));
            visited[px, py] = true;

            if (RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x, position.y + 1))         // Left
            {
                result.cells[result.cells.Count - 1].edgeLeft = true;                                          // Update attribute for last added element
            }
            if (RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x + 1, position.y))         // Up
            {
                result.cells[result.cells.Count - 1].edgeUp = true;                                            // Update attribute for last added element
            }
            if (RoadHelper.hasRoadAt(roadNetwork, position.x + 1, position.y, position.x + 1, position.y + 1)) // Right
            {
                result.cells[result.cells.Count - 1].edgeRight = true;                                         // Update attribute for last added element
            }
            if (RoadHelper.hasRoadAt(roadNetwork, position.x, position.y + 1, position.x + 1, position.y + 1)) // Down
            {
                result.cells[result.cells.Count - 1].edgeBottom = true;                                        // Update attribute for last added
            }
            if (px > 0 && !visited[px - 1, py] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x, position.y + 1)) // Left
            {
                bfsQueue.Enqueue(new Vector2(position.x - 1, position.y));
            }

            if (py > 0 && !visited[px, py - 1] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x + 1, position.y)) // Up
            {
                bfsQueue.Enqueue(new Vector2(position.x, position.y - 1));
            }

            if ((px + 1) < dimension && !visited[px + 1, py] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x + 1, position.y, position.x + 1, position.y + 1)) // Right
            {
                bfsQueue.Enqueue(new Vector2(position.x + 1, position.y));
            }

            if ((py + 1) < dimension && !visited[px, py + 1] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x, position.y + 1, position.x + 1, position.y + 1)) // Down
            {
                bfsQueue.Enqueue(new Vector2(position.x, position.y + 1));
            }
        }
        return(result);
    }
    public override void agentAction()
    {
        RoadNetwork network = generator.roadNetwork;
        Crossroad   cr0 = network.crossroads[Random.Range(0, network.crossroads.Count)];
        Crossroad   cr1 = network.crossroads[Random.Range(0, network.crossroads.Count)];
        bool        cr0_founded = false, cr1_founded = false;

        for (int i = 0; i < network.crossroads.Count; i++)
        {
            if (cr0.adjacentSegemnts.Count < 3)
            {
                cr0_founded = true;
                break;
            }
            cr0 = network.crossroads[Random.Range(0, network.crossroads.Count)];
        }
        for (int i = 0; i < network.crossroads.Count; i++)
        { // Not guarantee checking all possible crossrods
            if (cr1.adjacentSegemnts.Count < 3 && cr1 != cr0 && !hasIntersections(network, cr0, cr1))
            {
                cr1_founded = true;
                break;
            }
            cr1 = network.crossroads[Random.Range(0, network.crossroads.Count)];
        }
        if (!cr0_founded || !cr1_founded)
        {
            return;
        }

        RoadSegment segment = new RoadSegment(cr0, cr1);

        network.roadSegments.Add(segment);
        Debug.Log("Roads connected");
    }
Beispiel #9
0
        //初始化道路智能体,获取每个道路智能体的车辆数以及ID、起点、终点、道路等级的信息
        public void InitializeRoadAgent()
        {
            //设置道路智能体属性
            IFeatureLayer  pFeatureLayer  = CDataImport.ImportFeatureLayerFromControltext(@"C:\Users\Administrator\Desktop\突发环境事件应急资源调度系统\data\road.shp");
            IFeatureClass  pFeatureClass  = pFeatureLayer.FeatureClass;
            IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
            IFeature       pFeature       = pFeatureCursor.NextFeature();

            while (pFeature != null)
            {
                RoadNetwork pRoadNetwork = new RoadNetwork();
                pRoadNetwork.ID          = Convert.ToInt32(pFeature.get_Value(pFeature.Fields.FindField("OBJECTID")));
                pRoadNetwork.StartNodeID = Convert.ToString(pFeature.get_Value(pFeature.Fields.FindField("StartNodeI")));
                pRoadNetwork.EndNodeID   = Convert.ToString(pFeature.get_Value(pFeature.Fields.FindField("EndNodeID")));
                pRoadNetwork.Rank        = Convert.ToString(pFeature.get_Value(pFeature.Fields.FindField("Rank")));
                pRoadNetwork.Length      = Convert.ToDouble((pFeature.Shape as IPolyline).Length);
                pRoadAgent.Add(pRoadNetwork);
                pFeature = pFeatureCursor.NextFeature();
            }

            //初始化道路智能体行驶的车辆数
            for (int i = 0; i < pOrdinaryVehicleAgent.Count; i++)
            {
                pRoadAgent[pOrdinaryVehicleAgent[i].Origination].VehicleNumber++;
            }
        }
Beispiel #10
0
        internal RoadCollection(RoadTopology topology, AssetLoadContext loadContext, HeightMap heightMap)
            : this()
        {
            // The map stores road segments with no connectivity:
            // - a segment is from point A to point B
            // - with a road type name
            // - and start and end curve types (angled, tight curve, broad curve).

            // The goal is to create road networks of connected road segments,
            // where a network has only a single road type.

            // A road network is composed of 2 or more nodes.
            // A network is a (potentially) cyclic graph.

            // A road node has > 1 and <= 4 edges connected to it.
            // A node can be part of multiple networks.

            // An edge can only exist in one network.

            // TODO: If a node stored in the map has > 4 edges, the extra edges
            // are put into a separate network.

            var networks = RoadNetwork.BuildNetworks(topology);

            foreach (var network in networks)
            {
                _roads.Add(AddDisposable(new Road(
                                             loadContext,
                                             heightMap,
                                             network)));
            }
        }
Beispiel #11
0
 public TripsLoader(RoadNetwork rn)
 {
     TripFolders  = Directory.GetDirectories(Parameters.TripsFolder);
     TripFiles    = new List <string>();
     AllTripNodes = new ConcurrentStack <List <Node> >();
     RN           = rn;
 }
Beispiel #12
0
    private void Awake()
    {
        instance    = this;
        roadNetwork = new RoadNetwork(100f, this); //Create a New road Network

        ClearRoads();
    }
Beispiel #13
0
    public static float getDistance(RoadNetwork roadNetwork, RoadSegment rs0, RoadSegment rs1)
    {
        if (rs0 == rs1)
        {
            return(rs0.getLength() / 2.0f);
        }
        float result   = float.MaxValue;
        float distance = getDistance(roadNetwork, rs0.getStart(), rs1.getStart());

        if (distance < result)
        {
            result = distance;
        }
        distance = getDistance(roadNetwork, rs0.getStart(), rs1.getEnd());
        if (distance < result)
        {
            result = distance;
        }
        distance = getDistance(roadNetwork, rs0.getEnd(), rs1.getStart());
        if (distance < result)
        {
            result = distance;
        }
        distance = getDistance(roadNetwork, rs0.getEnd(), rs1.getEnd());
        if (distance < result)
        {
            result = distance;
        }
        return(result + (rs0.getLength() / 2.0f) + (rs1.getLength() / 2.0f));
    }
Beispiel #14
0
    public float getDistanceTo(District another, RoadNetwork roadNetwork)
    {
        if (!distancesCache.ContainsKey(another))
        {
            float result = float.MaxValue;
            HashSet <RoadSegment> roadSegments        = this.getRelatedRoadSegments(roadNetwork);
            HashSet <RoadSegment> anotherRoadSegments = another.getRelatedRoadSegments(roadNetwork);

            foreach (RoadSegment segment in roadSegments)
            {
                if (segment == null)
                {
                    continue;
                }
                foreach (RoadSegment anotherSegment in anotherRoadSegments)
                {
                    if (anotherSegment == null)
                    {
                        continue;
                    }
                    float distance = RoadHelper.getDistance(roadNetwork, segment, anotherSegment);
                    if (distance < result)
                    {
                        result = distance;
                    }
                }
            }
            distancesCache[another] = result;
        }

        return(distancesCache[another]);
    }
Beispiel #15
0
    //public enum PlacementMode
    //{
    //    RoadStart,
    //    RoadEnd,
    //    BuildingPlop
    //}
    void Start()
    {
        mouseCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        mouseCube.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
        placementPreview = false;

        roadNetwork = GameObject.Find("RoadNetwork").GetComponent<RoadNetwork>();
    }
Beispiel #16
0
        internal PathSolver(int width, int height, List <Region> regions, List <TerrainType> terrainTypes)
        {
            nodes = new NodeList(width, height);
            areas = getPathAreas(regions, ref nodes, terrainTypes);

            ValidateNodes(nodes);
            roadNetwork = new RoadNetwork();
        }
Beispiel #17
0
    //public enum PlacementMode
    //{
    //    RoadStart,
    //    RoadEnd,
    //    BuildingPlop
    //}

    void Start()
    {
        mouseCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        mouseCube.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
        placementPreview = false;

        roadNetwork = GameObject.Find("RoadNetwork").GetComponent <RoadNetwork>();
    }
Beispiel #18
0
    public static ProBuilderMesh MeshRoadNetwork(RoadNetwork roadNet)
    {
        var(vertices, faces) = CalcVerticesAndFaces(roadNet);
        ProBuilderMesh roadMesh = ProBuilderMesh.Create(vertices, faces);

        roadMesh.GetComponent <Renderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;

        return(roadMesh);
    }
Beispiel #19
0
 public void Clear()
 {
     roadNetwork = new RoadNetwork(100f, this);   //Clears any list that has been made
     ClearBuildings();
     ClearRoads();
     manualPoints.Clear();
     roads.Clear();
     intersections.Clear();
 }
Beispiel #20
0
 void ConstructRoadAndData()
 {
     myRoadNetwork = RoadNetworkReader.ReadRoadDataFromFile(@"Data\link_hefei.txt", @"Data\connectivity_hefei.txt", @"Data\ref_points_hefei.txt");
     myRoadNetwork.BuildRoadRtree();
     toolStripProgressBar1.ProgressBar.Invoke(new Action(() => { toolStripStatusLabel1.Text = "路网以及R树构建完成"; }));
     AddGPSFile(@"Data/newTrajectoriespart.txt");
     toolStripProgressBar1.ProgressBar.Invoke(new Action(() => { toolStripStatusLabel1.Text = "GPS轨迹装载完成"; webBrowser1.Document.InvokeScript("LoadingDone"); }));
     //通知浏览器数据加载完成
 }
Beispiel #21
0
        public static void ConstructGraph(string roadFilename, string roadNetworkFilename, string poiFilename, string meterologyDirectory, string mobilityDirectory, string aqiDirectory, string outputGraphFilename, int numDays, int knn, int timeSlot, double s)
        {
            RoadNetwork roadNetwork = IO.ReadRoadNetwork(roadFilename);
            Grid        grid        = new Grid(roadNetwork.MinPoint, roadNetwork.MaxPoint, 0.015);

            CoupledDL.GraphInput       graphInput = new CoupledDL.GraphInput(timeSlot, numDays, 4, roadNetworkFilename, poiFilename, meterologyDirectory, mobilityDirectory, aqiDirectory, grid);
            CoupledDL.Graph.HyperGraph graph      = graphInput.ReadGraphFromFiles(1);
            double[] sigma = new double[] { 10, 2, 4, 4 };
            graphInput.BuildEdgesOfGraph(graph, knn, 9, sigma, 0, outputGraphFilename);
        }
Beispiel #22
0
    private static (List <Vector3>, List <Face>) CalcVerticesAndFaces(RoadNetwork roadNet)
    {
        var vertices = new List <Vector3>();
        var faces    = new List <Face>();

        RoadSegmentMeshInfo[] segmentMeshInfos = new RoadSegmentMeshInfo[roadNet.SegmentCount];

        for (int i = 0; i < roadNet.VertCount; ++i)
        {
            // Construct incoming road edge descriptors
            RoadVertexView roadVert         = roadNet.GetVertex(i);
            List <int>     connSegIndices   = roadVert.Data.ConnectedSegmentIndices; // Assumed connected segments in clockwise order
            var            incRoadEdges     = new RoadSegmentEdges[connSegIndices.Count];
            var            roadMeshEndInfos = new RoadSegmentMeshEndInfo[connSegIndices.Count];
            for (int j = 0; j < connSegIndices.Count; ++j)
            {
                // Extract road segment mesh end info to fill out
                // This is used to assign the vertices we create in this loop to the correct road segment, at the correct end.
                int curSegmentIndex = connSegIndices[j];
                ref RoadSegmentMeshInfo curSegmentMeshInfo = ref segmentMeshInfos[curSegmentIndex];
                if (curSegmentMeshInfo == null)
                {
                    curSegmentMeshInfo = new RoadSegmentMeshInfo();
                }
                RoadSegmentView            curSegment        = roadNet.GetSegment(curSegmentIndex);
                ref RoadSegmentMeshEndInfo curSegMeshEndInfo = ref ((curSegment.StartVertex.Index != i) ? ref curSegmentMeshInfo.startVertIndices : ref curSegmentMeshInfo.endVertIndices);
                curSegMeshEndInfo   = new RoadSegmentMeshEndInfo();
                roadMeshEndInfos[j] = curSegMeshEndInfo;

                // Get adjacent vertex on this road segment
                int            adjVertIdx  = curSegment.StartVertex.Index != i ? curSegment.StartVertex.Index : curSegment.EndVertex.Index;
                RoadVertexView adjRoadVert = roadNet.GetVertex(adjVertIdx);

                // Construct the incoming left and right road edge descriptors
                Vector2          incDir           = (roadVert.Position - adjRoadVert.Position).normalized;
                Vector2          rot90Dir         = new Vector2(-incDir.y, incDir.x); // Rotated 90 degrees counter clockwise
                Vector2          leftOffset       = rot90Dir * curSegment.HalfWidth;
                Vector2          rightOffset      = -rot90Dir * curSegment.HalfWidth;
                RoadSegmentEdges roadSegmentEdges = new RoadSegmentEdges()
                {
                    left = new Line()
                    {
                        start = adjRoadVert.Position + leftOffset,
                        end   = roadVert.Position + leftOffset
                    },
                    right = new Line()
                    {
                        start = adjRoadVert.Position + rightOffset,
                        end   = roadVert.Position + rightOffset
                    }
                };

                // Add incoming edges to array
                incRoadEdges[j] = roadSegmentEdges;
            }
 protected bool hasIntersections(RoadNetwork network, Crossroad cr0, Crossroad cr1)
 {
     for (int i = 0; i < network.roadSegments.Count; i++)
     {
         if (RoadHelper.areRoadsIntersects(new RoadSegment(cr0, cr1), network.roadSegments[i]))
         {
             return(true);
         }
     }
     return(false);
 }
Beispiel #24
0
        static void Main(string[] args)
        {
            ShapeFileFeatureSource sourceData = new ShapeFileFeatureSource(@"..\..\Data\Roads.shp");
            StreamSource           source     = new StreamSource();
            Stopwatch   watch   = Stopwatch.StartNew();
            RoadNetwork netWork = source.CreateNetwork(sourceData);

            watch.Stop();

            Console.WriteLine(String.Format("The total cost:{0} Minutes, Nodes' count is {1}", watch.ElapsedMilliseconds / 1000 / 60, netWork.Nodes.Count));
            Console.Read();
        }
 /// <summary>
 /// Tries to get cycles, starting from the given vertex.
 /// </summary>
 /// <param name="roadNetwork">The road network to search in.</param>
 /// <param name="startVertex">The vertex to start searching from.</param>
 /// <param name="cycles">The found cycles in the road network.</param>
 /// <returns>true if any were found, false if not.</returns>
 private static bool TryGetCycles(
     RoadNetwork roadNetwork,
     Vector3 startVertex,
     out IReadOnlyCollection <IReadOnlyCollection <Vector3> > cycles)
 {
     cycles = GetCycles(
         roadNetwork,
         startVertex,
         startVertex,
         new HashSet <(Vector3 Start, Vector3 End)>());
     return(cycles.Any());
 }
Beispiel #26
0
        private void Populate1()
        {
            RoadNetwork network = new RoadNetwork();

            Vertex start = network.AddVertex(100, 10);

            Vertex a = network.AddVertex(50, 10);
            Vertex b = network.AddVertex(150, 10);
            Vertex c = network.AddVertex(50, 75);
            Vertex d = network.AddVertex(100, 75);
            Vertex e = network.AddVertex(150, 75);

            Vertex f = network.AddVertex(50, 150);
            Vertex g = network.AddVertex(100, 150);
            Vertex h = network.AddVertex(150, 150);

            Vertex i = network.AddVertex(50, 210);
            Vertex j = network.AddVertex(150, 210);

            Vertex end = network.AddVertex(100, 210);

            network.AddEdge(start, a);
            network.AddEdge(start, b);

            network.AddEdge(a, c);
            network.AddEdge(b, e);

            network.AddEdge(c, d);
            network.AddEdge(e, d);

            network.AddEdge(c, f);
            network.AddEdge(d, g);
            network.AddEdge(e, h);

            network.AddEdge(f, g);
            network.AddEdge(h, g);

            network.AddEdge(f, i);
            network.AddEdge(h, j);

            network.AddEdge(i, end);
            network.AddEdge(j, end);

            parent1.Network = network;

            ConjugationOperator op = new ConjugationOperator();

            RoadNetwork cut = new RoadNetwork(network);

            op.Cut(cut);

            cut1.Network = cut;
        }
Beispiel #27
0
    public void ReDraw()
    {
        roadNetwork = new RoadNetwork(100f, this);
        ClearBuildings();
        ClearRoads();

        roads.Clear();
        intersections.Clear();

        TryDraw();
        Subdivide();
    }
Beispiel #28
0
    public float getDistanceTo(District another, RoadNetwork roadNetwork)
    {
        if (!distancesCache.ContainsKey(another))
        {
            float result = float.MaxValue;
            HashSet <RoadSegment> roadSegments        = this.getRelatedRoadSegments(roadNetwork);
            HashSet <RoadSegment> anotherRoadSegments = another.getRelatedRoadSegments(roadNetwork);

            foreach (RoadSegment segment in roadSegments)
            {
                if (segment == null)
                {
                    continue;
                }
                foreach (RoadSegment anotherSegment in anotherRoadSegments)
                {
                    if (anotherSegment == null)
                    {
                        continue;
                    }
                    float distance = RoadHelper.getDistance(roadNetwork, segment, anotherSegment);
                    if (distance < result)
                    {
                        result = distance;
                    }
                }
            }
            distancesCache[another] = result;
        }

        return(distancesCache[another]);

        //Vector2 thisPosition = new Vector2();
        //foreach (DistrictCell cell in cells)
        //{
        //    thisPosition.x += cell.x;
        //    thisPosition.y += cell.y;
        //}
        //thisPosition.x /= cells.Count;
        //thisPosition.y /= cells.Count;

        //Vector2 anotherPosition = new Vector2();
        //foreach (DistrictCell cell in another.cells)
        //{
        //    anotherPosition.x += cell.x;
        //    anotherPosition.y += cell.y;
        //}
        //anotherPosition.x /= cells.Count;
        //anotherPosition.y /= cells.Count;

        //return Vector2.Distance(thisPosition, anotherPosition);
    }
    // Start is called before the first frame update
    void Start()
    {
        var roadNetwork = new RoadNetwork();

        roadNetwork.AddVertex(new RoadVertex(0, 0));
        roadNetwork.AddVertex(new RoadVertex(50, 0));
        roadNetwork.AddVertex(new RoadVertex(100, 0));

        roadNetwork.AddSegment(new RoadSegment(0, 1));
        roadNetwork.AddSegment(new RoadSegment(1, 2));

        Debug.Log(roadNetwork.ToJson(true));
    }
Beispiel #30
0
        public Experiments()
        {
            RN = new RoadNetwork();
            RN.BuildNetwork();
            // try loading trips
            TLoader = new TripsLoader(RN);
            TLoader.LoadTrips();

            Options = new ProgressBarOptions
            {
                DisplayTimeInRealTime = false
            };
        }
    public override void agentAction()
    {
        RoadNetwork network = generator.roadNetwork;
        Crossroad   cr0     = new Crossroad();

        do
        {
            cr0.x = Random.value * generator.meshDimension;
            cr0.y = Random.value * generator.meshDimension;
        } while (RoadHelper.isUnderWaterline(cr0, generator));
        cr0.x = (int)cr0.x;
        cr0.y = (int)cr0.y;
        network.crossroads.Add(cr0);
    }
 /// <summary>
 /// Gets all cycles in the road network.
 /// </summary>
 /// <param name="roadNetwork">The road network.</param>
 /// <returns>All cycles in the road network.</returns>
 private IEnumerable <IReadOnlyCollection <Vector3> > GetAllCycles(RoadNetwork roadNetwork)
 {
     // Concurrent search for cycles from each vertex
     return(TaskUtils.RunActionInTasks(
                roadNetwork.RoadVertices,
                vertex => TryGetCycles(roadNetwork, vertex, out var vertexCycles)
                 ? vertexCycles
                 : new List <IReadOnlyCollection <Vector3> >(),
                CancelToken)
            // Put all found cycles in one collection
            ?.SelectMany(cycle => cycle)
            // Filter out any cycles that do not have any vertices
            .Where(c => c.Any()));
 }
Beispiel #33
0
        private void Populate2()
        {
            RoadNetwork network = new RoadNetwork();

            Vertex start = network.AddVertex(100, 10);

            Vertex a = network.AddVertex(50, 50);
            Vertex b = network.AddVertex(150, 50);

            Vertex c = network.AddVertex(25, 75);
            Vertex d = network.AddVertex(100, 75);
            Vertex e = network.AddVertex(175, 75);

            Vertex f = network.AddVertex(100, 150);

            Vertex g = network.AddVertex(50, 190);
            Vertex h = network.AddVertex(150, 190);

            Vertex end = network.AddVertex(100, 210);

            network.AddEdge(start, a);
            network.AddEdge(start, b);
            network.AddEdge(a, c);
            network.AddEdge(a, d);
            network.AddEdge(b, d);
            network.AddEdge(b, e);

            network.AddEdge(c, f);
            network.AddEdge(e, f);

            network.AddEdge(f, g);
            network.AddEdge(f, h);

            network.AddEdge(g, end);
            network.AddEdge(h, end);

            parent2.Network = network;

            ConjugationOperator op = new ConjugationOperator();

            RoadNetwork cut = new RoadNetwork(network);

            op.Cut(cut);

            cut2.Network = cut;
        }