航点发电机 - 根据规则计算往返航程

时间:2015-01-13 20:29:50

标签: c# math coordinates

我试图处理一段代码以返回一个航点列表,这些航点表示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;
    }

0 个答案:

没有答案