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); }
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); }
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); } }
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); } }