В моем игровом движке я написал сценарий, чтобы проверить, находится ли точка в пределах 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;
}
Найти случай, который терпит неудачу. Запишите на листе бумаги то, что, по вашему мнению, результат должен быть в каждой строке вашего метода. Теперь пройдите свой метод в отладчике, выполняющем этот тестовый пример, и запишите, что делает каждая строка. Когда два списка отличаются друг от друга, вот где ошибка. –
Я сделал это, сел и вычислил углы. Я пришел к выводу, что проблема заключается в функции getAngle. –
Расчеты, производимые компьютером, близки, но не идеальны 360. Он колеблется от 350 до 370 –