diff --git a/FlightRouteV2/FlightRouteV2.cs b/FlightRouteV2/FlightRouteV2.cs
index 6dad670..16033cf 100644
--- a/FlightRouteV2/FlightRouteV2.cs
+++ b/FlightRouteV2/FlightRouteV2.cs
@@ -400,6 +400,10 @@ namespace FlightRouteV2
//坐标操作与验证
public static class FlyVecFun
{
+ ///
+ /// 随机种子
+ ///
+ public static int RandomSeed { get; set; } = 1;
///
/// 航线 线间距 平方值
///
@@ -407,7 +411,11 @@ namespace FlightRouteV2
///
/// 飞行过程中间距 平方值
///
- public static double SpaceBetweenSquare { get; set; } = 90000;
+ public static double SpaceBetweenSquare { get; set; } = 62500;
+ ///
+ /// 算绕行时 中间取点 true在正中间取点即 一个圆盘 false在一个圆柱体内取点
+ ///
+ public static bool singleCircle = true;
///
/// 输出日志回调函数
///
@@ -507,7 +515,7 @@ namespace FlightRouteV2
}
// 生成一个随机数,用于从最小值下标列表中随机选择一个下标
- Random random = new Random();
+ Random random = new Random(RandomSeed);
return minIndices[random.Next(minIndices.Count)];
}
///
@@ -1444,7 +1452,7 @@ namespace FlightRouteV2
/// 日志输出 回调函数
/// 错层层高
/// 返回一个二维向量坐标集合 middle[0]是第一个中间航点 middle[1]是第二个中间航点 返回空数组则代表两个图形不在一个平面上或者不够4个点
- public static List> CollisionLayer(Vector3[] aVecs, Vector3[] bVecs,string aName,string bName ,SomeCalculateWay StrPrint, double layHight = 220)
+ public static List> CollisionLayer(Vector3[] aVecs, Vector3[] bVecs,string aName,string bName ,SomeCalculateWay StrPrint, double layHight = 185)
{
long t = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
StrPrint("-------错层,开始-------");
@@ -1565,10 +1573,13 @@ namespace FlightRouteV2
///
/// 起始坐标集合
/// 终点做标集合
- /// 日志输出 回调函数
+ /// 日志输出 回调函数
+ /// 日志输出 回调函数
+ /// out参数 返回true不碰撞程序直接返回 false有碰撞程序向下执行
/// 返回一个二维数组 返回值长度0没有检测到碰撞或绕行失败 长度1为一个中间航点 长度为3为三个中间航点顺序(前中后)
- public static List> ABypassB(Vector3[] aVecs, Vector3[] bVecs, SomeCalculateWay StrPrint, Schedule GetVal)
+ public static List> ABypassB(Vector3[] aVecs, Vector3[] bVecs,SomeCalculateWay StrPrint, Schedule GetVal, CancellationToken cancellationToken, out bool isPass, List mappingId = null)
{
+ isPass = false;
long t = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
StrPrint("-------3D绕行,开始-------");
List> re = new List>();
@@ -1578,10 +1589,22 @@ namespace FlightRouteV2
{
StrPrint("没有检测到碰撞,故不用添加中间航点");
StrPrint($"-------3D绕行,结束-------");
+ isPass = true;
return re;//直接返回
}
///飞机总数
int planeCou = aVecs.Length;
+ ///判断有没有给 映射的ID 没有就按顺序设置ID序号
+ if (mappingId == null)
+ {
+ mappingId = new List();
+ for (int i = 1; i <= planeCou; i++)
+ {
+ mappingId.Add(i);
+ }
+ }
+ ///碰撞数
+ int collisionCou;
///第一次绕行 中间1航点
List collisionGroup = TwoArrToArr(planesCollision); //整合数组
List middleVecs = new List(); //中心航点坐标组
@@ -1589,11 +1612,21 @@ namespace FlightRouteV2
{
middleVecs.Add(SetMiddleVec(aVecs[i], bVecs[i])); //添加默认中间航点
}
- for (int c = 0; c < 2; c++)
+ collisionCou = collisionGroup.Count;
+ while (true)
{
+ if (cancellationToken.IsCancellationRequested)//外部法取消指令
+ {
+ StrPrint("-------3D绕行操作被取消-------");
+ return re; // 退出函数
+ }
+ int progress = 0;//进度
foreach (int i in collisionGroup)//开始绕碰撞组
{
- List grv = GetRingVec(aVecs[i], bVecs[i], 0.5, 40, 4);//中间可绕行航点列表
+ progress++;
+ GetVal(progress/collisionGroup.Count*100);
+ List grv = GetRingVec(aVecs[i], bVecs[i], 0.5, 5, 4, 1500);//中间可绕行航点列表
+ StrPrint($"进度:{progress}/{collisionGroup.Count},本次绕行{grv.Count}次");
foreach (Vector3 v in grv)
{
middleVecs[i] = v;
@@ -1605,6 +1638,13 @@ namespace FlightRouteV2
}
planesCollision = AirImitation(aVecs, middleVecs).Concat(AirImitation(middleVecs, bVecs)).ToList(); //获取碰撞组
collisionGroup = TwoArrToArr(planesCollision); //整合数组
+ //如果绕行成功 或者 绕行结果和上次一样没有变化甚碰撞变多 则都退出循环
+ if (collisionGroup.Count == 0 || collisionCou <= collisionGroup.Count)
+ {
+ collisionCou = collisionGroup.Count;
+ break;
+ }
+ collisionCou = collisionGroup.Count;
}
//没有碰撞 返回一个中间航点 并返回
if (collisionGroup.Count == 0)
@@ -1618,8 +1658,9 @@ namespace FlightRouteV2
}
else
{
- StrPrint($"{string.Join("号, ", collisionGroup)}号,有碰撞,共{collisionGroup.Count}架!");
- StrPrint("第一次绕行未成功,准备开始第二次绕行!");
+ string mappingOutput = string.Join(", ", collisionGroup.Select(index => $"{mappingId[index]}号")); // 构建映射关系字符串
+ StrPrint($"共{collisionGroup.Count}架有碰撞:{mappingOutput}!");
+ StrPrint("第一次绕行未成功!");
}
///第二次绕行 两头 两航点
@@ -1633,18 +1674,25 @@ namespace FlightRouteV2
secondMiddleVecsOne.Add(SetMiddleVec(aVecs[i], bVecs[i], 0.1)); //添加中间航点1
secondMiddleVecsTwo.Add(SetMiddleVec(aVecs[i], bVecs[i], 0.9)); //添加中间航点2
}
- for (int c = 0; c < 2; c++)
+ collisionCou = collisionGroup.Count;
+ while (true)
{
+ if (cancellationToken.IsCancellationRequested)//外部法取消指令
+ {
+ StrPrint("-------3D绕行操作被取消-------");
+ return re; // 退出函数
+ }
int progress = 0;//进度
foreach (int i in collisionGroup)//开始绕碰撞组
{
progress++;
+ GetVal(progress / collisionGroup.Count * 100);
//StrPrint($"迭代{c}次{i}号绕行");
- List sgrv1 = GetRingVec(aVecs[i], bVecs[i], 0.1, 40, 8);//中间可绕行航点列表
- List sgrv2 = GetRingVec(aVecs[i], bVecs[i], 0.9, 40, 8);//中间可绕行航点列表
- //if (sgrv1.Count > 250) sgrv1.RemoveRange(250, sgrv1.Count - 250);
- //if (sgrv2.Count > 250) sgrv2.RemoveRange(250, sgrv2.Count - 250);
- StrPrint($"进度:{progress}/{collisionGroup.Count},本次绕行{Math.Pow(sgrv2.Count,2)}次");
+ List sgrv1 = GetRingVec(aVecs[i], bVecs[i], 0, 30, 10,600);//中间可绕行航点列表
+ sgrv1.Insert(0, secondMiddleVecsOne[i]);
+ List sgrv2 = GetRingVec(aVecs[i], bVecs[i], 1, 30, 10,600);//中间可绕行航点列表
+ sgrv2.Insert(0, secondMiddleVecsTwo[i]);
+ StrPrint($"进度:{progress}/{collisionGroup.Count},本次绕行{sgrv1.Count * sgrv2.Count}次");
foreach (Vector3 v1 in sgrv1)
{
secondMiddleVecsOne[i] = v1;
@@ -1667,6 +1715,13 @@ namespace FlightRouteV2
planesCollision = AirImitation(aVecs, secondMiddleVecsOne).Concat(AirImitation(secondMiddleVecsOne, secondMiddleVecsTwo)).ToList(); //获取碰撞组
planesCollision = planesCollision.Concat(AirImitation(secondMiddleVecsTwo, bVecs)).ToList();
collisionGroup = TwoArrToArr(planesCollision); //整合数组
+ //如果绕行成功 或者 绕行结果和上次一样没有变化甚碰撞变多 则都退出循环
+ if (collisionGroup.Count == 0 || collisionCou <= collisionGroup.Count)
+ {
+ collisionCou = collisionGroup.Count;
+ break;
+ }
+ collisionCou = collisionGroup.Count;
}
//没有碰撞 返回两个中间航点 并返回
if (collisionGroup.Count == 0)
@@ -1681,31 +1736,37 @@ namespace FlightRouteV2
}
else
{
- StrPrint($"{string.Join("号, ", collisionGroup)}号,有碰撞,共{collisionGroup.Count}架!");
- StrPrint("第二次绕行未通过,准备开始第三次绕行!");
+ string mappingOutput = string.Join(", ", collisionGroup.Select(index => $"{mappingId[index]}号")); // 构建映射关系字符串
+ StrPrint($"共{collisionGroup.Count}架有碰撞:{mappingOutput}!");
+ StrPrint("第二次绕行未成功!");
}
- ///第三次绕行 两头 两航点 中间一行点 沿用第二次绕行
+ ///第三次绕行 两头 两航点 中间一行点(实际添加两航点 但是0.6位置航点暂不启用留给第四次绕行) 沿用第二次绕行
isPassMark = false;
- List thirdMiddleVecs = new List(); //中心航点坐标组
+ List thirdMiddleVecs = new List(); //中心航点坐标组1
for (int i = 0; i < planeCou; i++)
{
thirdMiddleVecs.Add(SetMiddleVec(secondMiddleVecsOne[i], secondMiddleVecsTwo[i], 0.5)); //添加中间航点(保持二次绕行的两端航点 在两端航点中间添加)
}
- for (int c = 0; c < 2; c++)
+ while (true)
{
+ if (cancellationToken.IsCancellationRequested)//外部法取消指令
+ {
+ StrPrint("-------3D绕行操作被取消-------");
+ return re; // 退出函数
+ }
int progress = 0;//进度
foreach (int i in collisionGroup)//开始绕碰撞组
{
+ GetVal(progress / collisionGroup.Count * 100);
progress++;
//StrPrint($"迭代{c}次{i}号绕行");
- List sgrv1 = GetRingVec(aVecs[i], bVecs[i], 0.1, 220, 8);//中间可绕行航点列表
- List sgrv2 = GetRingVec(aVecs[i], bVecs[i], 0.9, 220, 8);//中间可绕行航点列表
- List grv = GetRingVec(secondMiddleVecsOne[i], secondMiddleVecsTwo[i], 0.5, 220, 4);//中间可绕行航点列表
- //if (sgrv1.Count > 300) sgrv1.RemoveRange(300, sgrv1.Count - 300);
- //if (sgrv2.Count > 300) sgrv2.RemoveRange(300, sgrv2.Count - 300);
- //if (grv.Count > 300) grv.RemoveRange(300, grv.Count - 300);
- StrPrint($"进度:{progress}/{collisionGroup.Count},本次绕行{Math.Pow(sgrv2.Count, 3)}次");
+ List sgrv1 = GetRingVec(aVecs[i], bVecs[i], 0, 100, 10, 600);//中间可绕行航点列表
+ sgrv1.Insert(0, secondMiddleVecsOne[i]);
+ List sgrv2 = GetRingVec(aVecs[i], bVecs[i], 1, 100, 10, 600);//中间可绕行航点列表
+ sgrv2.Insert(0, secondMiddleVecsTwo[i]);
+ List grv = GetRingVec(secondMiddleVecsOne[i], secondMiddleVecsTwo[i], 0.5, 80, 4, 1500);//中间可绕行航点列表
+ StrPrint($"进度:{progress}/{collisionGroup.Count},本次绕行{sgrv1.Count * sgrv2.Count * grv.Count}次");
foreach (Vector3 vm in grv)
{
thirdMiddleVecs[i] = vm;
@@ -1737,6 +1798,13 @@ namespace FlightRouteV2
planesCollision = planesCollision.Concat(AirImitation(thirdMiddleVecs, secondMiddleVecsTwo)).ToList();
planesCollision = planesCollision.Concat(AirImitation(secondMiddleVecsTwo, bVecs)).ToList();
collisionGroup = TwoArrToArr(planesCollision); //整合数组
+ //如果绕行成功 或者 绕行结果和上次一样没有变化甚碰撞变多 则都退出循环
+ if (collisionGroup.Count == 0 || collisionCou <= collisionGroup.Count)
+ {
+ collisionCou = collisionGroup.Count;
+ break;
+ }
+ collisionCou = collisionGroup.Count;
}
//没有碰撞 返回三个中间航点 并返回
if (collisionGroup.Count == 0)
@@ -1752,8 +1820,9 @@ namespace FlightRouteV2
}
else
{
- StrPrint($"{string.Join("号, ", collisionGroup)}号,有碰撞,共{collisionGroup.Count}架!");
- StrPrint("第三次绕行未成功,准备开始第四次绕行!");
+ string mappingOutput = string.Join(", ", collisionGroup.Select(index => $"{mappingId[index]}号")); // 构建映射关系字符串
+ StrPrint($"共{collisionGroup.Count}架有碰撞:{mappingOutput}!");
+ StrPrint("第三次绕行未成功!");
}
///end
@@ -1804,14 +1873,14 @@ namespace FlightRouteV2
Vector3 k_hat = (bVec - aVec).NormalizEd();
/// 计算右向量,使用 Vector3.UnitY 作为上向量 i帽
//Vector3 i_hat = CrossPro(Vector3.UnitY, k_hat).NormalizEd(); //固定方向i帽
- Random random = new Random();// 生成一个随机的单位向量
+ Random random = new Random(RandomSeed);// 生成一个随机的单位向量
Vector3 randomVector = new Vector3((double)random.NextDouble(), (double)random.NextDouble(), (double)random.NextDouble());
Vector3 i_hat = CrossPro(k_hat, randomVector).NormalizEd();// 随机方向i帽
/// 计算上向量 j帽
Vector3 j_hat = CrossPro(k_hat, i_hat);
///计算 对应的偏移比例
double length = (bVec - aVec).GetMag();
- double offShift = middleProportion;//偏移比例
+ double offShift = middleProportion; //偏移比例
if (direction == "retrun")
{
if (offCount % 2 == 1) //奇数
@@ -1856,13 +1925,20 @@ namespace FlightRouteV2
/// 目标点
/// 中间航点位置比例
/// 绕行航点密度(值越小密度越大) ps:传递圈函数的弦长 向量矩阵函数的层高
- /// 绕行航点范围(值越小范围越大) ps:决定层的厚度 和 圈的直径 为 paunch/航线长度
+ /// 绕行航点范围(值越小范围越大 如:参数给4 圆盘的半径是a到b距离的1/4) ps:决定层的厚度 和 圈的直径 为 paunch/航线长度
+ /// 设定圆盘半径 的最大值 单位是厘米
+ /// 层排布方向 "retrun"前后堆叠 "forward"向前排列(如:起点向目标点方向) "backward"向后排列
/// 绕行航点列表
- private static List GetRingVec(Vector3 aVec, Vector3 bVec, double middleProportion, double transfer, double paunch,bool singleCircle =true, string direction = "retrun")
+ public static List GetRingVec(Vector3 aVec, Vector3 bVec, double middleProportion, double transfer, double paunch,double maxPaunchRadius, string direction = "retrun")
{
List ringVec = new List(); //记录所有绕行中间航点坐标
/// 根据a到b的长度 算出中间绕行几圈
- int ringCou = (int)Math.Ceiling(GageLength(aVec, bVec) / paunch / transfer); //算层数和圈数 ps:层的厚度 和 圈的直径 为 paunch/航线长度
+ double discRadius = GageLength(aVec, bVec) / paunch;//圆盘半径
+ if (discRadius > maxPaunchRadius)
+ {
+ discRadius = maxPaunchRadius;//设定圆盘不经不超过最大值
+ }
+ int ringCou = (int)Math.Ceiling(discRadius / transfer ); //算层数和圈数 ps:层的厚度 和 圈的直径 为 paunch/航线长度
if (ringCou < 2) ringCou = 2; //最少两圈 两层
/// 不是单圈的话 设置层数跟圈数相等
int layCou = ringCou;
@@ -1898,19 +1974,21 @@ namespace FlightRouteV2
/// 拉散图案的坐标组
public static Vector3[] NormalPull(Vector3[] aVecs, Vector3[] bVecs, SomeCalculateWay StrPrint)
{
- int planeCou = aVecs.Length; //获取飞机总数
+ Vector3[] new_aVecs = aVecs.ToArray();
+ Vector3[] new_bVecs = bVecs.ToArray();
+ int planeCou = new_aVecs.Length; //获取飞机总数
///a图b图 中心
- Vector3 aCenterPos = GetPosCenter(aVecs, false);
- Vector3 bCenterPos = GetPosCenter(bVecs, false);
+ Vector3 aCenterPos = GetPosCenter(new_aVecs, false);
+ Vector3 bCenterPos = GetPosCenter(new_bVecs, false);
///判断bVec 矩阵的数量长宽
for (int i = 0; i < planeCou; i++)//把矩阵高度压平
{
- bVecs[i] = new Vector3(bVecs[i].X, 0, bVecs[i].Z);
+ new_bVecs[i] = new Vector3(new_bVecs[i].X, 0, new_bVecs[i].Z);
}
int row = 1 ;
for (int i = 0; i < planeCou-2; i++)
{
- if (!(IsVecsOnLine(bVecs[i], bVecs[i + 1], bVecs[i + 2])))
+ if (!(IsVecsOnLine(new_bVecs[i], new_bVecs[i + 1], new_bVecs[i + 2])))
{
row = i+2;//列
break;
@@ -1918,17 +1996,17 @@ namespace FlightRouteV2
}
int ran = (int)Math.Ceiling((double)planeCou/(double)row);//行
///计算a图的法线标量
- Vector3 side1 = aVecs[1] - aVecs[0];
- Vector3 side2 = aVecs[2] - aVecs[0];
+ Vector3 side1 = new_aVecs[1] - new_aVecs[0];
+ Vector3 side2 = new_aVecs[2] - new_aVecs[0];
Vector3 normal = CrossPro(side1, side2);
Vector3 normalScalar = normal.NormalizEd();//法线标量
normalScalar.Y = 0;//高度上压平
///判断a图 法线朝向 和 矩阵“平行”方向 获取此方向层数 ps:用于a图的拉散
- if (GageLength(normalScalar, bVecs[0]) < GageLength(normalScalar * -1, bVecs[0]))
+ if (GageLength(normalScalar, new_bVecs[0]) < GageLength(normalScalar * -1, new_bVecs[0]))
{
normalScalar *= -1;//法线选择方向为 靠近矩阵1号机的方向 ps:由于取的三个点位置随机 按照右手定则 法线方向也随机
}
- if (Math.Abs(AngleBetween(bVecs[row] - bVecs[0], normalScalar) - 90) < Math.Abs(AngleBetween(bVecs[1] - bVecs[0], normalScalar) - 90))
+ if (Math.Abs(AngleBetween(new_bVecs[row] - new_bVecs[0], normalScalar) - 90) < Math.Abs(AngleBetween(new_bVecs[1] - new_bVecs[0], normalScalar) - 90))
{
/// 图案“如平行于0 21 41..” 平行于列
for (int k = 0; k < row; k++)
@@ -1938,24 +2016,34 @@ namespace FlightRouteV2
int cou = i * row + k;
if (cou > planeCou) break;// 溢出跳出
///判断图在矩阵的左方 还是右方
- if (GageLength(aCenterPos, bVecs[0]) > GageLength(aCenterPos, bVecs[row - 1]))
+ if (GageLength(aCenterPos, new_bVecs[0]) > GageLength(aCenterPos, new_bVecs[row - 1]))
{
- aVecs[cou] -= normalScalar * (row - k) * 300;//左方
+ new_aVecs[cou] -= normalScalar * (row - k) * 300;//左方
}
else
{
- aVecs[cou] += normalScalar * k * 300;//右方
+ new_aVecs[cou] += normalScalar * k * 300;//右方
}
}
}
///判断a图的中心点 是否在矩阵内部 在矩阵内部 做一个a b两组中心点对其 ps:相当于朝两边拉散
- if (IsPointBetweenLines(bVecs[(int)Math.Ceiling(((double)row/5))-1], bVecs[(int)Math.Ceiling(((double)row / 5)) - 1+row], bVecs[row-((int)Math.Ceiling(((double)row / 5)) - 1)], bVecs[(row - ((int)Math.Ceiling(((double)row / 5)) - 1))+row], aCenterPos))
+ if (IsPointBetweenLines(new_bVecs[(int)Math.Ceiling(((double)row/5))-1], new_bVecs[(int)Math.Ceiling(((double)row / 5)) - 1+row], new_bVecs[row-((int)Math.Ceiling(((double)row / 5)) - 1)], new_bVecs[(row - ((int)Math.Ceiling(((double)row / 5)) - 1))+row], aCenterPos))
{
- aCenterPos = GetPosCenter(aVecs, false);//重新算下中心点
- Vector3 offPos = aCenterPos - bCenterPos;//偏移量
- for (int i = 0; i < planeCou; i++)
+ if (GageLength(new_aVecs[0], aVecs[0]) > GageLength(new_aVecs[planeCou - 1], aVecs[planeCou - 1]))//判断最大偏移量 是第一排 还是最后一排
{
- aVecs[i] -= offPos;
+ Vector3 offPos = (new_aVecs[0] - aVecs[0]) * 0.5;//偏移量 的一半
+ for (int i = 0; i < planeCou; i++)//所有飞机重新计算偏移量 ps:向两侧拉开
+ {
+ new_aVecs[i] -= offPos;
+ }
+ }
+ else
+ {
+ Vector3 offPos = (new_aVecs[planeCou - 1] - aVecs[planeCou - 1]) * 0.5;//偏移量 的一半
+ for (int i = 0; i < planeCou; i++)//所有飞机重新计算偏移量 ps:向两侧拉开
+ {
+ new_aVecs[i] -= offPos;
+ }
}
}
@@ -1970,28 +2058,38 @@ namespace FlightRouteV2
int cou = k * row + i;
if (cou > planeCou) break;// 溢出跳出
///判断图在矩阵的上方 还是下方
- if (GageLength(aCenterPos, bVecs[0]) > GageLength(aCenterPos, bVecs[row * (ran - 1)]))
+ if (GageLength(aCenterPos, new_bVecs[0]) > GageLength(aCenterPos, new_bVecs[row * (ran - 1)]))
{
- aVecs[cou] -= normalScalar * (ran - k) * 300;//上方
+ new_aVecs[cou] -= normalScalar * (ran - k) * 300;//上方
}
else
{
- aVecs[cou] += normalScalar * k * 300;//下方
+ new_aVecs[cou] += normalScalar * k * 300;//下方
}
}
}
///判断a图的中心点 是否在矩阵内部 在矩阵内部 做一个a b两组中心点对其 ps:相当于朝两边拉散
- if (IsPointBetweenLines(bVecs[(int)Math.Ceiling((double)ran / 5) * row - row], bVecs[(int)Math.Ceiling((double)ran / 5) * row - 1], bVecs[(ran - (int)Math.Ceiling((double)ran / 5)) * row], bVecs[(ran - (int)Math.Ceiling((double)ran / 5)) * row + row - 1], aCenterPos))
+ if (IsPointBetweenLines(new_bVecs[(int)Math.Ceiling((double)ran / 5) * row - row], new_bVecs[(int)Math.Ceiling((double)ran / 5) * row - 1], new_bVecs[(ran - (int)Math.Ceiling((double)ran / 5)) * row], new_bVecs[(ran - (int)Math.Ceiling((double)ran / 5)) * row + row - 1], aCenterPos))
{
- aCenterPos = GetPosCenter(aVecs, false);//重新算下中心点
- Vector3 offPos = aCenterPos - bCenterPos;//偏移量
- for (int i = 0; i < planeCou; i++)
+ if (GageLength(new_aVecs[0], aVecs[0]) > GageLength(new_aVecs[planeCou - 1], aVecs[planeCou - 1]))//判断最大偏移量 是第一排 还是最后一排
{
- aVecs[i] -= offPos;
+ Vector3 offPos = (new_aVecs[0] - aVecs[0]) * 0.5;//偏移量 的一半
+ for (int i = 0; i < planeCou; i++)//所有飞机重新计算偏移量 ps:向两侧拉开
+ {
+ new_aVecs[i] -= offPos;
+ }
+ }
+ else
+ {
+ Vector3 offPos = (new_aVecs[planeCou - 1] - aVecs[planeCou - 1]) * 0.5;//偏移量 的一半
+ for (int i = 0; i < planeCou; i++)//所有飞机重新计算偏移量 ps:向两侧拉开
+ {
+ new_aVecs[i] -= offPos;
+ }
}
}
}
- return aVecs;
+ return new_aVecs;
}
}
}
\ No newline at end of file
diff --git a/FlightRouteV2/bin/Debug/FlightRouteV2.dll b/FlightRouteV2/bin/Debug/FlightRouteV2.dll
index 0cf5bbe..0d66595 100644
Binary files a/FlightRouteV2/bin/Debug/FlightRouteV2.dll and b/FlightRouteV2/bin/Debug/FlightRouteV2.dll differ
diff --git a/FlightRouteV2/bin/Debug/FlightRouteV2.pdb b/FlightRouteV2/bin/Debug/FlightRouteV2.pdb
index 9808e34..72a791d 100644
Binary files a/FlightRouteV2/bin/Debug/FlightRouteV2.pdb and b/FlightRouteV2/bin/Debug/FlightRouteV2.pdb differ
diff --git a/FlightRouteV2/bin/Release/FlightRouteV2.dll b/FlightRouteV2/bin/Release/FlightRouteV2.dll
index b86bb34..b2f149c 100644
Binary files a/FlightRouteV2/bin/Release/FlightRouteV2.dll and b/FlightRouteV2/bin/Release/FlightRouteV2.dll differ
diff --git a/FlightRouteV2/bin/Release/FlightRouteV2.pdb b/FlightRouteV2/bin/Release/FlightRouteV2.pdb
index d7856ee..13f6eed 100644
Binary files a/FlightRouteV2/bin/Release/FlightRouteV2.pdb and b/FlightRouteV2/bin/Release/FlightRouteV2.pdb differ
diff --git a/FlightRouteV2/obj/Debug/FlightRouteV2.dll b/FlightRouteV2/obj/Debug/FlightRouteV2.dll
index 0cf5bbe..0d66595 100644
Binary files a/FlightRouteV2/obj/Debug/FlightRouteV2.dll and b/FlightRouteV2/obj/Debug/FlightRouteV2.dll differ
diff --git a/FlightRouteV2/obj/Debug/FlightRouteV2.pdb b/FlightRouteV2/obj/Debug/FlightRouteV2.pdb
index 9808e34..72a791d 100644
Binary files a/FlightRouteV2/obj/Debug/FlightRouteV2.pdb and b/FlightRouteV2/obj/Debug/FlightRouteV2.pdb differ
diff --git a/FlightRouteV2/obj/Release/FlightRouteV2.dll b/FlightRouteV2/obj/Release/FlightRouteV2.dll
index b86bb34..b2f149c 100644
Binary files a/FlightRouteV2/obj/Release/FlightRouteV2.dll and b/FlightRouteV2/obj/Release/FlightRouteV2.dll differ
diff --git a/FlightRouteV2/obj/Release/FlightRouteV2.pdb b/FlightRouteV2/obj/Release/FlightRouteV2.pdb
index d7856ee..13f6eed 100644
Binary files a/FlightRouteV2/obj/Release/FlightRouteV2.pdb and b/FlightRouteV2/obj/Release/FlightRouteV2.pdb differ
diff --git a/FlyCube/MainWindow.xaml b/FlyCube/MainWindow.xaml
index 9753047..fb91cf7 100644
--- a/FlyCube/MainWindow.xaml
+++ b/FlyCube/MainWindow.xaml
@@ -16,13 +16,15 @@
+
-
+
+
\ No newline at end of file
diff --git a/FlyCube/MainWindow.xaml.cs b/FlyCube/MainWindow.xaml.cs
index f216fcc..3fccb6a 100644
--- a/FlyCube/MainWindow.xaml.cs
+++ b/FlyCube/MainWindow.xaml.cs
@@ -21,12 +21,16 @@ using ControlLibrary;
using WpfAnimatedGif;//播放GIF
using System.Security.Cryptography;
using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Windows.Media.Animation;
namespace FlyCube
{
public partial class MainWindow : Window
{
private TextBox LOG;
+ //绕行线程取消
+ CancellationTokenSource cts = new CancellationTokenSource();
///
/// 入口函数
///
@@ -35,12 +39,20 @@ namespace FlyCube
InitializeComponent();
//创建一个 主画布对象
TopCanvas = new MainCanvas(this.LayerPlane);
- Vector3 A = new Vector3(0,0,0);
- Vector3 B = new Vector3(0, 0, 10);
- Vector3 C = new Vector3(10, 0, 0);
- Vector3 D = new Vector3(10, 0, 10);
- Vector3 P = new Vector3(10, 0, 10);
- //MessageBox.Show(FlyVecFun.IsPointBetweenLines(A, B, C, D, P).ToString());
+
+ Vector3 aVec = new Vector3(-6650, 1585.775, 3150);
+ Vector3 bVec = new Vector3(-3864.256, 126.145,0);
+ List vecs = FlyVecFun.GetRingVec(aVec,bVec,0.3,100,1,1200);
+ string txta = "";
+ for (int i = 0; i < vecs.Count; i++)
+ {
+ txta += i + " 0" + " " + vecs[i].X + " " + vecs[i].Y + " " + vecs[i].Z + "\r\n";
+ }
+ if (File.Exists("C:/Users/szdot/Desktop/a.txt"))
+ {
+ File.Delete("C:/Users/szdot/Desktop/a.txt");
+ }
+ SaveFile("C:/Users/szdot/Desktop/a.txt", txta);
}
///
/// 3D绕行
@@ -56,67 +68,103 @@ namespace FlyCube
List abVecs = FileBase.TxtToPos(FliePath, out string[] fightNames);//从txt文件里面读取航点 信息
Vector3[] aVecs = abVecs[0].ToArray();
Vector3[] bVecs = abVecs[1].ToArray();
- //Vector3[] new_bVecs = FlyVecFun.ContactABOut(aVecs, bVecs, StrPrint);
- Vector3[] new_bVecs = FlyVecFun.NormalPull(aVecs, bVecs, StrPrintAsync);
+ Vector3[] new_bVecs = FlyVecFun.ContactABOut(aVecs, bVecs, StrPrint);
+ //Vector3[] new_aVecs = FlyVecFun.NormalPull(aVecs, bVecs, StrPrintAsync);
- //Task>> reTask = Task.Run(() => FlyVecFun.ABypassB(aVecs, bVecs, StrPrintAsync, GetVal));
- //List> re = await reTask;
+ bool isPass;
+ Task>> reTask = Task.Run(() => FlyVecFun.ABypassB(aVecs, bVecs, StrPrintAsync, GetVal, cts.Token, out isPass));
+ List> re = await reTask;
- //string txta = "";
- //string txtb = "";
- //string txtc = "";
+ string txta = "";
+ string txtb = "";
+ string txtc = "";
string txtd = "";
for (int i = 0; i < abVecs[0].Length; i++)
{
- // if (re.Count > 0)
- // {
- // txta += i + " 0" + " " + re[0][i].X + " " + re[0][i].Y + " " + re[0][i].Z + "\r\n";
- // }
- // if (re.Count > 1)
- // {
- // txtb += i + " 0" + " " + re[1][i].X + " " + re[1][i].Y + " " + re[1][i].Z + "\r\n";
- // }
- // if (re.Count > 2)
- // {
- // txtc += i + " 0" + " " + re[2][i].X + " " + re[2][i].Y + " " + re[2][i].Z + "\r\n";
- // }
+ if (re.Count > 0)
+ {
+ txta += i + " 0" + " " + re[0][i].X + " " + re[0][i].Y + " " + re[0][i].Z + "\r\n";
+ }
+ if (re.Count > 1)
+ {
+ txtb += i + " 0" + " " + re[1][i].X + " " + re[1][i].Y + " " + re[1][i].Z + "\r\n";
+ }
+ if (re.Count > 2)
+ {
+ txtc += i + " 0" + " " + re[2][i].X + " " + re[2][i].Y + " " + re[2][i].Z + "\r\n";
+ }
txtd += i + " 0" + " " + new_bVecs[i].X + " " + new_bVecs[i].Y + " " + new_bVecs[i].Z + "\r\n";
}
- //if (re.Count > 0)
- //{
- // SaveFile("C:/Users/szdot/Desktop/a.txt", txta);
- //}
- //if (re.Count > 1)
- //{
- // SaveFile("C:/Users/szdot/Desktop/b.txt", txtb);
- //}
- //if (re.Count > 2)
- //{
- // SaveFile("C:/Users/szdot/Desktop/c.txt", txtc);
- //}
+ if (re.Count > 0)
+ {
+ string path = "C:/Users/szdot/Desktop/a.txt";
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ }
+ SaveFile(path, txta);
+ }
+ if (re.Count > 1)
+ {
+ string path = "C:/Users/szdot/Desktop/b.txt";
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ }
+ SaveFile(path, txtb);
+ }
+ if (re.Count > 2)
+ {
+ string path = "C:/Users/szdot/Desktop/c.txt";
+ if (File.Exists(path))
+ {
+ File.Delete(path);
+ }
+ SaveFile(path, txtc);
+ }
- SaveFile("C:/Users/szdot/Desktop/d.txt", txtd);
+ string pathd = "C:/Users/szdot/Desktop/d.txt";
+ if (File.Exists(pathd))
+ {
+ File.Delete(pathd);
+ }
+ SaveFile(pathd, txtd);
}
else
{
return;
}
}
+ //绕行取消
+ private void ByPassCancel_Click(object sender, RoutedEventArgs e)
+ {
+ cts.Cancel(); //取消掉 异步执行的 绕行函数
+ }
+ //异步回调函数 控制 取消绕行函数执行
+ private bool IsBreak(bool val)
+ {
+ return val;
+ }
// 异步回调函数 输出日志
private async void StrPrintAsync(string str)
{
await Task.Run(() =>
{
// 输出日志的异步操作
- //vLogBox.Text += "\r\n" + str;
- MessageBox.Show(str);
+ StrPrint(str);
});
}
private void StrPrint(string str)
{
-
+ // 使用 Dispatcher 来确保在 UI 线程上执行更新操作
+ Dispatcher.Invoke(() =>
+ {
+ vLogBox.Text += "\r\n" + str;
+ // 将滚动条滚动到末尾
+ vLogBox.ScrollToEnd();
+ });
}
private void GetVal(int val)
{