Редактировать: оглянувшись назад, я использую MonoGame, а OP использует Windows Forms. Следующее для MonoGame.
Я уже давно облажался и нашел пару ответов, но на самом деле ни один из них не сработал. Вот функция C #, которая работает точно так же, как описывает OP, если не для OP, то другие люди гуглят, как я.
Это была головная боль, чтобы понять это. Много типичных догадок.
bool PointIsInRotatedRectangle(Vector2 P, Rectangle rect, float rotation)
{
Matrix rotMat = Matrix.CreateRotationZ(-rotation);
Vector2 Localpoint = P - (rect.Location).ToVector2();
Localpoint = Vector2.Transform(Localpoint, rotMat);
Localpoint += (rect.Location).ToVector2();
if (rect.Contains(Localpoint)) { return true; }
return false;
}
И здесь это в одной строке кода. Возможно, быстрее использовать.
bool PointIsInRotatedRectangle(Vector2 P, Rectangle rect, float rotation)
{
if (
rect.Contains(Vector2.Transform(P - (rect.Location).ToVector2(), Matrix.CreateRotationZ(-rotation)) + (rect.Location).ToVector2())
) { return true; }
return false;
}