Exemple #1
0
    //-------------------------------------------------------------------------
    /// <returns>True if at least one island is found, false otherwise.</returns>
    protected bool CalculateIslandStartingPoints(bool[] binaryImage, int binaryImageWidth, int binaryImageHeight, ref int[] reusedIslandClassificationImage, ref List <IslandDetector.Region> islands, ref List <IslandDetector.Region> seaRegions)
    {
        mIslandDetector = new IslandDetector();
        mIslandDetector.DetectIslandsFromBinaryImage(binaryImage, binaryImageWidth, binaryImageHeight, ref reusedIslandClassificationImage, ref islands, ref seaRegions);

        return(islands.Count > 0);
    }
        public void TestTwoDistinctEdges()
        {
            // build routerdb.
            var routerDb = new RouterDb();

            routerDb.Network.AddVertex(0, 0, 0);
            routerDb.Network.AddVertex(1, 1, 1);
            routerDb.Network.AddEdge(0, 1, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }, null);
            routerDb.Network.AddVertex(2, 0, 0);
            routerDb.Network.AddVertex(3, 1, 1);
            routerDb.Network.AddEdge(2, 3, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }, null);

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Itinero.Profiles.Factor> getFactor = (x) =>
            {
                return(new Itinero.Profiles.Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // start island detector.
            var islandDetector = new IslandDetector(routerDb, new Func <ushort, Itinero.Profiles.Factor>[] { getFactor });

            islandDetector.Run();

            // verify the islands.
            var islands = islandDetector.Islands;

            Assert.IsNotNull(islands);
            Assert.AreEqual(4, islands.Length);
            Assert.AreEqual(0, islands[0]);
            Assert.AreEqual(0, islands[1]);
            Assert.AreEqual(1, islands[2]);
            Assert.AreEqual(1, islands[3]);

            var islandSizes = islandDetector.IslandSizes;

            Assert.AreEqual(2, islandSizes.Count);
            uint size;

            Assert.IsTrue(islandSizes.TryGetValue(0, out size));
            Assert.AreEqual(2, size);
            Assert.IsTrue(islandSizes.TryGetValue(1, out size));
            Assert.AreEqual(2, size);
        }
    //-------------------------------------------------------------------------
    /// <returns>True if at least one island is found, false otherwise.</returns>
    protected bool CalculateIslandStartingPoints(bool[,] binaryImage, out IslandDetector.Region[] islands, out IslandDetector.Region[] seaRegions)
    {
        int[,] islandClassificationImage = null;
        islands    = null;
        seaRegions = null;

        mIslandDetector = new IslandDetector();
        mIslandDetector.DetectIslandsFromBinaryImage(binaryImage, out islandClassificationImage, out islands, out seaRegions);

        return(islands.Length > 0);
    }
        public void TestSingleVertexRestrictionHandling()
        {
            // build and load network.
            var routerDb = new RouterDb();

            routerDb.LoadTestNetwork(
                System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(
                    "Itinero.Test.test_data.networks.network18.geojson"));

            var profile = Itinero.Osm.Vehicles.Vehicle.Car.Fastest();
            Func <ushort, Itinero.Profiles.Factor> getFactor = (x) =>
            {
                var attributes     = routerDb.EdgeProfiles.Get(x);
                var factorAndSpeed = profile.FactorAndSpeed(attributes);
                return(new Itinero.Profiles.Factor()
                {
                    Direction = factorAndSpeed.Direction,
                    Value = factorAndSpeed.Value
                });
            };

            // start island detector.
            var islandDetector = new IslandDetector(routerDb, new Func <ushort, Itinero.Profiles.Factor>[] { getFactor },
                                                    routerDb.GetRestrictions(Itinero.Osm.Vehicles.Vehicle.Car.Fastest()));

            islandDetector.Run();

            // verify the islands.
            var islands = islandDetector.Islands;

            Assert.IsNotNull(islands);
            Assert.AreEqual(10, islands.Length);
            Assert.AreEqual(0, islands[0]);
            Assert.AreEqual(1, islands[1]);
            Assert.AreEqual(0, islands[2]);
            Assert.AreEqual(IslandDetector.RESTRICTED, islands[3]);
            Assert.AreEqual(0, islands[4]);
            Assert.AreEqual(0, islands[5]);
            Assert.AreEqual(0, islands[6]);
            Assert.AreEqual(0, islands[7]);
            Assert.AreEqual(1, islands[8]);
            Assert.AreEqual(1, islands[9]);
        }
Exemple #5
0
	//-------------------------------------------------------------------------
	public static void SetupColliderRegionParameters(ref ColliderRegionParameters[] colliderRegionParameters, int defaultMaxPointCount,
													 IslandDetector.Region[] islands, IslandDetector.Region[] seaRegions) {
		
		int numColliderRegions = islands.Length + seaRegions.Length;
		
		bool shallResetRegionParameters = (colliderRegionParameters == null || numColliderRegions != colliderRegionParameters.Length); // TODO!! check when to throw parameters away!
		if (shallResetRegionParameters) {
			
			colliderRegionParameters = new ColliderRegionParameters[numColliderRegions];
			int colliderRegionIndex = 0;
			
			// Note: We enable the first island region only. All other island- and all sea-regions are initially disabled.
			for (int islandIndex = 0; islandIndex < islands.Length; ++islandIndex) {
				
				ColliderRegionParameters newParameters = new ColliderRegionParameters();
				if (islandIndex == 0) {
					newParameters.EnableRegion = true;
				}
				else {
					newParameters.EnableRegion = false;
				}
				newParameters.MaxPointCount = defaultMaxPointCount;
				colliderRegionParameters[colliderRegionIndex++] = newParameters;
			}
			for (int seaRegionIndex = 0; seaRegionIndex < seaRegions.Length; ++seaRegionIndex) {

				ColliderRegionParameters newParameters = new ColliderRegionParameters();
				newParameters.EnableRegion = false;
				newParameters.MaxPointCount = defaultMaxPointCount;
				colliderRegionParameters[colliderRegionIndex++] = newParameters;
			}
		}
		else {
			for (int count = 0; count < colliderRegionParameters.Length; ++count) {
				colliderRegionParameters[count].RegionUpdateCalculationNeeded = true;
			}
		}
	}
Exemple #6
0
	//-------------------------------------------------------------------------
	public static void SetupColliderRegions(out ColliderRegionData[] colliderRegions, IslandDetector.Region[] islands, IslandDetector.Region[] seaRegions) {
		
		int numColliderRegions = islands.Length + seaRegions.Length;
		colliderRegions = new ColliderRegionData[numColliderRegions];
		int colliderRegionIndex = 0;
		foreach (IslandDetector.Region islandRegion in islands) {
			ColliderRegionData newRegion = new ColliderRegionData();
			newRegion.mDetectedRegion = islandRegion;
			newRegion.mRegionIsIsland = true;
			colliderRegions[colliderRegionIndex++] = newRegion;
		}
		foreach (IslandDetector.Region seaRegion in seaRegions) {
			ColliderRegionData newRegion = new ColliderRegionData();
			newRegion.mDetectedRegion = seaRegion;
			newRegion.mRegionIsIsland = false;
			colliderRegions[colliderRegionIndex++] = newRegion;
		}
	}
Exemple #7
0
	//-------------------------------------------------------------------------
    /// <returns>True if at least one island is found, false otherwise.</returns>
	bool CalculateIslandStartingPoints(bool [,] binaryImage, out IslandDetector.Region[] islands, out IslandDetector.Region[] seaRegions) {
		int[,] islandClassificationImage = null;
		islands = null;
		seaRegions = null;
		
		mIslandDetector = new IslandDetector();
		mIslandDetector.DetectIslandsFromBinaryImage(binaryImage, out islandClassificationImage, out islands, out seaRegions);

        return (islands.Length > 0);
	}
	//-------------------------------------------------------------------------
	bool CalculateOutlineForColliderIslands(out List<List<Vector2> > outlineVerticesAtIsland, IslandDetector.Region[] islands, bool [,] binaryImage) {
		
		outlineVerticesAtIsland = new List<List<Vector2> >();
		
		for (int islandIndex = 0; islandIndex < islands.Length; ++islandIndex) {
			
			IslandDetector.Region island = islands[islandIndex];
			
			if (islandIndex >= mMaxNumberOfIslands || island.mPointCount < mMinPixelCountToIncludeIsland) {
				break; // islands are sorted by size already, only smaller islands follow.
			}
			else {
				List<Vector2> unreducedOutlineVertices;
	            mOutlineAlgorithm.UnreducedOutlineFromBinaryImage(out unreducedOutlineVertices, binaryImage, island.mPointAtBorder, true, mOutputColliderInNormalizedSpace, true);
				
				List<Vector2> reducedVertices = mOutlineAlgorithm.ReduceOutline(unreducedOutlineVertices, true);
				outlineVerticesAtIsland.Add(reducedVertices);
			}
        }
		return outlineVerticesAtIsland.Count > 0;
	}
        public void TestOnewayDeadend()
        {
            // build routerdb.
            var routerDb = new RouterDb();

            routerDb.Network.AddVertex(0, 0, 0);
            routerDb.Network.AddVertex(1, 1, 1);
            routerDb.Network.AddVertex(2, 2, 2);
            routerDb.Network.AddEdge(0, 1, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }, null);
            routerDb.Network.AddEdge(1, 2, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 2
            }, null);

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Itinero.Profiles.Factor> getFactor = (x) =>
            {
                if (x == 1)
                {
                    return(new Itinero.Profiles.Factor()
                    {
                        Direction = 0,
                        Value = 1.0f / speed
                    });
                }
                else
                {
                    return(new Itinero.Profiles.Factor()
                    {
                        Direction = 1,
                        Value = 1.0f / speed
                    });
                }
            };

            // start island detector.
            var islandDetector = new IslandDetector(routerDb, new Func <ushort, Itinero.Profiles.Factor>[] { getFactor });

            islandDetector.Run();

            // verify the islands.
            var islands = islandDetector.Islands;

            Assert.IsNotNull(islands);
            Assert.AreEqual(3, islands.Length);
            Assert.AreEqual(0, islands[0]);
            Assert.AreEqual(0, islands[1]);
            Assert.AreEqual(IslandDetector.SINGLETON_ISLAND, islands[2]);

            var islandSizes = islandDetector.IslandSizes;

            Assert.AreEqual(1, islandSizes.Count);
            uint size;

            Assert.IsTrue(islandSizes.TryGetValue(0, out size));
            Assert.AreEqual(2, size);

            // make oneway go the other direction.
            getFactor = (x) =>
            {
                if (x == 1)
                {
                    return(new Itinero.Profiles.Factor()
                    {
                        Direction = 0,
                        Value = 1.0f / speed
                    });
                }
                else
                {
                    return(new Itinero.Profiles.Factor()
                    {
                        Direction = 2,
                        Value = 1.0f / speed
                    });
                }
            };

            // start island detector.
            islandDetector = new IslandDetector(routerDb, new Func <ushort, Itinero.Profiles.Factor>[] { getFactor });
            islandDetector.Run();

            // verify the islands.
            islands = islandDetector.Islands;
            Assert.IsNotNull(islands);
            Assert.AreEqual(3, islands.Length);
            Assert.AreEqual(0, islands[0]);
            Assert.AreEqual(0, islands[1]);
            Assert.AreEqual(IslandDetector.SINGLETON_ISLAND, islands[2]);

            islandSizes = islandDetector.IslandSizes;
            Assert.AreEqual(1, islandSizes.Count);
            Assert.IsTrue(islandSizes.TryGetValue(0, out size));
            Assert.AreEqual(2, size);
        }
Exemple #10
0
        public void TestDifferentSizesAndSingletons()
        {
            // build routerdb.
            var routerDb = new RouterDb();

            // ISLAND1: 4 vertices.
            routerDb.Network.AddVertex(0, 0, 0);
            routerDb.Network.AddVertex(1, 0, 0);
            routerDb.Network.AddVertex(2, 0, 0);
            routerDb.Network.AddVertex(3, 0, 0);
            routerDb.Network.AddEdge(0, 1, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }, null);
            routerDb.Network.AddEdge(1, 2, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }, null);
            routerDb.Network.AddEdge(2, 3, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }, null);

            // ISLAND2: 2 vertices.
            routerDb.Network.AddVertex(4, 0, 0);
            routerDb.Network.AddVertex(5, 0, 0);
            routerDb.Network.AddEdge(4, 5, new Itinero.Data.Network.Edges.EdgeData()
            {
                Distance = 100,
                Profile  = 1
            }, null);

            // ISLAND3: singleton
            routerDb.Network.AddVertex(6, 0, 0);

            // build speed profile function.
            var speed = 100f / 3.6f;
            Func <ushort, Itinero.Profiles.Factor> getFactor = (x) =>
            {
                return(new Itinero.Profiles.Factor()
                {
                    Direction = 0,
                    Value = 1.0f / speed
                });
            };

            // start island detector.
            var islandDetector = new IslandDetector(routerDb, new Func <ushort, Itinero.Profiles.Factor>[] { getFactor });

            islandDetector.Run();

            // verify the islands.
            var islands = islandDetector.Islands;

            Assert.IsNotNull(islands);
            Assert.AreEqual(7, islands.Length);
            Assert.AreEqual(0, islands[0]);
            Assert.AreEqual(0, islands[1]);
            Assert.AreEqual(0, islands[2]);
            Assert.AreEqual(0, islands[3]);
            Assert.AreEqual(1, islands[4]);
            Assert.AreEqual(1, islands[5]);
            Assert.AreEqual(IslandDetector.SINGLETON_ISLAND, islands[6]);

            var islandSizes = islandDetector.IslandSizes;

            Assert.AreEqual(2, islandSizes.Count);
            uint size;

            Assert.IsTrue(islandSizes.TryGetValue(0, out size));
            Assert.AreEqual(4, size);
            Assert.IsTrue(islandSizes.TryGetValue(1, out size));
            Assert.AreEqual(2, size);
        }
Exemple #11
0
	//-------------------------------------------------------------------------
	public static void SetupColliderRegionParameters(ref ColliderRegionParameters[] islandRegionParameters, ref ColliderRegionParameters[] seaRegionParameters,
	                                                 int defaultMaxPointCount,
													 IslandDetector.Region[] islands, IslandDetector.Region[] seaRegions) {

		// Islands
		int oldIslandRegionParametersLength = 0;
		if (islandRegionParameters == null) {			
			islandRegionParameters = new ColliderRegionParameters[islands.Length];
		}
		else {
			oldIslandRegionParametersLength = islandRegionParameters.Length;
			if (islands.Length > oldIslandRegionParametersLength) {
				System.Array.Resize(ref islandRegionParameters, islands.Length);
			}
		}

		// set RegionUpdateCalculationNeeded at old entries
		for (int existingIndex = 0; existingIndex < oldIslandRegionParametersLength; ++existingIndex) {
			islandRegionParameters[existingIndex].RegionUpdateCalculationNeeded = true;
		}
		// add new ColliderRegionParameters at new ones
		for (int newIndex = oldIslandRegionParametersLength; newIndex < islands.Length; ++newIndex) {
		
			// Note: We enable the first island region only. All other island- and all sea-regions are initially disabled.
			ColliderRegionParameters newParameters = new ColliderRegionParameters();
			if (newIndex == 0) {
				newParameters.EnableRegion = true;
			}
			else {
				newParameters.EnableRegion = false;
			}
			newParameters.MaxPointCount = defaultMaxPointCount;
			islandRegionParameters[newIndex] = newParameters;
		}

		// Sea regions
		int oldSeaRegionParametersLength = 0;
		if (seaRegionParameters == null) {			
			seaRegionParameters = new ColliderRegionParameters[seaRegions.Length];
		}
		else {
			oldSeaRegionParametersLength = seaRegionParameters.Length;
			if (seaRegions.Length > oldSeaRegionParametersLength) {
				System.Array.Resize(ref seaRegionParameters, seaRegions.Length);
			}
		}
		// set RegionUpdateCalculationNeeded at old entries
		for (int existingIndex = 0; existingIndex < oldSeaRegionParametersLength; ++existingIndex) {
			seaRegionParameters[existingIndex].RegionUpdateCalculationNeeded = true;
		}
		// add new ColliderRegionParameters at new ones
		for (int seaRegionIndex = oldSeaRegionParametersLength; seaRegionIndex < seaRegions.Length; ++seaRegionIndex) {
			
			ColliderRegionParameters newParameters = new ColliderRegionParameters();
			newParameters.EnableRegion = false;
			newParameters.MaxPointCount = defaultMaxPointCount;
			seaRegionParameters[seaRegionIndex] = newParameters;
		}
	}
 public void Initialize()
 {
     _sut = new IslandDetector();
 }