Ejemplo n.º 1
0
        public double getCableTension(double cableLength, double elasticExtension, winchDirection _winchDirection)
        {
            double cableTension  = 0;
            double dumpingLength = Math.Max(5.0, cableLength * elasticExtension / 100);

            // CALCULATION TENSION MODIFIER
            if (cableLength < _winchDirection.distance)
            {
                cableTension = (_winchDirection.distance - cableLength) / dumpingLength;
            }

            return(cableTension);
        }
Ejemplo n.º 2
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);
            }
        }
Ejemplo n.º 3
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);
            }
        }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
        public void UpdateWinch(Canvas RadarCanvas, winchDirection winchPosition, double scale)
        {
            scale = Math.Max(0.1, scale) / 125 * 1000;

            try
            {
                foreach (UIElement el in RadarCanvas.Children)
                {
                    if (el.GetType() == typeof(Canvas) && (((Canvas)el).Name == "Winch"))
                    {
                        Canvas canvas = (Canvas)el;
                        Canvas.SetLeft(canvas, 125 - 10 + winchPosition.groundDistance / scale * Math.Sin(winchPosition.heading));
                        Canvas.SetTop(canvas, 125 - 10 - winchPosition.groundDistance / scale * Math.Cos(winchPosition.heading));
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("FAILED to update winch position: " + ex.Message);
            }
        }
Ejemplo n.º 6
0
        public double getBodyVelocity(winchDirection _winchDirection, PlaneInfoCommit _planeCommit, double cableTension, double accelerationLimit, double cableLength, double cableLengthPrev, double cableLengthPrePrev, double lastFrameTiming)
        {
            double baseAcceleration = 5 * 9.81;

            if (Math.Abs(cableLength - cableLengthPrev) > 10)
            {
                cableLengthPrev = cableLength;
            }
            if (Math.Abs(cableLengthPrev - cableLengthPrePrev) > 10)
            {
                cableLengthPrePrev = cableLengthPrev;
            }
            double lengthDiff = (cableLength - cableLengthPrev) * 0.5 + (cableLengthPrev - cableLengthPrePrev) * 0.5;
            double cableSpeed = lengthDiff / lastFrameTiming * cableTension;

            if (cableTension > 1 && lengthDiff > 0)
            {
                cableSpeed += baseAcceleration * Math.Pow(cableTension - 1, 2);
            }

            if (cableSpeed < 2 * accelerationLimit && cableSpeed > accelerationLimit)
            {
                cableSpeed = Math.Min(cableSpeed, 0.99 * accelerationLimit);
            }

            Vector3 planeMotion = new Vector3((float)(_planeCommit.VelocityBodyX * Math.Cos(_winchDirection.heading) * Math.Cos(_winchDirection.pitch)),
                                              (float)(_planeCommit.VelocityBodyY * Math.Sin(_winchDirection.heading)),
                                              (float)(_planeCommit.VelocityBodyZ * Math.Cos(_winchDirection.heading) * Math.Sin(_winchDirection.pitch)));

            double appliedVelocity = cableSpeed - planeMotion.Norm;

            Console.WriteLine($"getBodyVelocity: {cableTension:F4} {appliedVelocity:F4}m/s  lengthDiff{lengthDiff:F4}m cableSpeed{cableSpeed:F4}");
            //Console.WriteLine($"cabC: {cableLength:F4}m cabP{cableLengthPrev:F4}m  cabPP{cableLengthPrePrev:F4}m");

            return(appliedVelocity > 0 ? appliedVelocity : 0);
        }