不准确的角度

时间:2014-09-13 20:43:34

标签: c# xna

在我的游戏引擎中,我编写了一个脚本来检查一个点是否在4个点内(方形多边形)。这是通过计算每个点到我们正在检查的点的角度来完成的(如果它在多边形内,则4个角的总和应该总是等于360)。然而它完全失败了。我在调试后总结说脚本不准确,但我看不出我做错了什么。有人能告诉我为什么这些功能搞砸了吗?因为出了什么问题,我完全失去了。

public static float getAngle(Vector2 position1, Vector2 position2)
{
    float radians = (float)Math.Atan2(position1.Y - position2.Y, position1.X - position2.X);
    return Math.Abs(radians * 180 / (float)Math.PI);
}

public static bool inSquarePolygon(Vector2 target, Vector2 pointA, Vector2 pointB, Vector2 pointC, Vector2 pointD)
{
    float pointAAngle = MathMethods.getAngle(pointA, target);
    float pointBAngle = MathMethods.getAngle(pointB, target);
    float pointCAngle = MathMethods.getAngle(pointC, target);
    float pointDAngle = MathMethods.getAngle(pointD, target);

    if (Math.Round(pointAAngle + pointBAngle + pointCAngle + pointDAngle) == 360)
    {
        System.Diagnostics.Debug.WriteLine("SUCCESS");
         return true;
    }

    return false;
}

2 个答案:

答案 0 :(得分:0)

这是一个视觉辅助工具,可显示您当前的getAngle()值重叠:

enter image description here


这是一种可行的解决方法,可以在您当前的方法中使用第二个图形表示的内容

if (Math.Round(pointAAngle +
                (pointBAngle - pointAAngle) +
                (pointCAngle - pointBAngle) +
                (pointDAngle - pointCAngle) +
                (360 - pointDAngle)) == 360)
{
    //success
}

答案 1 :(得分:0)

我发现了这个错误。我的getAngle函数没有任何问题。它没有完成。但是我在睡觉之后回到我原来的大学文件中,找到了我需要的代码。

float corner1 = ((pointD.X - target.X) * (pointA.Y - target.Y)) - ((pointA.X - target.X) * (pointD.Y - target.Y));
float corner2 = ((pointA.X - target.X) * (pointB.Y - target.Y)) - ((pointB.X - target.X) * (pointA.Y - target.Y));
float corner3 = ((pointB.X - target.X) * (pointC.Y - target.Y)) - ((pointC.X - target.X) * (pointB.Y - target.Y));
float corner4 = ((pointC.X - target.X) * (pointD.Y - target.Y)) - ((pointD.X - target.X) * (pointC.Y - target.Y));

return (Math.Sign(corner1) == Math.Sign(corner2)) && (Math.Sign(corner2) == Math.Sign(corner3)) && (Math.Sign(corner3) == Math.Sign(corner4));