Exemple #1
0
        private RaycastMapResult RayCastToMap(Point startPoint)
        {
            RayHitTestResult rayHitTestResult = VisualTreeHelper.HitTest(viewport, startPoint) as RayHitTestResult;

            if (rayHitTestResult != null)
            {
                Point3D hitPoint = rayHitTestResult.PointHit;
                // Convert to tile coords
                var hitPointOnTile = new Vector2 <double>(hitPoint.X - rayHitTestResult.ModelHit.Bounds.X, -(rayHitTestResult.ModelHit.Bounds.Y - hitPoint.Y));
                hitPointOnTile.X = 4096 - hitPointOnTile.X;
                hitPointOnTile   = hitPointOnTile.Multiply(2);

                Projection projection = CalculateProjection();
                var        hitTile    = new Vector2 <double>(hitPoint.X, hitPoint.Y).Divide(4096).ToVectorInt().Multiply(4096);

                double startPosX = (int)Math.Floor((hitTile.X - (projection.Bottom / 2)) / 4096) + 1;
                double startPosY = (int)Math.Floor((hitTile.Y - (projection.Left / 2)) / 4096) + 1;

                double           cZoom = dataController.ConvertToMapZoom(zoom);
                Vector2 <double> startTileCoordinations = MercatorProjection.LatLngToTile(Settings.startPosition, cZoom);
                LatLng           tileLatLng             = MercatorProjection.TileToLatLng(new Vector2 <double>(startTileCoordinations.X - startPosX, startTileCoordinations.Y + startPosY), cZoom);
                //LatLng pointLatLng = MercatorProjection.TileToLatLng(, cZoom);

                Vector2 <double> tile  = MercatorProjection.LatLngToTile(tileLatLng, cZoom).Floor();
                Graph            graph = dataController.GetRoads(new Vector3 <double>(tile.X, tile.Y, cZoom));
                help.Content = graph.FindNearest(hitPointOnTile);

                return(new RaycastMapResult(tileLatLng, hitPointOnTile, hitPoint));
            }

            return(null);
        }
        public void TestMercatorProjection()
        {
            LatLng startPosition = new LatLng(48.464717, 35.046183);

            Vector2 <double> tile    = MercatorProjection.LatLngToTile(startPosition, 13);
            LatLng           latLng  = MercatorProjection.TileToLatLng(tile, 13);
            LatLng           latLng1 = MercatorProjection.TileToLatLng(tile.X, tile.Y, 13);

            Assert.IsTrue(startPosition.IsEquals(latLng.Round(6)) && startPosition.IsEquals(latLng1.Round(6)));
        }
Exemple #3
0
        private void PrepareDataForSimplexMethod()
        {
            // TODO: Algorithm:
            // - Standartization of points
            // - Calculate hashes for tiles
            // - Get graphs by hashes or real time add tiles
            // - Combine graphs
            // - Path finding
            // - Convert data for simplex method

            // TODO: UI usability structure
            help.Content = "Right click on map to select point";
            double[] constraints = new double[pointsList.Count / countOfSources];
            for (int i = 0; i < constraints.Length; i++)
            {
                constraints[i] = Convert.ToInt32(Microsoft.VisualBasic.Interaction.InputBox($"Cost condition for {i}:", "Please, enter the field", "1"));
            }

            double[] simplex = new double[countOfSources];
            for (int i = 0; i < simplex.Length; i++)
            {
                simplex[i] = Convert.ToInt32(Microsoft.VisualBasic.Interaction.InputBox($"Satisfaction condition for {i}:", "Please, enter the field", "1"));
            }

            double           cZoom = dataController.ConvertToMapZoom(zoom);
            Vector2 <double> tile  = MercatorProjection.LatLngToTile(pointsList.First().TileLatLng, cZoom).Floor();
            Graph            graph = dataController.GetRoads(new Vector3 <double>(tile.X, tile.Y, cZoom));

            if (graph == null)
            {
                return;
            }

            //List<string> hashes = pointsList.GetMapTileHashes(dataController.ConvertToMapZoom(zoom));
            //Graph.CombineGraphs(dataController.GetRoads(hashes[0]).nodes, dataController.GetRoads(hashes[1]).nodes);

            List <Node> points = new List <Node>();

            foreach (RaycastMapResult point in pointsList)
            {
                //var proj = MercatorProjection.LatLngToTile(, cZoom);
                var proj = point.PointLatLng;
                points.Add(graph.FindNearest(proj));
            }

            Console.WriteLine("Clear list of points...");
            pointsList.Clear();

            double[,] distances = new double[points.Count / countOfSources, countOfSources];
            int counterX = 0;
            int counterY = 0;

            for (int i = 1; i < points.Count; i++)
            {
                if (counterX == countOfSources)
                {
                    counterY = 0;
                    counterX++;
                }
                AStarPathSearch.AStarPathSearchResult result = AStarPathSearch.FindPath(points[0], points[i]);
                if (result == null)
                {
                    return;
                }
                distances[counterX, counterY] = result.Score;
                counterY++;
            }

            Matrix <double> distanceMatrix    = DenseMatrix.OfArray(distances);
            Vector <double> constraintsVector = DenseVector.OfArray(constraints);
            Vector <double> simplexFunction   = DenseVector.OfArray(simplex);

            BasisFinder basisFinder = new BasisFinder(distanceMatrix, simplexFunction, constraintsVector);

            int[] basis = basisFinder.GetBasis();

            Console.WriteLine($"Basis: {string.Join(", ", basis)}");

            Simplex simplexMethod = new Simplex(basisFinder, basis);

            simplexMethod.FindAnswer();

            Console.WriteLine($"Matrix: {simplexMethod.matrix.ToString()}");
            Console.WriteLine($"Constraints: {constraintsVector.ToString()}");
            Console.WriteLine($"Simplex function: {simplexFunction.ToString()}");
            double answer = simplexMethod.GetAnswer();

            Console.WriteLine($"Answer: {answer}");
        }
Exemple #4
0
        public void UpdateScene(int tileSize)
        {
            taskFactory.StartNew(() =>
            {
                // TODO: Trigger points for update scene instead recreate every control

                int tilesPerWidth = 0, tilesPerHeight = 0, startPosX = 0, startPosY = 0;

                Dispatcher.Invoke(() =>
                {
                    Projection projection = CalculateProjection();
                    tilesPerWidth         = (int)Math.Ceiling(projection.Bottom / tileSize) + 7;
                    tilesPerHeight        = (int)Math.Ceiling(projection.Left / tileSize) + 4;

                    // TileSize for tangram always 4096
                    startPosX = (int)Math.Floor((camera.Position.X - projection.Bottom / 2) / tileSize) - 3;
                    startPosY = (int)Math.Floor((camera.Position.Y - projection.Left / 2) / tileSize) - 2;
                });
                double cZoom = dataController.ConvertToMapZoom(zoom);

                List <Vector2 <int> > tilesToAdd    = new List <Vector2 <int> >();
                List <Vector2 <int> > tilesToRemove = new List <Vector2 <int> >();

                for (int x = oldStartX; x < oldEndX; x++)
                {
                    for (int y = oldStartY; y < oldEndY; y++)
                    {
                        tilesToRemove.Add(new Vector2 <int>(x, y));
                    }
                }

                for (int x = startPosX; x < startPosX + tilesPerWidth; x++)
                {
                    for (int y = startPosY; y < startPosY + tilesPerHeight; y++)
                    {
                        if (oldZoom == (int)cZoom)
                        {
                            tilesToRemove.Remove(new Vector2 <int>(x, y));
                        }

                        tilesToAdd.Add(new Vector2 <int>(x, y));
                    }
                }

                if (oldZoom == (int)cZoom)
                {
                    for (int x = oldStartX; x < oldEndX; x++)
                    {
                        for (int y = oldStartY; y < oldEndY; y++)
                        {
                            tilesToAdd.Remove(new Vector2 <int>(x, y));
                        }
                    }
                }

                oldStartX = startPosX;
                oldStartY = startPosY;
                oldEndX   = startPosX + tilesPerWidth;
                oldEndY   = startPosY + tilesPerHeight;
                oldZoom   = (int)cZoom;

                Vector2 <int> startTileCoordinations = MercatorProjection.LatLngToTile(Settings.startPosition, cZoom).ToVectorInt();

                List <Task> tasks = new List <Task>();

                foreach (Vector2 <int> tile in tilesToRemove)
                {
                    Dispatcher.Invoke(() =>
                    {
                        tiles.Children.Remove(currentTiles[tile]);
                        currentTiles.Remove(tile);
                    });
                }

                foreach (Vector2 <int> tile in tilesToAdd)
                {
                    Vector3 <double> lonLatZoom = new Vector3 <double>(
                        startTileCoordinations.X - tile.X,
                        startTileCoordinations.Y + tile.Y,
                        cZoom
                        );
                    string tileHash = lonLatZoom.X + " " + lonLatZoom.Y + " " + cZoom;
                    if (mapTileCache.TryGetValue(tileHash, out MapTile mapTile))
                    {
                        Dispatcher.Invoke(() =>
                        {
                            tiles.Children.Add(mapTile.Model3DGroup.Children[0]);
                            currentTiles.Add(tile, mapTile.Model3DGroup.Children[0]);
                        });
                    }
                    else
                    {
                        tasks.Add(ProcessMapTile(tileHash, tile.X, tile.Y, lonLatZoom, TimeSpan.Zero));
                    }
                }

                foreach (Task task in tasks)
                {
                    task.Wait();
                }
            });
        }