Ejemplo n.º 1
0
 // LiYoubing 2010-07-13, modified by renjing 2010-12-29
 /// <summary>
 /// 双鱼过孔竞速犯规处理
 /// </summary>
 /// <param name="fish">目标仿真机器鱼</param>
 /// <param name="preQuadrant">目标仿真机器鱼前一仿真周期所处象限</param>
 private void HandleFouling(ref FishDoubleFishRacingViaHoles fish, int preQuadrant)
 {
     if (preQuadrant == 1)
     {// 将鱼移到右侧障碍物右边且鱼体方向置为PI/2
         fish.PositionMm.X         = Env.ObstaclesRect[2].PositionMm.X + Env.ObstaclesRect[2].LengthMm / 2 + 50;
         fish.PositionMm.Z         = Env.ObstaclesRect[2].PositionMm.Z;
         fish.BodyDirectionRad     = (float)Math.PI / 2;
         fish.VelocityDirectionRad = (float)Math.PI / 2;
     }
     else if (preQuadrant == 2)
     {// 将鱼移到底部障碍物下边且鱼体方向置为PI
         fish.PositionMm.X         = Env.ObstaclesRect[1].PositionMm.X;
         fish.PositionMm.Z         = Env.ObstaclesRect[1].PositionMm.Z + Env.ObstaclesRect[1].WidthMm / 2 + 50;
         fish.BodyDirectionRad     = (float)Math.PI;
         fish.VelocityDirectionRad = (float)Math.PI;
     }
     else if (preQuadrant == 3)
     {// 将鱼移到左侧障碍物左边且鱼体方向置为3PI/2
         fish.PositionMm.X         = Env.ObstaclesRect[0].PositionMm.X - Env.ObstaclesRect[0].LengthMm / 2 - 50;
         fish.PositionMm.Z         = Env.ObstaclesRect[0].PositionMm.Z;
         fish.BodyDirectionRad     = 3f * (float)Math.PI / 2;
         fish.VelocityDirectionRad = 3f * (float)Math.PI / 2;
     }
     else if (preQuadrant == 4)
     {// 将鱼移到顶部障碍物上边且鱼体方向置为0
         fish.PositionMm.X         = Env.ObstaclesRect[1].PositionMm.X;
         fish.PositionMm.Z         = Env.ObstaclesRect[1].PositionMm.Z - Env.ObstaclesRect[1].WidthMm / 2 - 50;
         fish.BodyDirectionRad     = 0;
         fish.VelocityDirectionRad = 0;
     }
 }
Ejemplo n.º 2
0
 // LiYoubing 2010-07-14, modified by renjing 2010-12-29
 /// <summary>
 /// 双鱼过孔竞速犯规判断
 /// </summary>
 /// <param name="fish">目标仿真机器鱼</param>
 /// <param name="curQuadrant">当前仿真周期所在象限</param>
 /// <param name="preQuadrant">前一仿真周期所在象限</param>
 /// <returns>true犯规;false未犯规</returns>
 private bool JudgeFouling(FishDoubleFishRacingViaHoles fish, int curQuadrant, int preQuadrant)
 {
     if (fish.PositionMm.X == 0 || fish.PositionMm.Z == 0)
     {// 当前位置在坐标轴上
         return(false);
     }
     else if ((Math.Abs(curQuadrant - preQuadrant) == 2) ||
              (curQuadrant - preQuadrant == -1) || (curQuadrant - preQuadrant == 3))
     {// 前后仿真周期分别处于一三或二四象限/鱼逆时针游过一个象限或顺时针游过三个象限
         return(true);
     }
     if (fish.PositionMm.Z * fish.PrePositionMm.Z <= 0)
     {
         if ((fish.PositionMm.X >= Env.ObstaclesRect[0].PolygonVertices[1].X) &&
             (fish.PositionMm.X <= Env.ObstaclesRect[2].PolygonVertices[0].X))
         {// 位于最左边障碍物和最右边障碍物之间 方形障碍物左上/右上/右下/左下四个顶点序号依次为0/1/2/3
             return(true);
         }
         else if (Math.Abs(fish.PositionMm.X - fish.PrePositionMm.X) > Env.FieldInfo.FieldLengthXMm / 2)
         {
             return(true);
         }
     }
     return(false);
 }
Ejemplo n.º 3
0
        // added by LiYoubing 2010-07-06, modified by renjing 2010-12-29
        /// <summary>
        /// 双鱼过孔竞速控制规则
        /// 根据鱼相对场地中心点游过的角度(用弧度单位)的累计来判断是否并排及并排时是哪条鱼追上了另一条鱼
        /// 角度计算坐标系以场地中心为原点,正右为X轴正半轴,正下为Y轴正半轴
        /// </summary>
        private void HandleSpecialRulesWhileChasingOnField()
        {
            for (int i = 0; i < 2; i++)
            {
                // 计算仿真机器鱼位置角[0,2π)及所在象限
                currentRadian[i] = CalcRadianAndQuadrant(Teams[i].Fishes[0], ref currentQuadrant[i]);

                // 犯规判断
                bool bFouledFlag = JudgeFouling(Teams[i].Fishes[0], currentQuadrant[i], previousQuadrant[i]);
                if (bFouledFlag == true)
                {                                    // 犯规了
                    CommonPara.IsPaused      = true; // 中断仿真循环停止计时
                    CommonPara.IsPauseNeeded = true; // 指示界面模拟点击“暂停”按钮

                    // 犯规提示
                    MessageBox.Show(string.Format("【{0}】 Fouled!", Teams[i].Para.Name),
                                    "Confirming", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                    // 犯规处理
                    FishDoubleFishRacingViaHoles fish = Teams[i].Fishes[0];
                    HandleFouling(ref fish, previousQuadrant[i]);
                }
                else
                {// 没有犯规则累加成绩处理计数
                    DataProcessing(ref previousQuadrant[i], currentQuadrant[i],
                                   ref previousRadian[i], currentRadian[i], ref totalRadian[i]);
                }
            }
        }
Ejemplo n.º 4
0
        // LiYoubing 2010-07-14, modified by renjing 2010-12-29
        /// <summary>
        /// 双鱼过孔竞速计算仿真机器鱼位置角及所在象限
        /// 场地中心为原点,正右为正X正下为正Z轴,位置角从正X开始沿顺时针取[0,2π)
        /// </summary>
        /// <param name="fish">仿真机器鱼</param>
        /// <param name="currentQuadrant">仿真机器鱼前方矩形中心当前所在象限,ref型,被赋予新值</param>
        /// <returns>场地中心点指向仿真机器鱼中心点向量的方向(取[0,2π))</returns>
        private float CalcRadianAndQuadrant(FishDoubleFishRacingViaHoles fish, ref int currentQuadrant)
        {
            // 先计算仿真机器鱼位置和原点连线与X轴的夹角(取[0,PI/2))
            double curRadian;

            if (fish.PositionMm.X != 0)
            {// 不在Z轴上可通过反正切求夹角
                curRadian = Math.Atan2(Math.Abs(fish.PositionMm.Z), Math.Abs(fish.PositionMm.X));
            }
            else
            {     // 在Z轴上
                if (fish.PositionMm.Z < 0)
                { // 在Z轴负半轴上
                    curRadian = 3 * Math.PI / 2;
                }
                else if (fish.PositionMm.Z > 0)
                {// 在Z轴正半轴上
                    curRadian = Math.PI / 2;
                }
                else
                {// 在原点
                    curRadian = 0;
                }
            }
            if (fish.PositionMm.X > 0 && fish.PositionMm.Z >= 0)
            {// 正X轴算第一象限
                currentQuadrant = 1;
            }
            else if (fish.PositionMm.X <= 0 && fish.PositionMm.Z > 0)
            {// 正Z轴算第二象限
                curRadian       = Math.PI - curRadian;
                currentQuadrant = 2;
            }
            else if (fish.PositionMm.X < 0 && fish.PositionMm.Z <= 0)
            {// 负X轴算第三象限
                curRadian       = Math.PI + curRadian;
                currentQuadrant = 3;
            }
            else if (fish.PositionMm.X >= 0 && fish.PositionMm.Z < 0)
            {// 负Z轴算第四象限
                curRadian       = 2 * Math.PI - curRadian;
                currentQuadrant = 4;
            }
            return((float)curRadian);
        }