2014-09-13 3 views
0

В моем игровом движке я написал сценарий, чтобы проверить, находится ли точка в пределах 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; 
} 
+1

Найти случай, который терпит неудачу. Запишите на листе бумаги то, что, по вашему мнению, результат должен быть в каждой строке вашего метода. Теперь пройдите свой метод в отладчике, выполняющем этот тестовый пример, и запишите, что делает каждая строка. Когда два списка отличаются друг от друга, вот где ошибка. –

+0

Я сделал это, сел и вычислил углы. Я пришел к выводу, что проблема заключается в функции getAngle. –

+0

Расчеты, производимые компьютером, близки, но не идеальны 360. Он колеблется от 350 до 370 –

ответ

0

здесь является наглядным пособием, чтобы показать, что текущие getAngle() значения перекрываются:

enter image description here


Вот возможный обходной путь, который делает то, что второй графический элемент указывает время работы в пределах вашего тока методология

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

В вашей математике говорится: «Если 360 + a - a + b - b + c - c + d - d == 360» - при каких обстоятельствах вы ожидаете, что это будет ложь? –

+0

очень хороший пункт. :-) –

0

Я нашел th e ошибка. Не было ничего плохого в моей функции 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));