private void StartDownloadAndCalculateAsync(Context appContext, ElevationCalculation ec) { try { StartDownloadAndCalculate(appContext, ec); } catch (Exception ex) { PopupHelper.ErrorDialog(appContext, Resource.String.Main_ErrorGeneratingElevationProfile, ex.Message); } }
private void GenerateElevationProfile(Context appContext, int maxDistance, GpsLocation myLocation) { try { if (!GpsUtils.HasAltitude(myLocation)) { PopupHelper.ErrorDialog(appContext, Resource.String.Main_ErrorUnknownAltitude); return; } _elevationProfileBeingGenerated = true; var ec = new ElevationCalculation(myLocation, maxDistance); var size = ec.GetSizeToDownload(); if (size == 0) { StartDownloadAndCalculate(appContext, ec); return; } using (var builder = new AlertDialog.Builder(appContext)) { builder.SetCancelable(false); builder.SetTitle(appContext.Resources.GetText(Resource.String.Common_Question)); builder.SetMessage(String.Format(appContext.Resources.GetText(Resource.String.Download_Confirmation), size)); builder.SetIcon(Android.Resource.Drawable.IcMenuHelp); builder.SetPositiveButton(appContext.Resources.GetText(Resource.String.Common_Yes), (senderAlert, args) => { StartDownloadAndCalculateAsync(appContext, ec); }); builder.SetNegativeButton(appContext.Resources.GetText(Resource.String.Common_No), (senderAlert, args) => { _elevationProfileBeingGenerated = false; }); var myCustomDialog = builder.Create(); myCustomDialog.Show(); } } catch (Exception ex) { PopupHelper.ErrorDialog(appContext, Resource.String.Main_ErrorGeneratingElevationProfile, ex.Message); } }
private void StartDownloadAndCalculate(Context appContext, ElevationCalculation ec) { _elevationProfileBeingGenerated = true; var lastProgressUpdate = System.Environment.TickCount; var pd = new ProgressDialog(appContext); pd.SetMessage(appContext.Resources.GetText(Resource.String.Main_GeneratingElevationProfile)); pd.SetCancelable(false); pd.SetProgressStyle(ProgressDialogStyle.Horizontal); pd.Max = 100; pd.Show(); ec.OnFinishedAction = (result) => { pd.Hide(); if (!string.IsNullOrEmpty(result.ErrorMessage)) { PopupHelper.ErrorDialog(appContext, result.ErrorMessage); } RefreshElevationProfile(result); _elevationProfileBeingGenerated = false; }; ec.OnProgressChange = (progress) => { var tickCount = System.Environment.TickCount; if (tickCount - lastProgressUpdate > 100) { MainThread.BeginInvokeOnMainThread(() => { pd.Progress = progress; }); Thread.Sleep(50); lastProgressUpdate = tickCount; } }; ec.Execute(); }
public void CalculateBorderTileHeights() { // if perpendicular motion is +ve, it's a collision. // -ve, it's a rift (which would form basaltic volcanoes) // If collision, then // if heights sufficiently close & same sign, treat as height increase // mountain formation; folding; // if heights opposite sign; subduct the lower under the higher. // tilt upper plate (calc for all boundaries) foreach (int borderCornerKey in borderCorners.Keys) { List <Int64> borderIndices = borderCorners[borderCornerKey].borderIndices; if (borderIndices.Count == 3) { // At 3 plate boundaries, just take some maxima / averages: Plate plate0 = GetPlates()[VertexToPlates[geometry.Topology.Centroids[borderCornerKey].Faces[0]]]; Plate plate1 = GetPlates()[VertexToPlates[geometry.Topology.Centroids[borderCornerKey].Faces[1]]]; Plate plate2 = GetPlates()[VertexToPlates[geometry.Topology.Centroids[borderCornerKey].Faces[2]]]; Stress stress = borderCorners[borderCornerKey].stress; if (stress.pressure > 0.3) { borderCorners[borderCornerKey].elevation = Math.Max(plate0.Traits.Elevation, Math.Max(plate1.Traits.Elevation, plate2.Traits.Elevation)) + stress.pressure; } else if (stress.pressure < -0.3) { borderCorners[borderCornerKey].elevation = Math.Max(plate0.Traits.Elevation, Math.Max(plate1.Traits.Elevation, plate2.Traits.Elevation)) + stress.pressure / 4; } else if (stress.shear > 0.3) { borderCorners[borderCornerKey].elevation = Math.Max(plate0.Traits.Elevation, Math.Max(plate1.Traits.Elevation, plate2.Traits.Elevation)) + stress.shear / 8; } else { borderCorners[borderCornerKey].elevation = (plate0.Traits.Elevation + plate1.Traits.Elevation + plate2.Traits.Elevation) / 3.0f; } } else { Border border0 = borders[borderIndices[0]]; Border border1 = borders[borderIndices[1]]; int plateIndex0 = border0.plate0; int plateIndex1 = border1.plate0 == plateIndex0 ? border1.plate1 : border0.plate1; Plate plate0 = GetPlates()[plateIndex0]; Plate plate1 = GetPlates()[plateIndex1]; ElevationCalculation elevationCalculation = ElevationCalculation.DORMANT; Stress stress = borderCorners[borderCornerKey].stress; if (stress.pressure > 0.3) { borderCorners[borderCornerKey].elevation = Math.Max(plate0.Traits.Elevation, plate1.Traits.Elevation) + stress.pressure; if (plate0.Traits.Elevation < 0 && plate0.Traits.Elevation < 0) { elevationCalculation = ElevationCalculation.COLLIDING; } else if (plate0.Traits.Elevation < 0) { elevationCalculation = ElevationCalculation.SUBDUCTING; } else if (plate1.Traits.Elevation < 0) { elevationCalculation = ElevationCalculation.SUPERDUCTING; } else { elevationCalculation = ElevationCalculation.COLLIDING; } } else if (stress.pressure < -0.3) { borderCorners[borderCornerKey].elevation = Math.Max(plate0.Traits.Elevation, plate1.Traits.Elevation) + stress.pressure / 4; elevationCalculation = ElevationCalculation.DIVERGING; } else if (stress.shear > 0.3) { borderCorners[borderCornerKey].elevation = Math.Max(plate0.Traits.Elevation, plate1.Traits.Elevation) + stress.shear / 8; elevationCalculation = ElevationCalculation.SHEARING; } else { borderCorners[borderCornerKey].elevation = (plate0.Traits.Elevation + plate1.Traits.Elevation) / 2.0f; elevationCalculation = ElevationCalculation.DORMANT; } // Queue up: // next corner: Inner corner: the corner that isn't the opposite corner of border0 and border1 // (i.e. remove the opposite corners from Centroid neighbours, and it's the remaining one). // origin: { this corner, stress, plate, elevationType } // border: inner border // corner: this corner // distanceToPlateBoundary: inner border length, i.e. of next corner. } } }