Разделение вращающегося прямоугольника на более мелкие прямоугольники, как их вращать, чтобы сохранить исходный большой прямоугольник?

#c #rotation #sfml

#c #вращение #sfml

Вопрос:

У меня есть прямоугольник r размером 1536×720, который я поворачиваю вокруг его собственной центральной точки p(768, 360) , что достаточно просто с помощью встроенной функции sf :: Sprite ::rotate

Теперь по несвязанным причинам я должен разделить прямоугольник на 6 меньших прямоугольников (каждый размером 512×360).

Эти меньшие прямоугольники — это просто r разрезанный прямоугольник большего размера; они расположены таким образом, что «сшитые вместе» они образуют исходный прямоугольник (так что похоже, что это все еще оригинальный большой прямоугольник)

Иллюстрация: изображение

Поскольку прямоугольник r постоянно вращался вокруг своего собственного центра, разделение его на меньшие прямоугольники создало проблему:

Как мне повернуть сшитый прямоугольник (т. Е. Меньшие прямоугольники) вокруг исходного центра p , чтобы сохранить исходный больший прямоугольник? Возможно ли это вообще?

Мой английский не так уж хорош, поэтому его немного сложно объяснить. Если вам нужно больше объяснений, я могу нарисовать сценарий в paint или что-то в этом роде

Ответ №1:

Вы можете использовать sf::Transformable::setOrigin , чтобы установить начало преобразования каждого маленького прямоугольника в центральную точку большого.

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

Комментарии:

1. Означает ли это, что мне все равно нужно поворачивать каждый маленький прямоугольник так, как я бы повернул большой прямоугольник? Итак, поверните каждый маленький прямоугольник, а затем используйте sf::Transformable::setOrigin?

2. Да, setOrigin сначала только вы, а затем поворачивайте их по своему усмотрению. Я должен сказать, что обычно вы используете иерархию преобразований для достижения этой цели, но для этого вам нужно предоставить свой фактический код.

3. Понятно, спасибо! Я попробую это сейчас и посмотрю, смогу ли я заставить его работать

4. Это работает. Я использую следующий код sf::Transform rot; rot.rotate(0.5, 768, 360); … sprites_.at (i).setPosition(поворот.Точка преобразования (sprites_.at (i).GetPosition())); sprites_.at (i).поворот (0,5f);