2D Повернутый прямоугольник содержит расчет точки - PullRequest
0 голосов
/ 24 декабря 2018

Моя проблема в том, что я пытался проверить, содержит ли прямоугольник, повернутый на определенное количество градусов, точку, но я не смог вычислить это после многих попыток с помощью некоторых примеров кода ипримеры, которые я нашел в Интернете.

Я получил прямоугольник (X, Y, Ширина, Высота, Вращение) и точку (X, Y), и я пытался создать простую функциюэто позволяет мне мгновенно рассчитать это, что-то вроде этого:

public bool Contains(Rect Rectangle, float RectangleRotation, Point PointToCheck);

Но, как я уже говорил, я не смог этого сделать, те математические вычисления, которые включают некоторые формулы, которые я нашел в Интернете, являютсяслишком много для меня, чтобы понять.

Может ли кто-нибудь помочь мне с этим вычислить?Если бы вы могли предоставить вычисления в форме кода C # (не формулы), это было бы здорово!Спасибо.

PS: использование движка 2D Physics Engine, доступного в Unity3D, не вариант, мой прямоугольник не связан с игровым объектом, к которому я мог бы прикрепить компонент столкновения 2D, мне нужно сделать это математически безучастие игровых объектов или компонентов.

Редактировать: Я забыл упомянуть, прямоугольник поворачивается на середину прямоугольника (центр / начало координат).

1 Ответ

0 голосов
/ 24 декабря 2018

Вместо того, чтобы проверять, находится ли точка в повернутом прямоугольнике, просто примените противоположное вращение к точке и проверьте, находится ли точка в нормальном прямоугольнике.Другими словами, измените вашу перспективу, повернув все на -RectangleRotation, чтобы прямоугольник вообще не вращался.

public bool Contains(Rect rect, float rectAngle, Point point)
{
    // rotate around rectangle center by -rectAngle
    var s = Math.Sin(-rectAngle);
    var c = Math.Cos(-rectAngle);

    // set origin to rect center
    var newPoint = point - rect.center;
    // rotate
    newPoint = new Point(newPoint.x * c - newPoint.y * s, newPoint.x * s + newPoint.y * c);
    // put origin back
    newPoint = newPoint + rect.center;

    // check if our transformed point is in the rectangle, which is no longer
    // rotated relative to the point

    return newPoint.x >= rect.xMin && newPoint.x <= rect.xMax && newPoint.y >= rect.yMin && newPoint.y <= rect.yMax;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...