1.加入垂直旋转,图形绕中心纬度轴顺时针旋转,由于没有计算高度对距离的影响所以旋转前必须是同一个高度

2.加入缩放控制,也是基于平面的,不能用于3D情况
3.加入同时起飞和同时降落数量的设置,并保存入飞行任务中
4.跑马灯飞机编号允许人工输入
5.计算距离改为两个选择的飞机航点之间,不用输入飞机序号
This commit is contained in:
pxzleo 2017-03-13 02:49:26 +08:00
parent 07f5b39814
commit cd3f894449
9 changed files with 380 additions and 84 deletions

View File

@ -101,11 +101,11 @@ namespace Plane.FormationCreator.Formation
break; break;
case FlightTaskType.TakeOff: case FlightTaskType.TakeOff:
//多架同时起飞 //多架同时起飞
await MutilRunTakeOffTaskAsync(5).ConfigureAwait(false); await MutilRunTakeOffTaskAsync().ConfigureAwait(false);
break; break;
case FlightTaskType.ReturnToLand: // Added by ZJF case FlightTaskType.ReturnToLand: // Added by ZJF
//多架同时返航 //多架同时返航
await MutilRunReturnToLandTaskAsync(5).ConfigureAwait(false); await MutilRunReturnToLandTaskAsync().ConfigureAwait(false);
break; break;
default: default:
throw new InvalidOperationException(); throw new InvalidOperationException();

View File

@ -81,6 +81,27 @@ namespace Plane.FormationCreator.Formation
set { Set(nameof(OriginLat), ref _OriginLat, value); } set { Set(nameof(OriginLat), ref _OriginLat, value); }
} }
private int _TakeOffNumAttr = 1;
public int TakeOffNumAttr
{
get { return _TakeOffNumAttr; }
set
{
Set(nameof(TakeOffNumAttr), ref _TakeOffNumAttr, value);
bool takeOffTaskExisted = Tasks.Count >= 1;
FlightTask takeOffTask;
if (takeOffTaskExisted)
{
takeOffTask = Tasks[0];
takeOffTask.TakeOffNumAttr = TakeOffNumAttr;
}
}
}
private double _OriginLng; private double _OriginLng;
public double OriginLng public double OriginLng
{ {
@ -101,6 +122,7 @@ namespace Plane.FormationCreator.Formation
else else
{ {
takeOffTask = new FlightTask(FlightTaskType.TakeOff); takeOffTask = new FlightTask(FlightTaskType.TakeOff);
takeOffTask.TakeOffNumAttr = TakeOffNumAttr;
Tasks.Add(takeOffTask); Tasks.Add(takeOffTask);
TaskAdded?.Invoke(this, new FlightTaskAddedEventArgs { AddedTask = takeOffTask }); TaskAdded?.Invoke(this, new FlightTaskAddedEventArgs { AddedTask = takeOffTask });
} }
@ -338,14 +360,16 @@ namespace Plane.FormationCreator.Formation
} }
// added by ZJF // added by ZJF
private void RestoreReturnToLandTask(IEnumerable<ICopter> copters) private void RestoreReturnToLandTask(IEnumerable<ICopter> copters,int retnumber,int rtlalt)
{ {
if (copters == null || !copters.Any()) return; if (copters == null || !copters.Any()) return;
AppEx.Current.AppMode = AppMode.ModifyingTask; AppEx.Current.AppMode = AppMode.ModifyingTask;
var lastTask = Tasks.LastOrDefault(); var lastTask = Tasks.LastOrDefault();
var RTLTask = new FlightTask(FlightTaskType.ReturnToLand); var RTLTask = new FlightTask(FlightTaskType.ReturnToLand);
foreach (var copter in copters) RTLTask.RetNumAttr = retnumber;
RTLTask.RTLAlt = rtlalt;
foreach (var copter in copters)
{ {
var newSingleCopterInfo = FlightTaskSingleCopterInfo.CreateForReturnToLandTask(copter, targetAlt:10); var newSingleCopterInfo = FlightTaskSingleCopterInfo.CreateForReturnToLandTask(copter, targetAlt:10);
RTLTask.SingleCopterInfos.Add(newSingleCopterInfo); RTLTask.SingleCopterInfos.Add(newSingleCopterInfo);
@ -493,7 +517,10 @@ namespace Plane.FormationCreator.Formation
switch (type) switch (type)
{ {
case FlightTaskType.TakeOff: case FlightTaskType.TakeOff:
return new { type = type }; return new {
type = type,
takeoffnumber = TakeOffNumAttr
};
case FlightTaskType.FlyTo: case FlightTaskType.FlyTo:
return new return new
{ {
@ -594,7 +621,10 @@ namespace Plane.FormationCreator.Formation
case FlightTaskType.ReturnToLand: // added by ZJF case FlightTaskType.ReturnToLand: // added by ZJF
return new return new
{ {
type = type type = type,
rtlalt= task.RTLAlt,
retnumber = task.RetNumAttr
}; };
default: default:
throw new NotImplementedException(type + " task export not implemented."); throw new NotImplementedException(type + " task export not implemented.");
@ -613,6 +643,7 @@ namespace Plane.FormationCreator.Formation
{ {
case FlightTaskType.TakeOff: case FlightTaskType.TakeOff:
// AddTakeOffTask(copters); // added by ZJF // AddTakeOffTask(copters); // added by ZJF
TakeOffNumAttr = task.takeoffnumber;
break; break;
case FlightTaskType.FlyTo: case FlightTaskType.FlyTo:
RestoreFlyToTask((bool)task.staggerRoutes, task.singleCopterInfos); RestoreFlyToTask((bool)task.staggerRoutes, task.singleCopterInfos);
@ -633,7 +664,7 @@ namespace Plane.FormationCreator.Formation
RestoreSimpleCircleTask(task.singleCopterInfos); RestoreSimpleCircleTask(task.singleCopterInfos);
break; break;
case FlightTaskType.ReturnToLand: case FlightTaskType.ReturnToLand:
RestoreReturnToLandTask(copters); RestoreReturnToLandTask(copters, (int)task.retnumber, (int)task.rtlalt);
break; break;
} }
} }

View File

@ -66,6 +66,18 @@ namespace Plane.FormationCreator.Formation
Set(nameof(flashPeriodAttr), ref _flashPeriodAttr, value); Set(nameof(flashPeriodAttr), ref _flashPeriodAttr, value);
} }
} }
private string Name2Index(string name) // 获取指定copter名字对应的序号
{
int index = -1;
for (int i = 0; i < SingleCopterInfos.Count; i++)
{
if (name.Equals(SingleCopterInfos[i].Copter.Name))
{
return i.ToString();
}
}
return index.ToString();
}
// 闪烁的飞机名字编号 // 闪烁的飞机名字编号
private string _flashCopterNameArray = ""; private string _flashCopterNameArray = "";
@ -75,7 +87,16 @@ namespace Plane.FormationCreator.Formation
set set
{ {
Set(nameof(flashCopterNameArray), ref _flashCopterNameArray, value); Set(nameof(flashCopterNameArray), ref _flashCopterNameArray, value);
}
flashCopterIndexArray = "";
string[] copterArray = flashCopterNameArray.Split(',');
for (int i = 0; i < copterArray.Length; i++)
{
flashCopterIndexArray += Name2Index(copterArray[i])+',';
}
}
} }
// 闪烁的飞机序号编号 // 闪烁的飞机序号编号
@ -227,6 +248,7 @@ namespace Plane.FormationCreator.Formation
// LED灯一个接一个全亮 // LED灯一个接一个全亮
for (int i = 0; i < copterArray.Length; i++) for (int i = 0; i < copterArray.Length; i++)
{ {
if (copterArray[i] == "") break;
int index = int.Parse(copterArray[i]); int index = int.Parse(copterArray[i]);
var info = infos[index]; var info = infos[index];
await LEDFlashTaskFlySingleCopterAsync(info, true); await LEDFlashTaskFlySingleCopterAsync(info, true);

View File

@ -14,7 +14,15 @@ namespace Plane.FormationCreator.Formation
get { return _RTLAlt; } get { return _RTLAlt; }
set { Set(nameof(RTLAlt), ref _RTLAlt, value); } set { Set(nameof(RTLAlt), ref _RTLAlt, value); }
} }
private int _RetNumAttr = 1;
public int RetNumAttr
{
get { return _RetNumAttr; }
set
{
Set(nameof(RetNumAttr), ref _RetNumAttr, value);
}
}
public async Task RunReturnToLandTaskAsync() public async Task RunReturnToLandTaskAsync()
{ {
int TaskCount = _flightTaskManager.Tasks.Count(); int TaskCount = _flightTaskManager.Tasks.Count();
@ -49,7 +57,7 @@ namespace Plane.FormationCreator.Formation
} }
} }
public async Task MutilRunReturnToLandTaskAsync(int ReturnCount) public async Task MutilRunReturnToLandTaskAsync()
{ {
int TaskCount = _flightTaskManager.Tasks.Count(); int TaskCount = _flightTaskManager.Tasks.Count();
if (TaskCount > 1) if (TaskCount > 1)
@ -57,18 +65,18 @@ namespace Plane.FormationCreator.Formation
var infos = SingleCopterInfos; var infos = SingleCopterInfos;
int copterCount = infos.Count; int copterCount = infos.Count;
int integerPart = copterCount / ReturnCount; int integerPart = copterCount / RetNumAttr;
int residualPart = copterCount % ReturnCount; int residualPart = copterCount % RetNumAttr;
var tasksTmp = new Task[infos.Count]; var tasksTmp = new Task[infos.Count];
for (int i = 0; i < integerPart; i++) for (int i = 0; i < integerPart; i++)
{ {
var tasksRetutn = new Task[ReturnCount]; var tasksRetutn = new Task[RetNumAttr];
for (int j = ReturnCount * i; j < ReturnCount * (i + 1); j++) for (int j = RetNumAttr * i; j < RetNumAttr * (i + 1); j++)
{ {
var info = infos[j]; var info = infos[j];
int indexTmp = j - ReturnCount * i; int indexTmp = j - RetNumAttr * i;
// var copter = info.Copter; // var copter = info.Copter;
if (info.RTLStage <= 1) // 当前阶段小于等于1时进入 if (info.RTLStage <= 1) // 当前阶段小于等于1时进入
@ -83,12 +91,12 @@ namespace Plane.FormationCreator.Formation
await Task.WhenAll(tasksRetutn).ConfigureAwait(false); await Task.WhenAll(tasksRetutn).ConfigureAwait(false);
var tasksRetutn1 = new Task[ReturnCount]; var tasksRetutn1 = new Task[RetNumAttr];
for (int j = ReturnCount * i; j < ReturnCount * (i + 1); j++) for (int j = RetNumAttr * i; j < RetNumAttr * (i + 1); j++)
{ {
var info = infos[j]; var info = infos[j];
int indexTmp = j - ReturnCount * i; int indexTmp = j - RetNumAttr * i;
// var copter = info.Copter; // var copter = info.Copter;
if (info.RTLStage == 2) // 当前阶段小于等于1时进入 if (info.RTLStage == 2) // 当前阶段小于等于1时进入
@ -108,7 +116,7 @@ namespace Plane.FormationCreator.Formation
if (_flightTaskManager.IsPaused == false) if (_flightTaskManager.IsPaused == false)
{ {
for (int j = ReturnCount * i; j < ReturnCount * (i + 1); j++) for (int j = RetNumAttr * i; j < RetNumAttr * (i + 1); j++)
{ {
var info = infos[j]; var info = infos[j];
info.RTLStage = 0; info.RTLStage = 0;
@ -123,10 +131,10 @@ namespace Plane.FormationCreator.Formation
{ {
var tasksreturn = new Task[residualPart]; var tasksreturn = new Task[residualPart];
for (int j = integerPart * ReturnCount; j < ReturnCount * integerPart + residualPart; j++) for (int j = integerPart * RetNumAttr; j < RetNumAttr * integerPart + residualPart; j++)
{ {
var info = infos[j]; var info = infos[j];
int indexTmp = j - ReturnCount * integerPart; int indexTmp = j - RetNumAttr * integerPart;
// var copter = info.Copter; // var copter = info.Copter;
if (info.RTLStage <= 1) // 当前阶段小于等于1时进入 if (info.RTLStage <= 1) // 当前阶段小于等于1时进入
{ {
@ -141,10 +149,10 @@ namespace Plane.FormationCreator.Formation
var tasksRetutn1 = new Task[residualPart]; var tasksRetutn1 = new Task[residualPart];
for (int j = integerPart * ReturnCount; j < ReturnCount * integerPart + residualPart; j++) for (int j = integerPart * RetNumAttr; j < RetNumAttr * integerPart + residualPart; j++)
{ {
var info = infos[j]; var info = infos[j];
int indexTmp = j - ReturnCount * integerPart; int indexTmp = j - RetNumAttr * integerPart;
// var copter = info.Copter; // var copter = info.Copter;
if (info.RTLStage == 2) // 当前阶段小于等于1时进入 if (info.RTLStage == 2) // 当前阶段小于等于1时进入
{ {
@ -160,7 +168,7 @@ namespace Plane.FormationCreator.Formation
if (_flightTaskManager.IsPaused == false) if (_flightTaskManager.IsPaused == false)
{ {
for (int j = integerPart * ReturnCount; j < ReturnCount * integerPart + residualPart; j++) for (int j = integerPart * RetNumAttr; j < RetNumAttr * integerPart + residualPart; j++)
{ {
var info = infos[j]; var info = infos[j];
info.RTLStage = 0; info.RTLStage = 0;
@ -177,7 +185,7 @@ namespace Plane.FormationCreator.Formation
//原地下降高度到15米然后返回起飞点 //原地下降高度到15米然后返回起飞点
private async Task ReturnToLandTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info) private async Task ReturnToLandTaskFlySingleCopterAsync(FlightTaskSingleCopterInfo info)
{ {
float takeOffAlt = 15.0f; float takeOffAlt = RTLAlt;
int TaskCount = _flightTaskManager.Tasks.Count(); int TaskCount = _flightTaskManager.Tasks.Count();
int copterIndex = SingleCopterInfos.IndexOf(info); int copterIndex = SingleCopterInfos.IndexOf(info);

View File

@ -11,6 +11,18 @@ namespace Plane.FormationCreator.Formation
{ {
public partial class FlightTask public partial class FlightTask
{ {
private int _TakeOffNumAttr = 1;
public int TakeOffNumAttr
{
get { return _TakeOffNumAttr; }
set
{
Set(nameof(TakeOffNumAttr), ref _TakeOffNumAttr, value);
}
}
public async Task RunTakeOffTaskAsync() public async Task RunTakeOffTaskAsync()
{ {
// float takeOffAlt = 15; // float takeOffAlt = 15;
@ -49,14 +61,14 @@ namespace Plane.FormationCreator.Formation
} }
// 几架飞机同时起飞参数为takeOffCount // 几架飞机同时起飞参数为takeOffCount
public async Task MutilRunTakeOffTaskAsync(int takeCount) public async Task MutilRunTakeOffTaskAsync()
{ {
int TaskCount = _flightTaskManager.Tasks.Count(); int TaskCount = _flightTaskManager.Tasks.Count();
if (TaskCount > 1) if (TaskCount > 1)
{ {
var infos = SingleCopterInfos; var infos = SingleCopterInfos;
int takeOffCount = takeCount; int takeOffCount = TakeOffNumAttr;
int copterCount = infos.Count; int copterCount = infos.Count;
int integerPart = copterCount / takeOffCount; int integerPart = copterCount / takeOffCount;
int residualPart = copterCount % takeOffCount; int residualPart = copterCount % takeOffCount;

View File

@ -122,8 +122,8 @@ namespace Plane.FormationCreator
case Key.W: case Key.W:
case Key.S: case Key.S:
{ {
if (_flightTaskManager.CurrentRunningTask==null ) if ((_flightTaskManager.CurrentRunningTask == null) && (_flightTaskManager.SelectedTask != null))
{ {
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault(); var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
@ -168,7 +168,7 @@ namespace Plane.FormationCreator
{ {
if (_flightTaskManager.CurrentRunningTask == null) if ((_flightTaskManager.CurrentRunningTask == null)&&(_flightTaskManager.SelectedTask!=null))
{ {
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault(); var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();

View File

@ -11,6 +11,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Input; using System.Windows.Input;
using Plane.Geography;
namespace Plane.FormationCreator.ViewModels namespace Plane.FormationCreator.ViewModels
{ {
@ -142,7 +143,12 @@ namespace Plane.FormationCreator.ViewModels
get { return _CanModifySingleCopterInfo; } get { return _CanModifySingleCopterInfo; }
set { Set(nameof(CanModifySingleCopterInfo), ref _CanModifySingleCopterInfo, value); } set { Set(nameof(CanModifySingleCopterInfo), ref _CanModifySingleCopterInfo, value); }
} }
private double _Distancevalue;
public double Distancevalue
{
get { return _Distancevalue; }
set { Set(nameof(Distancevalue), ref _Distancevalue, value); }
}
private double _FlyToLat; private double _FlyToLat;
public double FlyToLat public double FlyToLat
{ {
@ -630,6 +636,9 @@ public ICommand VerticlAlignmentCommand
})); }));
} }
} }
//垂直旋转 //垂直旋转
@ -640,6 +649,192 @@ public ICommand VerticlAlignmentCommand
{ {
return _VerticlRotateCommand ?? (_VerticlRotateCommand = new RelayCommand<int>(async RotateLine => 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) 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 _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();
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)
{
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 lngsum = 0;
double latsum = 0; double latsum = 0;
int selectcount = 0; int selectcount = 0;
@ -666,20 +861,16 @@ public ICommand VerticlAlignmentCommand
} }
} }
//计算旋转中心 //计算缩放中心
if (selectcount > 0) if (selectcount > 0)
{ {
centlng = lngsum / selectcount; centlng = lngsum / selectcount;
centlat = latsum / selectcount; centlat = latsum / selectcount;
} }
else return; else return;
double dx = 0;
double dy = 0;
double ax = 0; //////////计算旋转,经测试用下面的函数组合计算比较准确
double ay = 0;
double x = centlng;
double y = centlat;
double k = (double)RotateLine / 180 * Math.PI;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++) for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{ {
@ -688,12 +879,21 @@ public ICommand VerticlAlignmentCommand
{ {
if (capter == selectedCopter) if (capter == selectedCopter)
{ {
ax = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng; double lpDistance = CalculationLogLatDistance.GetDistanceOne(centlng, centlat,
ay = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat; _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng,
dx = (ax - x) * Math.Cos(k) + (ay - y) * Math.Sin(k) + x; //此为最后的横坐标 _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
dy = -(ax - x) * Math.Sin(k) + (ay - y) * Math.Cos(k) + y; //此为最后的纵坐标
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = dx; CalculationLogLatDistance.MyLatLng mypos1, mypos2;
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = dy; 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;
} }
@ -701,17 +901,11 @@ public ICommand VerticlAlignmentCommand
} }
} }
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。 await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
})); }));
} }
} }
} }
} }

View File

@ -7,10 +7,9 @@
xmlns:vm="clr-namespace:Plane.FormationCreator.ViewModels" xmlns:vm="clr-namespace:Plane.FormationCreator.ViewModels"
xmlns:m="clr-namespace:Plane.FormationCreator.Formation" xmlns:m="clr-namespace:Plane.FormationCreator.Formation"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Height="400">
d:DesignWidth="300">
<StackPanel Orientation="Vertical"> <StackPanel Orientation="Vertical" Margin="0,0,0,-28.5">
<StackPanel.Resources> <StackPanel.Resources>
<Style TargetType="StackPanel"> <Style TargetType="StackPanel">
<Setter Property="Orientation" <Setter Property="Orientation"
@ -18,21 +17,30 @@
</Style> </Style>
</StackPanel.Resources> </StackPanel.Resources>
<StackPanel> <StackPanel>
<Button Content="导出任务" <Button Content="导出任务"
Margin="0,5,0,0" Margin="0,5,0,0"
Command="{Binding ExportTasksCommand}" /> Command="{Binding ExportTasksCommand}" />
<Button Content="导入任务" <Button Content="导入任务"
Margin="5,5,0,0" Margin="5,5,0,0"
Command="{Binding ImportTasksCommand}" /> Command="{Binding ImportTasksCommand}" />
<TextBlock Text="同时起飞数量:" Margin="5,10,5,0" />
<TextBox x:Name="txttakeoff"
Width="25"
Margin="0,5,5,0"
VerticalContentAlignment="Center"
DataContext="{Binding FlightTaskManager}"
Text="{Binding TakeOffNumAttr, UpdateSourceTrigger=PropertyChanged}"
/>
</StackPanel> </StackPanel>
<StackPanel> <StackPanel>
<Button Content="上对齐" <Button Content="上对齐"
Margin="0,5,5,0" Margin="0,5,5,0"
Command="{Binding LevelAlignmentCommand}" /> Command="{Binding LevelAlignmentCommand}" />
<Button Content="右对齐" <Button Content="右对齐"
Margin="0,5,5,0" Margin="0,5,5,0"
Command="{Binding VerticlAlignmentCommand}" /> Command="{Binding VerticlAlignmentCommand}" />
<Button Content="水平均分" <Button Content="水平均分"
@ -55,43 +63,46 @@
Command="{Binding VerticlRotateCommand}" Command="{Binding VerticlRotateCommand}"
CommandParameter="{Binding ElementName=txtAlignmentLine, Path=Text}"/> CommandParameter="{Binding ElementName=txtAlignmentLine, Path=Text}"/>
<TextBox x:Name="txtAlignmentLine" <TextBox x:Name="txtAlignmentLine"
Width="30" Width="45"
Margin="0,5,5,0" Margin="0,5,5,0"
Text="0" Text="0"
VerticalContentAlignment="Center" /> VerticalContentAlignment="Center" />
<TextBlock Text="度" Margin="0, 5, 5, 0"/> <TextBlock Text="度" Margin="0, 10, 5, 0"/>
</StackPanel>
<TextBlock Text="垂直旋转前必须高度相同需要45度表演请转-135度" Margin="0, 10, 5, 0"/>
</StackPanel>
<StackPanel> <StackPanel>
<Button Content="缩放比例"
Margin="0,5,5,0"
Command="{Binding ScaleCommand}"
CommandParameter="{Binding ElementName=txtScaleVale, Path=Text}"/>
<TextBox x:Name="txtScaleVale"
Width="40"
Margin="0,5,5,0"
Text="100"
VerticalContentAlignment="Center" />
<TextBlock Text="%" Margin="0, 10, 5, 0"/>
<Button Content="计算距离" <Button Content="计算距离"
Margin="0,5,5,0" Click="Button_Click" Margin="0,5,5,0"
Command="{Binding calDistinceCommand}"
/> />
<TextBox Grid.Column="1"
Width="25"
Margin="0, 5, 5, 0"
HorizontalContentAlignment="Right"
Name="firstCopter"
Text="1" />
<TextBox Grid.Column="1" <TextBox
Width="25" Grid.Column="1"
Margin="0, 5, 5, 0"
HorizontalContentAlignment="Right"
Name="secondCopter"
Text="2" />
<TextBox Grid.Column="1"
Width="40" Width="40"
Margin="0, 5, 5, 0" Margin="0, 5, 5, 0"
HorizontalContentAlignment="Right" HorizontalContentAlignment="Right"
Name="distanceCopters" Text="{Binding Distancevalue, UpdateSourceTrigger=PropertyChanged}"
Text="" /> />
<TextBlock Text="米" Margin="0, 5, 5, 0"/> <TextBlock Text="米" Margin="0, 10, 5, 0"/>
</StackPanel> </StackPanel>
<TabControl Margin="0,5" <TabControl Margin="0,5"
Grid.IsSharedSizeScope="True" Grid.IsSharedSizeScope="True"
DataContext="{Binding FlightTaskManager.SelectedTask}" DataContext="{Binding FlightTaskManager.SelectedTask}"
@ -172,19 +183,23 @@
<TextBlock Text="纬度: " /> <TextBlock Text="纬度: " />
<TextBox Grid.Column="1" <TextBox Grid.Column="1"
Margin="0,5,10,0"
Text="{Binding TargetLat, UpdateSourceTrigger=PropertyChanged}" /> Text="{Binding TargetLat, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="1" <TextBlock Grid.Row="1"
Text="经度: " /> Text="经度: " />
<TextBox Grid.Row="1" <TextBox Grid.Row="1"
Grid.Column="1" Grid.Column="1"
Margin="0,5,10,0"
Text="{Binding TargetLng, UpdateSourceTrigger=PropertyChanged}" /> Text="{Binding TargetLng, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="2" <TextBlock Grid.Row="2"
Text="高度: " /> Text="高度: " />
<TextBox Grid.Row="2" <TextBox Grid.Row="2"
Grid.Column="1" Grid.Column="1"
Margin="0,5,10,0"
Text="{Binding TargetAlt, UpdateSourceTrigger=PropertyChanged}" /> Text="{Binding TargetAlt, UpdateSourceTrigger=PropertyChanged}" />
</Grid> </Grid>
</Grid> </Grid>
</Grid> </Grid>
@ -356,7 +371,7 @@
Text="{Binding oneByOnePeriodAttr, UpdateSourceTrigger=PropertyChanged}" /> Text="{Binding oneByOnePeriodAttr, UpdateSourceTrigger=PropertyChanged}" />
</Grid> </Grid>
<TextBox Grid.Row="3" Grid.ColumnSpan="2" IsReadOnly="True" Text="{Binding flashCopterNameArray, UpdateSourceTrigger=PropertyChanged}" /> <TextBox Grid.Row="3" Grid.ColumnSpan="2" Text="{Binding flashCopterNameArray, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="4" Grid.Column="0" Text="机头方向: " /> <TextBlock Grid.Row="4" Grid.Column="0" Text="机头方向: " />
<Grid Grid.Row="4" Grid.Column="1"> <Grid Grid.Row="4" Grid.Column="1">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@ -426,13 +441,24 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid> <Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition /> <ColumnDefinition />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Text="返航高度: " /> <TextBlock Text="返航高度: " />
<TextBox Grid.Column="1" <TextBox Grid.Column="1" Grid.Row="0"
Text="{Binding RTLAlt, UpdateSourceTrigger=PropertyChanged}" /> Text="{Binding RTLAlt, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="同时返航数量: " Grid.Row="1" Grid.Column="0" />
<TextBox Grid.Column="1" Grid.Row="1"
Text="{Binding RetNumAttr, UpdateSourceTrigger=PropertyChanged}" />
</Grid> </Grid>
</Grid> </Grid>
</Grid> </Grid>

View File

@ -33,6 +33,8 @@ namespace Plane.FormationCreator.Views
private void Button_Click(object sender, RoutedEventArgs e) private void Button_Click(object sender, RoutedEventArgs e)
{ {
// distanceCopters.Text;
/*
FlightTaskManager _flightTaskManager = ServiceLocator.Current.GetInstance<FlightTaskManager>(); FlightTaskManager _flightTaskManager = ServiceLocator.Current.GetInstance<FlightTaskManager>();
int firstIndex = int.Parse( firstCopter.Text ); int firstIndex = int.Parse( firstCopter.Text );
@ -48,7 +50,8 @@ namespace Plane.FormationCreator.Views
distanceCopters.Text = ((double)Math.Round(distance*100)/100).ToString(); distanceCopters.Text = ((double)Math.Round(distance*100)/100).ToString();
} }
*/
} }