Beispiel #1
0
        public winchPosition getWinchPosition(PlaneInfoResponse _planeInfoResponse, double _stringLength)
        {
            winchPosition _winchPosition = new winchPosition();

            _winchPosition.location = FindPointAtDistanceFrom(new GeoLocation(_planeInfoResponse.Latitude, _planeInfoResponse.Longitude), _planeInfoResponse.PlaneHeading, _stringLength / 1000);
            _winchPosition.alt      = _planeInfoResponse.Altitude + 2;

            return(_winchPosition);
        }
Beispiel #2
0
        public winchDirection getForceDirection(winchPosition _winchPosition, PlaneInfoResponse _planeInfoResponse)
        {
            winchDirection _winchDirection = new winchDirection();

            double  globalX           = (_winchPosition.location.Longitude - _planeInfoResponse.Longitude) * Math.Cos(_winchPosition.location.Latitude) * 6378137;
            double  globalY           = _winchPosition.alt - _planeInfoResponse.Altitude;
            double  globalZ           = (_winchPosition.location.Latitude - _planeInfoResponse.Latitude) * 180 / Math.PI * 111694;
            Vector3 globalToWinch     = new Vector3((float)globalX, (float)globalY, (float)globalZ);
            Vector3 globalToWinchNorm = globalToWinch;

            globalToWinchNorm.Normalize();

            _winchDirection.climbAngle = Math.Abs(Math.Asin(globalToWinchNorm.Y));

            Matrix3x3 attitude = Matrix3x3.CreateFromYawPitchRoll((float)_planeInfoResponse.PlaneHeading, (float)_planeInfoResponse.PlanePitch, (float)_planeInfoResponse.PlaneBank);

            _winchDirection.localForceDirection = Matrix3x3.Multiply(attitude.Inverse(), globalToWinchNorm);
            _winchDirection.localForceDirection.Normalize();

            _winchDirection.heading        = Math.Atan2(_winchDirection.localForceDirection.X, _winchDirection.localForceDirection.Z);
            _winchDirection.pitch          = Math.Asin(_winchDirection.localForceDirection.Y);
            _winchDirection.distance       = (double)(globalToWinch.Norm);
            globalToWinch.Y                = 0;
            _winchDirection.groundDistance = (double)(globalToWinch.Norm);

            if (_winchDirection.heading > Math.PI)
            {
                _winchDirection.heading -= 2 * Math.PI;
            }
            if (_winchDirection.heading < -Math.PI)
            {
                _winchDirection.heading += 2 * Math.PI;
            }
            if (_winchDirection.pitch > Math.PI)
            {
                _winchDirection.pitch -= 2 * Math.PI;
            }
            if (_winchDirection.pitch < -Math.PI)
            {
                _winchDirection.pitch += 2 * Math.PI;
            }

            return(_winchDirection);
        }
Beispiel #3
0
        public void updateRadarThermals(Canvas RadarCanvas, string id, winchDirection thermalDirection, winchPosition thermalPosition, double finalModifier, double scale)
        {
            scale = Math.Max(0.1, scale) / 125 * 1000;

            try
            {
                foreach (UIElement canv in RadarCanvas.Children)
                {
                    if (canv.GetType() == typeof(Canvas) && ((Canvas)canv).Name == id.Split('_')[0] + "s")
                    {
                        foreach (UIElement el in ((Canvas)canv).Children)
                        {
                            if (el.GetType() == typeof(Ellipse) && ((Ellipse)el).Name == id)
                            {
                                Ellipse circle = (Ellipse)el;

                                circle.Width  = thermalPosition.radius * 2 / scale;
                                circle.Height = thermalPosition.radius * 2 / scale;
                                SolidColorBrush strokeBrush = new SolidColorBrush(finalModifier >= 0 ? Colors.Red : Colors.Blue);
                                strokeBrush.Opacity = Math.Abs(finalModifier >= 0 ? Math.Max(0.1, finalModifier) : Math.Min(-0.1, finalModifier));
                                circle.Fill         = strokeBrush;
                                Canvas.SetLeft(circle, 125 - circle.Width / 2 + thermalDirection.groundDistance / scale * Math.Sin(thermalDirection.heading));
                                Canvas.SetTop(circle, 125 - circle.Height / 2 - thermalDirection.groundDistance / scale * Math.Cos(thermalDirection.heading));

                                //Console.WriteLine(id + " scale: " + scale + " modif: " + finalModifier);

                                //break;
                            }
                            else if (el.GetType() == typeof(Label) && ((Label)el).Name == "Label_" + id)
                            {
                                Label label = (Label)el;

                                Canvas.SetLeft(label, 110 + thermalDirection.groundDistance / scale * Math.Sin(thermalDirection.heading));
                                Canvas.SetTop(label, 115 - thermalDirection.groundDistance / scale * Math.Cos(thermalDirection.heading));

                                //break;
                            }
                        }

                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed to update radar thermals: " + ex.Message);
            }
        }
Beispiel #4
0
        public void updateRadarNearby(Canvas RadarCanvas, uint id, winchDirection planeDirection, winchPosition planePosition, bool currentTowPlane, double scale)
        {
            scale = Math.Max(0.1, scale) / 125 * 1000;

            try
            {
                foreach (UIElement canv in RadarCanvas.Children)
                {
                    if (canv.GetType() == typeof(Canvas) && ((Canvas)canv).Name == "Nearbies")
                    {
                        foreach (UIElement el in ((Canvas)canv).Children)
                        {
                            if (el.GetType() == typeof(Ellipse) && ((Ellipse)el).Name == "Nearby_" + id.ToString())
                            {
                                Ellipse circle = (Ellipse)el;

                                circle.Width  = 10;
                                circle.Height = 10;
                                SolidColorBrush strokeBrush = new SolidColorBrush(currentTowPlane ? Colors.DarkRed : Colors.DarkGreen);
                                //strokeBrush.Opacity = Math.Abs(finalModifier);
                                circle.Fill       = strokeBrush;
                                circle.Visibility = Visibility.Visible;
                                Canvas.SetLeft(circle, 125 - circle.Width / 2 + planeDirection.groundDistance / scale * Math.Sin(planeDirection.heading));
                                Canvas.SetTop(circle, 125 - circle.Height / 2 - planeDirection.groundDistance / scale * Math.Cos(planeDirection.heading));
                            }
                            else if (el.GetType() == typeof(Button) && ((Button)el).Name == "NearbyLabel_" + id.ToString())
                            {
                                Button label = (Button)el;

                                label.Visibility = Visibility.Visible;
                                label.Foreground = new SolidColorBrush(currentTowPlane ? Colors.DarkRed : Colors.DarkGreen);
                                label.Margin     = new Thickness(125 + planeDirection.groundDistance / scale * Math.Sin(planeDirection.heading),
                                                                 125 - planeDirection.groundDistance / scale * Math.Cos(planeDirection.heading), 0, 0);
                            }
                        }

                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Failed to update radar nearby: " + ex.Message);
            }
        }