2.默认起飞高度为15米 3.修改航点位置改为按住左shift再按下asdw,不按shift则是控制移动飞机 4.修复上下旋转的高度bug 5.为防止碰撞,加入两个按钮,一个为自动计算高度(未实现),一个为自动设为前一步高度,这样一个图案应该有三个同样形状的飞行任务,一个进入(高度不同)一个表演,一个退出(高度不同)
1014 lines
38 KiB
C#
1014 lines
38 KiB
C#
using Plane.Collections;
|
||
using Plane.Copters;
|
||
using Plane.FormationCreator.Formation;
|
||
using GalaSoft.MvvmLight;
|
||
using GalaSoft.MvvmLight.CommandWpf;
|
||
using Microsoft.Win32;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Input;
|
||
using Plane.Geography;
|
||
|
||
namespace Plane.FormationCreator.ViewModels
|
||
{
|
||
public class ModifyTaskViewModel : ViewModelBase
|
||
{
|
||
public ModifyTaskViewModel(FlightTaskManager flightTaskManager, CopterManager copterManager)
|
||
{
|
||
_flightTaskManager = flightTaskManager;
|
||
_copterManager = copterManager;
|
||
//_flightTaskManager.SingleCopterInfoChanged += (sender, e) =>
|
||
//{
|
||
// var changedSingleInfo = e.ChangedSingleCopterInfo;
|
||
// if (changedSingleInfo.Copter == _copterManager.SelectedCopters.FirstOrDefault())
|
||
// {
|
||
// if (changedSingleInfo is FlyToFlightTaskSingleCopterInfo)
|
||
// {
|
||
// FlyToLat = changedSingleInfo.TargetLat;
|
||
// FlyToLng = changedSingleInfo.TargetLng;
|
||
// FlyToAlt = changedSingleInfo.TargetAlt;
|
||
// }
|
||
// }
|
||
//};
|
||
// TODO: 林俊清, 20150803, 没什么问题就把这段以及 FlyToLat 等属性删了。
|
||
//_flightTaskManager.PropertyChanged += (sender, e) =>
|
||
//{
|
||
// switch (e.PropertyName)
|
||
// {
|
||
// case nameof(FlightTaskManager.SelectedTask):
|
||
// var currentCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
// if (currentCopter != null)
|
||
// {
|
||
// var selectedTask = _flightTaskManager.SelectedTask;
|
||
// if (selectedTask != null)
|
||
// {
|
||
// var singleCopterInfo = selectedTask.SingleCopterInfos.Find(i => i.Copter == currentCopter);
|
||
// if (singleCopterInfo is FlyToFlightTaskSingleCopterInfo)
|
||
// {
|
||
// var info = singleCopterInfo as FlyToFlightTaskSingleCopterInfo;
|
||
// this.FlyToLat = info.TargetLat;
|
||
// this.FlyToLng = info.TargetLng;
|
||
// this.FlyToAlt = info.TargetAlt;
|
||
// }
|
||
// }
|
||
// }
|
||
// break;
|
||
// default:
|
||
// break;
|
||
// }
|
||
//};
|
||
//_copterManager.SelectedCoptersChanged += (sender, e) =>
|
||
//{
|
||
// // TODO: 林俊清, 20150731, 处理多选飞行器时的情况。
|
||
// var selectedCopters = _copterManager.SelectedCopters;
|
||
// if (selectedCopters.Count() > 1)
|
||
// {
|
||
// CanModifySingleCopterInfo = false;
|
||
// return;
|
||
// }
|
||
|
||
// CanModifySingleCopterInfo = true;
|
||
|
||
// var currentCopter = e.AddedCopters.FirstOrDefault();
|
||
// if (currentCopter != null)
|
||
// {
|
||
// var selectedTask = _flightTaskManager.SelectedTask;
|
||
// if (selectedTask != null)
|
||
// {
|
||
// var singleCopterInfo = selectedTask.SingleCopterInfos.Find(i => i.Copter == currentCopter);
|
||
// if (singleCopterInfo is FlyToFlightTaskSingleCopterInfo)
|
||
// {
|
||
// var info = singleCopterInfo as FlyToFlightTaskSingleCopterInfo;
|
||
// this.FlyToLat = info.TargetLat;
|
||
// this.FlyToLng = info.TargetLng;
|
||
// this.FlyToAlt = info.TargetAlt;
|
||
// }
|
||
// }
|
||
// }
|
||
//};
|
||
//this.PropertyChanged += (sender, e) =>
|
||
//{
|
||
// switch (e.PropertyName)
|
||
// {
|
||
// case nameof(FlyToLat):
|
||
// InvokeForSelectedSingleCopterInfos(info => info.TargetLat = FlyToLat);
|
||
// break;
|
||
// case nameof(FlyToLng):
|
||
// InvokeForSelectedSingleCopterInfos(info => info.TargetLng = FlyToLng);
|
||
// break;
|
||
// case nameof(FlyToAlt):
|
||
// InvokeForSelectedSingleCopterInfos(info => info.TargetAlt = FlyToAlt);
|
||
// break;
|
||
// case nameof(StaggerRoutes):
|
||
// {
|
||
// var modifyingTask = _flightTaskManager.SelectedTask as FlyToFlightTask;
|
||
// if (modifyingTask != null)
|
||
// {
|
||
// modifyingTask.StaggerAlt = this.StaggerRoutes;
|
||
// }
|
||
// }
|
||
// break;
|
||
// default:
|
||
// break;
|
||
// }
|
||
//};
|
||
}
|
||
|
||
private FlightTaskManager _flightTaskManager;
|
||
private CopterManager _copterManager;
|
||
public FlightTaskManager FlightTaskManager { get { return _flightTaskManager; } }
|
||
public CopterManager CopterManager { get { return _copterManager; } }
|
||
|
||
//private void InvokeForSelectedSingleCopterInfos(Action<FlightTaskSingleCopterInfo> action)
|
||
//{
|
||
// var modifyingTask = _flightTaskManager.SelectedTask as FlyToFlightTask;
|
||
// if (modifyingTask != null && _copterManager.SelectedCopters.Count() == 1) // 林俊清, 20150731, 目前不处理多选的情况。
|
||
// {
|
||
// modifyingTask.FlyToFlightTaskSingleCopterInfos
|
||
// .Where(i => _copterManager.SelectedCopters.FirstOrDefault() == i.Copter)
|
||
// .ForEach(action);
|
||
|
||
// // TODO: 林俊清, 20150731, 添加同时改多个 SingleCopterInfo 的程序。
|
||
// //.Where(i => _copterManager.SelectedCopters.Contains(i.Copter))
|
||
// }
|
||
//}
|
||
|
||
private bool _CanModifySingleCopterInfo = true;
|
||
public bool CanModifySingleCopterInfo
|
||
{
|
||
get { return _CanModifySingleCopterInfo; }
|
||
set { Set(nameof(CanModifySingleCopterInfo), ref _CanModifySingleCopterInfo, value); }
|
||
}
|
||
private double _Distancevalue;
|
||
public double Distancevalue
|
||
{
|
||
get { return _Distancevalue; }
|
||
set { Set(nameof(Distancevalue), ref _Distancevalue, value); }
|
||
}
|
||
|
||
private int _txtStarindex=0;
|
||
public int txtStarindex
|
||
{
|
||
get { return _txtStarindex; }
|
||
set { Set(nameof(txtStarindex), ref _txtStarindex, value); }
|
||
}
|
||
|
||
private int _txtendindex=0;
|
||
public int txtendindex
|
||
{
|
||
get { return _txtendindex; }
|
||
set { Set(nameof(txtendindex), ref _txtendindex, value); }
|
||
}
|
||
|
||
|
||
|
||
|
||
private double _FlyToLat;
|
||
public double FlyToLat
|
||
{
|
||
get { return _FlyToLat; }
|
||
set { Set(nameof(FlyToLat), ref _FlyToLat, value); }
|
||
}
|
||
|
||
private double _FlyToLng;
|
||
public double FlyToLng
|
||
{
|
||
get { return _FlyToLng; }
|
||
set { Set(nameof(FlyToLng), ref _FlyToLng, value); }
|
||
}
|
||
|
||
private float _FlyToAlt;
|
||
public float FlyToAlt
|
||
{
|
||
get { return _FlyToAlt; }
|
||
set { Set(nameof(FlyToAlt), ref _FlyToAlt, value); }
|
||
}
|
||
|
||
private bool _StaggerRoutes;
|
||
public bool StaggerRoutes
|
||
{
|
||
get { return _StaggerRoutes; }
|
||
set { Set(nameof(StaggerRoutes), ref _StaggerRoutes, value); }
|
||
}
|
||
|
||
private ICommand _ExportTasksCommand;
|
||
public ICommand ExportTasksCommand
|
||
{
|
||
get
|
||
{
|
||
return _ExportTasksCommand ?? (_ExportTasksCommand = new RelayCommand(() =>
|
||
{
|
||
var exportedText = _flightTaskManager.ExportTasks();
|
||
var dialog = new SaveFileDialog
|
||
{
|
||
DefaultExt = "fcg",
|
||
Filter = "编队飞行任务 (*.fcg)|*.fcg"
|
||
};
|
||
if (dialog.ShowDialog() == true)
|
||
{
|
||
File.WriteAllText(dialog.FileName, exportedText);
|
||
}
|
||
}));
|
||
}
|
||
}
|
||
|
||
private ICommand _ImportTasksCommand;
|
||
public ICommand ImportTasksCommand
|
||
{
|
||
get
|
||
{
|
||
return _ImportTasksCommand ?? (_ImportTasksCommand = new RelayCommand(() =>
|
||
{
|
||
var dialog = new OpenFileDialog
|
||
{
|
||
DefaultExt = "fcg",
|
||
Filter = "编队飞行任务 (*.fcg)|*.fcg"
|
||
};
|
||
if (dialog.ShowDialog() == true)
|
||
{
|
||
int _startindex = txtStarindex;
|
||
int _endindex= txtendindex;
|
||
|
||
var tasksText = File.ReadAllText(dialog.FileName);
|
||
if ((txtStarindex == 0) && (txtendindex == 0))
|
||
_flightTaskManager.ImportTasks(tasksText);
|
||
else
|
||
{
|
||
_endindex = txtendindex;
|
||
if (_startindex == 0)
|
||
_startindex = 1;
|
||
if (_endindex == 0)
|
||
_endindex = _startindex;
|
||
_flightTaskManager.ImportTasksindex(tasksText, _startindex, _endindex);
|
||
}
|
||
|
||
|
||
}
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
private ICommand _LevelAverageCommand;
|
||
public ICommand LevelAverageCommand
|
||
{
|
||
get
|
||
{
|
||
return _LevelAverageCommand ?? (_LevelAverageCommand = new RelayCommand<int>(async =>
|
||
{
|
||
double maxlng = 0;
|
||
double minlng = 0;
|
||
double tlng = 0;
|
||
double avgl = 0;
|
||
|
||
|
||
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
bool copterisselect;
|
||
int selectednumber = _copterManager.SelectedCopters.Count() - 1;
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
if (minlng == 0)
|
||
minlng = tlng;
|
||
if (tlng > maxlng)
|
||
maxlng = tlng;
|
||
else if (tlng < minlng)
|
||
minlng = tlng;
|
||
|
||
}
|
||
}
|
||
avgl = (maxlng - minlng) / selectednumber;
|
||
int coptnum = 0;
|
||
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = minlng + avgl * coptnum;
|
||
coptnum++;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
///////////////////////
|
||
|
||
// await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
private ICommand _VerticlAverageCommand;
|
||
public ICommand VerticlAverageCommand
|
||
{
|
||
get
|
||
{
|
||
return _VerticlAverageCommand ?? (_VerticlAverageCommand = new RelayCommand<int>(async =>
|
||
{
|
||
double maxlat = 0;
|
||
double tlat = 0;
|
||
double minlat = 0;
|
||
|
||
double avgl = 0;
|
||
|
||
|
||
//////////////////////
|
||
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
bool copterisselect;
|
||
int selectednumber = _copterManager.SelectedCopters.Count() - 1;
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
if (minlat == 0)
|
||
minlat = tlat;
|
||
if (tlat > maxlat)
|
||
maxlat = tlat;
|
||
else if (tlat < minlat)
|
||
minlat = tlat;
|
||
|
||
}
|
||
}
|
||
avgl = (maxlat - minlat) / selectednumber;
|
||
int coptnum = 0;
|
||
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = maxlat - avgl * coptnum;
|
||
coptnum++;
|
||
|
||
}
|
||
}
|
||
|
||
///////////////////////
|
||
|
||
// await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
private ICommand _LevelAlignmentCommand;
|
||
public ICommand LevelAlignmentCommand
|
||
{
|
||
get
|
||
{
|
||
return _LevelAlignmentCommand ?? (_LevelAlignmentCommand = new RelayCommand<int>(async =>
|
||
{
|
||
double maxlat = 0;
|
||
double tlat = 0;
|
||
|
||
|
||
|
||
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
bool copterisselect;
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
if (tlat > maxlat)
|
||
maxlat = tlat;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = maxlat;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
//await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
private ICommand _VerticlAlignmentCommand;
|
||
public ICommand VerticlAlignmentCommand
|
||
{
|
||
get
|
||
{
|
||
return _VerticlAlignmentCommand ?? (_VerticlAlignmentCommand = new RelayCommand<int>(async =>
|
||
{
|
||
|
||
double maxlng = 0;
|
||
double tlng = 0;
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
bool copterisselect;
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
if (tlng > maxlng)
|
||
maxlng = tlng;
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = maxlng;
|
||
|
||
}
|
||
}
|
||
|
||
//await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public static double DistanceOfTwoPoints(double lng1, double lat1, double lng2, double lat2, GaussSphere gs)
|
||
{
|
||
double radLat1 = Rad(lat1);
|
||
double radLat2 = Rad(lat2);
|
||
double a = radLat1 - radLat2;
|
||
double b = Rad(lng1) - Rad(lng2);
|
||
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
|
||
Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
|
||
s = s * (gs == GaussSphere.WGS84 ? 6378137.0 : (gs == GaussSphere.Xian80 ? 6378140.0 : 6378245.0));
|
||
s = Math.Round(s * 10000) / 10000;
|
||
return s;
|
||
}
|
||
|
||
private static double Rad(double d)
|
||
{
|
||
return d * Math.PI / 180.0;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 高斯投影中所选用的参考椭球
|
||
/// </summary>
|
||
public enum GaussSphere
|
||
{
|
||
Beijing54,
|
||
Xian80,
|
||
WGS84,
|
||
}
|
||
|
||
//水平旋转
|
||
private ICommand _LevelRotateCommand;
|
||
public ICommand LevelRotateCommand
|
||
{
|
||
get
|
||
{
|
||
return _LevelRotateCommand ?? (_LevelRotateCommand = new RelayCommand<int>(async RotateLine =>
|
||
{
|
||
|
||
|
||
|
||
double lngsum = 0;
|
||
double latsum = 0;
|
||
int selectcount = 0;
|
||
double centlng = 0;
|
||
double centlat = 0;
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
bool copterisselect;
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
lngsum+= _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
latsum+= _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
selectcount++;
|
||
|
||
}
|
||
}
|
||
//计算旋转中心
|
||
if (selectcount > 0)
|
||
{
|
||
centlng = lngsum / selectcount;
|
||
centlat = latsum / selectcount;
|
||
}
|
||
else return;
|
||
|
||
|
||
//////////计算旋转,经测试用下面的函数组合计算比较准确
|
||
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
{
|
||
double lpDistance = CalculationLogLatDistance.GetDistanceOne(centlng, centlat,
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng,
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
|
||
|
||
CalculationLogLatDistance.MyLatLng mypos1, mypos2;
|
||
mypos1 = new CalculationLogLatDistance.MyLatLng(centlng, centlat);
|
||
mypos2 = new CalculationLogLatDistance.MyLatLng(_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng
|
||
, _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
|
||
double lpAzimuth = CalculationLogLatDistance.getAngle(mypos1, mypos2);
|
||
double lng2 = 0;
|
||
double lat2=0;
|
||
CalculationLogLatDistance.ConvertDistanceToLogLat(centlng, centlat, lpDistance,
|
||
lpAzimuth + (double)RotateLine,out lng2, out lat2);
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = lng2;
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = lat2;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
////
|
||
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
//垂直旋转
|
||
private ICommand _VerticlRotateCommand;
|
||
public ICommand VerticlRotateCommand
|
||
{
|
||
get
|
||
{
|
||
return _VerticlRotateCommand ?? (_VerticlRotateCommand = new RelayCommand<int>(async RotateLine =>
|
||
{
|
||
|
||
|
||
|
||
double lngsum = 0;
|
||
double latsum = 0;
|
||
double altsum = 0;
|
||
int selectcount = 0;
|
||
double centlng = 0;
|
||
double centlat = 0;
|
||
double centalt = 0;
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
bool copterisselect;
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
lngsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
latsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
altsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt;
|
||
selectcount++;
|
||
|
||
}
|
||
}
|
||
//计算旋转中心
|
||
if (selectcount > 0)
|
||
{
|
||
centlng = lngsum / selectcount;
|
||
centlat = latsum / selectcount;
|
||
centalt = altsum / selectcount;
|
||
}
|
||
else return;
|
||
|
||
|
||
//////////计算旋转,经测试用下面的函数组合计算比较准确
|
||
double k = (double)RotateLine / 180 * Math.PI;
|
||
double dx = 0;
|
||
double dy = 0;
|
||
double ax = 0;
|
||
double ay = 0;
|
||
double tlng = 0;
|
||
double tlat = 0;
|
||
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
{
|
||
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
//纬度方向距离(单位m)
|
||
ax = CalculationLogLatDistance.GetDistanceOne(tlng, centlat,tlng,tlat) *1000;
|
||
//方向角用于正负,0为正,180为负
|
||
CalculationLogLatDistance.MyLatLng mypos1, mypos2;
|
||
mypos1 = new CalculationLogLatDistance.MyLatLng(tlng,centlat);
|
||
mypos2 = new CalculationLogLatDistance.MyLatLng(tlng,tlat);
|
||
double lpAzimuth = CalculationLogLatDistance.getAngle(mypos1, mypos2);
|
||
if (lpAzimuth > 90)
|
||
ax = -ax;
|
||
|
||
|
||
//高度方向距离(单位m)
|
||
ay = (_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt - centalt);
|
||
|
||
dx = ax * Math.Cos(k) + ay * Math.Sin(k);
|
||
dy = -ax * Math.Sin(k) + ay * Math.Cos(k);
|
||
|
||
//新高度(米)
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt= (float)(centalt + dy);
|
||
//计算新纬度
|
||
double lng2 = 0;
|
||
double lat2 = 0;
|
||
if (dx < 0)
|
||
lpAzimuth = 180;
|
||
else
|
||
lpAzimuth = 0;
|
||
dx=Math.Abs(dx);
|
||
|
||
CalculationLogLatDistance.ConvertDistanceToLogLat(
|
||
tlng,
|
||
centlat, //旋转中心纬度
|
||
dx/1000, //新距离
|
||
lpAzimuth, //方向垂直
|
||
out lng2,
|
||
out lat2);
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = lat2;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
////
|
||
|
||
|
||
|
||
|
||
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
private ICommand _AutoaltCommand;
|
||
public ICommand AutoaltCommand
|
||
{
|
||
get
|
||
{
|
||
return _AutoaltCommand ?? (_AutoaltCommand = new RelayCommand<double>(async =>
|
||
{
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
private ICommand _PrealtCommand;
|
||
public ICommand PrealtCommand
|
||
{
|
||
get
|
||
{
|
||
return _PrealtCommand ?? (_PrealtCommand = new RelayCommand<double>(async =>
|
||
{
|
||
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
{
|
||
if (_flightTaskManager.SelectedTaskIndex > 1)
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt =
|
||
_flightTaskManager.Tasks[_flightTaskManager.SelectedTaskIndex - 1].SingleCopterInfos[i].TargetAlt;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
//计算距离
|
||
private ICommand _calDistinceCommand;
|
||
public ICommand calDistinceCommand
|
||
{
|
||
get
|
||
{
|
||
return _calDistinceCommand ?? (_calDistinceCommand = new RelayCommand<double>(async =>
|
||
{
|
||
|
||
double lng1=0, lat1=0, alt1=0, lng2=0, lat2=0, alt2=0;
|
||
double distance = 0;
|
||
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
{
|
||
if (lng1 == 0)
|
||
{
|
||
lng1 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
lat1 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
alt1 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt;
|
||
}
|
||
else
|
||
if (lng2 == 0)
|
||
{
|
||
lng2 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
lat2 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
alt2 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt;
|
||
}
|
||
else break;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|
||
if ((lng1 != 0) && (lng2 != 0))
|
||
{
|
||
|
||
distance = GeographyUtils.CalcDistance(
|
||
lat1, lng1, alt1,
|
||
lat2, lng2, alt2);
|
||
distance = ((double)Math.Round(distance * 100) / 100);
|
||
|
||
}
|
||
Distancevalue = distance;
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
//缩放
|
||
private ICommand _ScaleCommand;
|
||
public ICommand ScaleCommand
|
||
{
|
||
get
|
||
{
|
||
return _ScaleCommand ?? (_ScaleCommand = new RelayCommand<int>(async ScaleVale =>
|
||
{
|
||
|
||
|
||
double lngsum = 0;
|
||
double latsum = 0;
|
||
int selectcount = 0;
|
||
double centlng = 0;
|
||
double centlat = 0;
|
||
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
|
||
bool copterisselect;
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
copterisselect = false;
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
copterisselect = true;
|
||
|
||
}
|
||
if (copterisselect)
|
||
{
|
||
|
||
lngsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
|
||
latsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
|
||
selectcount++;
|
||
|
||
}
|
||
}
|
||
//计算缩放中心
|
||
if (selectcount > 0)
|
||
{
|
||
centlng = lngsum / selectcount;
|
||
centlat = latsum / selectcount;
|
||
}
|
||
else return;
|
||
|
||
|
||
//////////计算旋转,经测试用下面的函数组合计算比较准确
|
||
|
||
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
|
||
{
|
||
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
|
||
foreach (var capter in _copterManager.SelectedCopters)
|
||
{
|
||
if (capter == selectedCopter)
|
||
{
|
||
double lpDistance = CalculationLogLatDistance.GetDistanceOne(centlng, centlat,
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng,
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
|
||
|
||
CalculationLogLatDistance.MyLatLng mypos1, mypos2;
|
||
mypos1 = new CalculationLogLatDistance.MyLatLng(centlng, centlat);
|
||
mypos2 = new CalculationLogLatDistance.MyLatLng(_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng
|
||
, _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
|
||
double lpAzimuth = CalculationLogLatDistance.getAngle(mypos1, mypos2);
|
||
double lng2 = 0;
|
||
double lat2 = 0;
|
||
CalculationLogLatDistance.ConvertDistanceToLogLat(centlng, centlat, lpDistance * (double)ScaleVale/100,
|
||
lpAzimuth , out lng2, out lat2);
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = lng2;
|
||
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = lat2;
|
||
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
|
||
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
|
||
|
||
}));
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|