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))); }
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}"); }
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(); } }); }