public void OnHeadingCorrection(float distanceX) { var viewAngleHorizontal = _context.ViewAngleHorizontal; _context.HeadingCorrector = _context.HeadingCorrector + CompassViewUtils.GetHeadingDifference(viewAngleHorizontal, Width, distanceX / _scale); Invalidate(); }
public void InitializeViewDrawer(System.Drawing.Size compassViewSize, System.Drawing.Size pictureSize) { if (_context == null || poiCategoryBitmapProvider == null) { return; } try { (ViewAngleHorizontal, ViewAngleVertical) = CompassViewUtils.AdjustViewAngles( _context.ViewAngleHorizontal, _context.ViewAngleVertical, compassViewSize, pictureSize, _allowRotation); //2000 x 1000 px is a default view size. All drawings ale calculated to this size var isPortrait = compassViewSize.Height > compassViewSize.Width; var defaultCompassSize = isPortrait ? 1000f : 2000f; //so we need to calculate mutliplier to adjust them for current resolution float multiplier = compassViewSize.Width / defaultCompassSize; compassViewDrawer.Initialize(Resources, ViewAngleHorizontal, ViewAngleVertical, multiplier); elevationProfileBitmapDrawer.Initialize(ViewAngleHorizontal, ViewAngleVertical, multiplier); Log.WriteLine(LogPriority.Debug, TAG, $"ViewAngle: {_context.ViewAngleHorizontal:F1}/{_context.ViewAngleVertical:F1}"); Log.WriteLine(LogPriority.Debug, TAG, $"AdjustedViewAngle: {ViewAngleHorizontal:F1}/{ViewAngleVertical:F1}"); RecalculateViewAngles(_scale); } catch (Exception) { //TODO: log error Context.Log } }
public void ScaleVerticalViewAngle(float scale) { _context.Settings.SetCameraParameters(_context.ViewAngleHorizontal, _context.ViewAngleVertical / scale, _context.Settings.CameraPictureSize.Width, _context.Settings.CameraPictureSize.Height); (ViewAngleHorizontal, ViewAngleVertical) = CompassViewUtils.AdjustViewAngles( _context.ViewAngleHorizontal, _context.ViewAngleVertical, new System.Drawing.Size(Width, Height), _context.Settings.CameraPictureSize, _allowRotation); RecalculateViewAngles(_scale); }
public void PaintElevationProfileLines(Canvas canvas, double heading, double leftTiltCorrector, double rightTiltCorrector, float offsetX, float offsetY) { if (_context.ListOfProfileLines != null) { foreach (var line in _context.ListOfProfileLines) { if (line.distance / 1000 > _context.Settings.MaxDistance) { continue; } var x1 = CompassViewUtils.GetXLocationOnScreen((float)heading, line.Bearing1, canvas.Width, _adjustedViewAngleHorizontal, offsetX); var x2 = CompassViewUtils.GetXLocationOnScreen((float)heading, line.Bearing2, canvas.Width, _adjustedViewAngleHorizontal, offsetX); if (x1.HasValue && x2.HasValue) { double verticalAngleCorrection1 = CompassViewUtils.GetTiltCorrection(line.Bearing1, heading, _viewAngleHorizontal, leftTiltCorrector, rightTiltCorrector); double verticalAngleCorrection2 = CompassViewUtils.GetTiltCorrection(line.Bearing2, heading, _viewAngleHorizontal, leftTiltCorrector, rightTiltCorrector); var y1 = CompassViewUtils.GetYLocationOnScreen(line.VerticalViewAngle1 + verticalAngleCorrection1, canvas.Height, _adjustedViewAngleVertical); var y2 = CompassViewUtils.GetYLocationOnScreen(line.VerticalViewAngle2 + verticalAngleCorrection2, canvas.Height, _adjustedViewAngleVertical); double alpha = 255 - ((line.distance / 1000) / _context.Settings.MaxDistance) / 2 * 400; _linePaint.SetARGB((int)alpha, 0x30, 0x30, 0x30); _linePaint.AntiAlias = true; _lineBackPaint.SetARGB((int)alpha, 0xE0, 0xE0, 0xE0); _lineBackPaint.AntiAlias = true; canvas.DrawLine(x1.Value, y1 + offsetY, x2.Value, y2 + offsetY, _lineBackPaint); canvas.DrawLine(x1.Value, y1 + offsetY, x2.Value, y2 + offsetY, _linePaint); } } } /* * if (_elevationProfileBitmap != null) * { * float offset = (float)(_elevationProfileBitmap.Width * (heading - ViewAngleHorizontal / 2) / 360); * canvas.DrawBitmap(_elevationProfileBitmap, -offset, (float)0, null); * if (heading > 360 - _context.Settings.ViewAngleHorizontal) * { * canvas.DrawBitmap(_elevationProfileBitmap, -offset + _elevationProfileBitmap.Width, (float)0, null); * } * if (heading < _context.Settings.ViewAngleHorizontal) * { * canvas.DrawBitmap(_elevationProfileBitmap, -offset - _elevationProfileBitmap.Width, (float)0, null); * } * }*/ }
public PoiViewItemList(IEnumerable <Poi> poiList, GpsLocation myLocation, IGpsUtilities iGpsUtilities) { if (poiList != null) { foreach (var item in poiList) { var poiViewItem = new PoiViewItem(item); poiViewItem.GpsLocation.Bearing = iGpsUtilities.Bearing(myLocation, poiViewItem.GpsLocation); poiViewItem.AltitudeDifference = CompassViewUtils.GetAltitudeDifference(myLocation, poiViewItem.GpsLocation); poiViewItem.GpsLocation.Distance = iGpsUtilities.Distance(myLocation, poiViewItem.GpsLocation); poiViewItem.GpsLocation.GetVerticalViewAngle(myLocation); Add(poiViewItem); } } }
public (float?x, float?y) GetXY(PoiViewItem item, float heading, float offsetX, float offsetY, double leftTiltCorrector, double rightTiltCorrector, float canvasWidth, float canvasHeight) { var startX = CompassViewUtils.GetXLocationOnScreen(heading, (float)item.GpsLocation.Bearing, canvasWidth, adjustedViewAngleHorizontal, offsetX); if (!startX.HasValue) { return(null, null); } double verticalAngleCorrection = CompassViewUtils.GetTiltCorrection(item.GpsLocation.Bearing.Value, heading, viewAngleHorizontal, leftTiltCorrector, rightTiltCorrector); double verticalAngle = item.VerticalViewAngle; float endY = CompassViewUtils.GetYLocationOnScreen(verticalAngle + verticalAngleCorrection, canvasHeight, adjustedViewAngleVertical) + offsetY; return(startX, endY); }
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (requestCode == EditActivity.REQUEST_ADD_POI) { if (resultCode == EditActivity.RESULT_OK) { var id = data.GetLongExtra("Id", 0); var item = Context.Database.GetItem(id); var poiViewItem = new PoiViewItem(item); poiViewItem.GpsLocation.Bearing = _iGpsUtilities.Bearing(Context.MyLocation, poiViewItem.GpsLocation); poiViewItem.AltitudeDifference = CompassViewUtils.GetAltitudeDifference(Context.MyLocation, poiViewItem.GpsLocation); poiViewItem.GpsLocation.Distance = _iGpsUtilities.Distance(Context.MyLocation, poiViewItem.GpsLocation); _adapter.Add(poiViewItem); } if (resultCode == EditActivity.RESULT_OK_AND_CLOSE_PARENT) { SetResult(RESULT_OK_AND_CLOSE_PARENT); Finish(); } } if (requestCode == EditActivity.REQUEST_EDIT_POI) { if (resultCode == EditActivity.RESULT_OK) { var id = data.GetLongExtra("Id", 0); var itemfromDb = Context.Database.GetItem(id); var itemfromAdapter = _adapter.GetPoiItem(id); itemfromAdapter.Poi = itemfromDb; _adapter.NotifyDataSetChanged(); } if (resultCode == EditActivity.RESULT_OK_AND_CLOSE_PARENT) { SetResult(RESULT_OK_AND_CLOSE_PARENT); Finish(); } } }
/// <summary> /// Creates PoiViewItemList with distance calcalted from current location, and filters-out items not matching maxDistance and minAltitude parameters. /// </summary> /// <param name="poiList">List of Pois</param> /// <param name="location">My current location</param> /// <param name="maxDistance">Max distance in kilometers</param> /// <param name="minAltitude">Min altitude (progress 100 = 1600m)</param> public PoiViewItemList(IEnumerable <Poi> poiList, GpsLocation myLocation, double maxDistance, List <PoiCategory> categories, IGpsUtilities iGpsUtilities) { foreach (var item in poiList) { var poiViewItem = new PoiViewItem(item); poiViewItem.GpsLocation.Bearing = iGpsUtilities.Bearing(myLocation, poiViewItem.GpsLocation); poiViewItem.AltitudeDifference = CompassViewUtils.GetAltitudeDifference(myLocation, poiViewItem.GpsLocation); poiViewItem.GpsLocation.Distance = iGpsUtilities.Distance(myLocation, poiViewItem.GpsLocation); poiViewItem.GpsLocation.GetVerticalViewAngle(myLocation); if (poiViewItem.GpsLocation.Distance > maxDistance * 1000) { continue; } if (!categories.Contains(poiViewItem.Poi.Category)) { continue; } Add(poiViewItem); } }
private IOrderedEnumerable <PoiViewItem> FilterPoisDoBeDisplayed(List <PoiViewItem> srcList) { if (srcList == null) { return(null); } PoiViewItem[] listCopy = new PoiViewItem[srcList.Count]; srcList.CopyTo(listCopy); foreach (var item in listCopy) { item.Visibility = CompassViewUtils.IsPoiVisible(item, _context.ElevationProfileData); } _poisToBeDisplayed = listCopy.Where(poi => poi.Visibility != Peaks360Lib.Domain.Enums.Visibility.Invisible && (!_context.ShowFavoritesOnly || poi.Poi.Favorite)) .OrderByDescending(poi => poi.Priority) .ThenByDescending(poi => poi.GpsLocation.VerticalViewAngle); CheckOverlappingItems(_poisToBeDisplayed); return(_poisToBeDisplayed); }
bool IsOverlapping(double item1, double item2, double minDiff) { return(Math.Abs(CompassViewUtils.GetAngleDiff(item1, item2)) < minDiff); }