在我的游戏引擎中,我编写了一个脚本来检查一个点是否在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;
}
答案 0 :(得分:0)
这是一个视觉辅助工具,可显示您当前的getAngle()
值重叠:
这是一种可行的解决方法,可以在您当前的方法中使用第二个图形表示的内容
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));