C# C船舶与船尾碰撞试验

C# C船舶与船尾碰撞试验,c#,C#,我们正试图对飞船和小行星进行碰撞检测。 如果成功,则应在转弯前检测碰撞。 然而,它是混淆之间的角度350和15,它不是真正的工作。 有时它在移动,但有时它根本不移动。 另一方面,它也没有在正确的时间拍摄 我只是想问一下如何使碰撞检测工作??? 如何解决角度混淆问题 // Get velocities of asteroid Console.WriteLine("lol"); // IF equation is betw

我们正试图对飞船和小行星进行碰撞检测。 如果成功,则应在转弯前检测碰撞。 然而,它是混淆之间的角度350和15,它不是真正的工作。 有时它在移动,但有时它根本不移动。 另一方面,它也没有在正确的时间拍摄

我只是想问一下如何使碰撞检测工作??? 如何解决角度混淆问题

            // Get velocities of asteroid


            Console.WriteLine("lol");

            // IF equation is between -2 and -3
            if (equation1a <= -2)
            {
                // Calculate no. turns till asteroid hits
                float turns_till_hit = dx / vx;

                // Calculate angle of asteroid
                float asteroid_angle_rad = (float)Math.Atan(Math.Abs(dy / dx));
                float asteroid_angle_deg = (float)(asteroid_angle_rad * 180 / Math.PI);

                float asteroid_angle = 0;

                // Calculate angle if asteroid is in certain positions
                if (asteroid.Y > ship.Y && asteroid.X > ship.X)
                {
                    asteroid_angle = asteroid_angle_deg; 
                }
                else if (asteroid.Y < ship.Y && asteroid.X > ship.X)
                {
                    asteroid_angle = (360 - asteroid_angle_deg);
                }
                else if (asteroid.Y < ship.Y && asteroid.X < ship.X)
                {
                    asteroid_angle = (180 + asteroid_angle_deg);
                }
                else if (asteroid.Y > ship.Y && asteroid.X < ship.X)
                {
                    asteroid_angle = (180 - asteroid_angle_deg);
                }

                // IF turns till asteroid hits are less than 35
                if (turns_till_hit < 50)
                {
                    float angle_between = 0;

                    // Calculate angle between if asteroid is in certain positions
                    if (asteroid.Y > ship.Y && asteroid.X > ship.X)
                    {
                        angle_between = ship_angle - asteroid_angle;
                    }
                    else if (asteroid.Y < ship.Y && asteroid.X > ship.X)
                    {
                        angle_between = (360 - Math.Abs(ship_angle - asteroid_angle));
                    }
                    else if (asteroid.Y < ship.Y && asteroid.X < ship.X)
                    {
                        angle_between = ship_angle - asteroid_angle;
                    }
                    else if (asteroid.Y > ship.Y && asteroid.X < ship.X)
                    {
                        angle_between = ship_angle - asteroid_angle;
                    }

                    // If angle less than 0, add 360
                    if (angle_between < 0)
                    {
                        //angle_between %= 360;
                        angle_between = Math.Abs(angle_between);
                    }

                    // Calculate no. of turns to face asteroid
                    float turns_to_face = angle_between / 25;

                    if (turns_to_face < turns_till_hit)
                    {
                        float ship_angle_left = ShipAngle(ship_angle, "leftKey", 1);

                        float ship_angle_right = ShipAngle(ship_angle, "rightKey", 1);

                        float angle_between_left = Math.Abs(ship_angle_left - asteroid_angle);

                        float angle_between_right = Math.Abs(ship_angle_right - asteroid_angle);

                        if (angle_between_left < angle_between_right)
                        {
                            leftKey = true;
                        }
                        else if (angle_between_right < angle_between_left)
                        {
                            rightKey = true;
                        }

                    }

                    if (angle_between > 0 && angle_between < 25)
                    {
                        spaceKey = true;
                    }
                }
            }


        }

    }  
如何使碰撞检测工作

找到一个不能正常工作的可重复的场景

手工计算出该情景的正确计算结果

在调试器中启动程序。观看程序执行这些计算

当您的计算结果与手工计算的正确计算结果不匹配时,这就是错误所在

特别是,寻找注释与代码不匹配的地方;这些可能是错误的。例如,此位:

// If angle less than 0, add 360
if (angle_between < 0)
{
    angle_between = Math.Abs(angle_between); 
}
注释说了一件事,代码做了一些完全不同的事情。它是实际运行的代码

还有一个建议:所有的计算都是双倍的。没有理由继续将双打抛到浮球上。这样做会使你的程序变得更慢、更不准确。也可以考虑用弧度做所有的计算,而不是在弧度和度数之间来回转换。


我还注意到,在代码中有很多机会以零除法。这些很可能是bug。

你希望我们做什么?你好像忘记问问题了。这是一个问答网站。你已经陈述了一系列的需求,并且说你有bug;这些不是问题。您对这些需求或bug有什么疑问吗?我刚刚编辑了一下…@gbianchi找到bug并更正代码:哈哈哇。这是一个潜在的巨大问题。你需要改进你的文章很多。这段代码也有很多错误。spaceKey、leftKey等在理想情况下都应该根据它们的“切换”来命名。例如spaceKeyVisible。但是如何使用弧度呢?我以为永远都是度?@CherryMa:数学函数都使用弧度。