我试图处理一段代码以返回一个航点列表,这些航点表示AI raid飞行的飞行路径。不幸的是,数学和三角形从来都不是我的强项,所以我一直在谷歌上搜索,而且速度不是很快。
我有以下代码
public static Point2d CalculateCoordinate(double Angle, double Distance)
{
Point2d coord = new Point2d(Distance * Math.Cos(Angle), Distance * Math.Sin(Angle));
return coord;
}
public static double GetAngle(Point2d coord1, Point2d coord2, Point2d coord3, Point2d coord4)
{
double result = 0.0;
result = (Math.Atan2(coord2.y - coord1.y, coord2.x - coord1.x) - Math.Atan2(coord4.y - coord3.y, coord4.x - coord3.x)) * (180 / Math.PI);
if(result<0)
{
result = result + 360;
}
return result;
}
public static List<Point2d> GenerateWaypoints(Point2d Startpoint, Point2d Target)
{
List<Point2d> waypoints = new List<Point2d>();
double tempDistance = 0.0;
double tempAngle = 30.0 * ( Math.PI/180);
bool ok = false;
double distancemodifier = 0.8;
waypoints.Add(Startpoint);
tempDistance = Startpoint.distance(ref Target)*distancemodifier;
Console.WriteLine(tempDistance.ToString());
Console.WriteLine(ReturnStringFromP2D(Startpoint));
Console.WriteLine(ReturnStringFromP2D(Target));
Point2d tempPoint2d = CalculateCoordinate(tempAngle, tempDistance);
Console.WriteLine(ReturnStringFromP2D(tempPoint2d));
while (!ok)
{
tempPoint2d = CalculateCoordinate(tempAngle, tempDistance);
if (GetAngle(Startpoint, tempPoint2d, tempPoint2d, Target) > 30.00 || tempPoint2d.distance(ref Target) < 10000)
{
distancemodifier = distancemodifier - 0.05;
tempDistance = Startpoint.distance(ref Target) * distancemodifier;
}
}
ok = false;
waypoints.Add(tempPoint2d);
waypoints.Add(Target);
tempAngle = tempAngle + 30.0;
tempDistance = Target.distance(ref Startpoint) * distancemodifier;
tempPoint2d = CalculateCoordinate(tempAngle, tempDistance);
while (!ok)
{
tempPoint2d = CalculateCoordinate(tempAngle, tempDistance);
if (GetAngle(Target, tempPoint2d, tempPoint2d, Startpoint) > 30.00)
{
distancemodifier = distancemodifier - 0.05;
tempDistance = Target.distance(ref Startpoint) * distancemodifier;
}
}
waypoints.Add(tempPoint2d);
return waypoints;
}
问题在于,我没有从中获得任何有意义的东西。我想要应用的规则是,飞行路径中的任何转弯都不应大于30度。我有起始位置,目标位置。我想确保第一个转弯距离目标位置不超过10公里。
编辑:好的,这就是我实际想要实现的目标。使用1公里的网格。 将起点指向0,10,目标点为10,40,我想生成一组从开始到开始和目标之间的中间步骤的航点,这些航点应产生不超过30度的角度(但是两条腿之间没有直线)并且距离目标不超过5公里。然后目标,然后回到起点,规则是没有角度应该大于30度。因此,我们可能得到以下内容(大致在纸上编写,因此可能存在错误,但它应该表明我想要实现的目标。) 从0,10开始 中级22,20 目标10,40 中级-10,48 中级-25,40 中级-35,28 中级-35,14 中级-20,5 从0,10开始
在我看来,我需要三种方法,一种是在两点之间返回轴承(在开始时用于从起点到目标获得初始方向 - 然后从直线修改),第二种计算两条线之间的角度(用于检查前一个角度的每一步都不超过30度),第三条线用于生成一个坐标和一个距离当前位置的距离。
根据我的理解,上面的GetAngle()是正确的,并且减少到这将适用于两点之间的轴承?
public static double GetBearing(Point2d coord1, Point2d coord2) {
double result = 0.0;
result = Math.Atan2(coord2.y - coord1.y, coord2.x - coord1.x) * (180 / Math.PI);
if(result<0)
{
result = result + 360;
}
return result;
}