Esempio n. 1
0
        public void OnHeadingCorrection(float distanceX)
        {
            var viewAngleHorizontal = _context.ViewAngleHorizontal;

            _context.HeadingCorrector = _context.HeadingCorrector + CompassViewUtils.GetHeadingDifference(viewAngleHorizontal, Width, distanceX / _scale);
            Invalidate();
        }
Esempio n. 2
0
        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
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
             *  }
             * }*/
        }
Esempio n. 5
0
 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);
         }
     }
 }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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();
                }
            }
        }
Esempio n. 8
0
        /// <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);
            }
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
 bool IsOverlapping(double item1, double item2, double minDiff)
 {
     return(Math.Abs(CompassViewUtils.GetAngleDiff(item1, item2)) < minDiff);
 }