コード例 #1
0
        //多段直线跟踪
        public void FollowMulLine(ShipData boat)
        {
            HUST_1_Demo.Form1.TargetLine line = new Form1.TargetLine();
            line.Start = HUST_1_Demo.Form1.tarMultiLine.ElementAt(HUST_1_Demo.Form1.followLineID);     //线段起始点
            line.End   = HUST_1_Demo.Form1.tarMultiLine.ElementAt(HUST_1_Demo.Form1.followLineID + 1); //线端终点
            line.LineK = (double)(line.Start.Y - line.End.Y) / (double)(line.Start.X - line.End.X);
            line.LineB = (line.Start.Y - line.LineK * line.Start.X) / 1000.0f;
            if (line.End.X < line.Start.X)//判断是否为逆向直线
            {
                line.isReverse = true;
            }

            FollowLine(boat, line);

            if (Math.Sqrt((boat.X_mm - line.End.X) * (boat.X_mm - line.End.X) + (boat.Y_mm - line.End.Y) * (boat.Y_mm - line.End.Y)) < 4000)
            {
                HUST_1_Demo.Form1.followLineID++;
            }
            if (HUST_1_Demo.Form1.followLineID == HUST_1_Demo.Form1.tarMultiLine.Count - 1)
            {
                HUST_1_Demo.Form1.followLineID = 0;
            }
        }
コード例 #2
0
        //椭圆轨迹跟随
        public void FollowOval(ShipData boat, HUST_1_Demo.Form1.TargetOval oval)
        {
            switch (HUST_1_Demo.Form1.SetOvalPathID)
            {
            case 0:
            {
                HUST_1_Demo.Form1.TargetLine line = new Form1.TargetLine();
                line.Start = oval.Pt1;
                line.End   = oval.Pt2;
                line.LineK = oval.K1;
                line.LineB = oval.B1 / 1000d;
                FollowLine(boat, line);

                if (Math.Sqrt((boat.X_mm - oval.Pt2.X) * (boat.X_mm - oval.Pt2.X) + (boat.Y_mm - oval.Pt2.Y) * (boat.Y_mm - oval.Pt2.Y)) < 2000)
                {
                    HUST_1_Demo.Form1.SetOvalPathID = 1;
                }
                break;
            }

            case 1:
            {
                HUST_1_Demo.Form1.TargetCircle circle = new Form1.TargetCircle();
                circle.x      = oval.OriPt1.X / 1000d;
                circle.y      = oval.OriPt1.Y / 1000d;
                circle.Radius = oval.R / 1000d;

                FollowCircle(boat, circle);
                if (Math.Sqrt((boat.X_mm - oval.Pt3.X) * (boat.X_mm - oval.Pt3.X) + (boat.Y_mm - oval.Pt3.Y) * (boat.Y_mm - oval.Pt3.Y)) < 2000)
                {
                    HUST_1_Demo.Form1.SetOvalPathID = 2;
                }
                break;
            }

            case 2:
            {
                HUST_1_Demo.Form1.TargetLine line = new Form1.TargetLine();
                line.Start     = oval.Pt3;
                line.End       = oval.Pt4;
                line.LineK     = oval.K1;
                line.LineB     = oval.B3 / 1000d;
                line.isReverse = true;
                FollowLine(boat, line);

                if (Math.Sqrt((boat.X_mm - oval.Pt4.X) * (boat.X_mm - oval.Pt4.X) + (boat.Y_mm - oval.Pt4.Y) * (boat.Y_mm - oval.Pt4.Y)) < 2000)
                {
                    HUST_1_Demo.Form1.SetOvalPathID = 3;
                }
                break;
            }

            case 3:
            {
                HUST_1_Demo.Form1.TargetCircle circle = new Form1.TargetCircle();
                circle.x      = oval.OriPt2.X / 1000d;
                circle.y      = oval.OriPt2.Y / 1000d;
                circle.Radius = oval.R / 1000d;

                FollowCircle(boat, circle);
                if (Math.Sqrt((boat.X_mm - oval.Pt1.X) * (boat.X_mm - oval.Pt1.X) + (boat.Y_mm - oval.Pt1.Y) * (boat.Y_mm - oval.Pt1.Y)) < 2000)
                {
                    HUST_1_Demo.Form1.SetOvalPathID = 0;
                }
                break;
            }
            }
        }