Вращение круга вместе с прямоугольником
Есть прямоугольник, который вращается вокруг своего центра. Также есть круг, который должен располагаться на правой стороне прямоугольника. При вращении прямоугольника, круг должен вращаться вокруг центра этого прямоугольника, причем его отображаемы координаты должны соответсвтовать реальным. Например, если виодно, что он нарисван в x=100, y == 100, то если вызвать метод getPosition, он вернет эти координаты. Лично у меня это и не получается и из-за этого я не могу нормально отследить коллизию с другими кругами.
Я использую библиотку SFML. Для вращения прямоугольника, я сделал SetOrigin(центр прямоуглька) и он вращается как надо. Сама проблема возникла при попытке вращения круга. Я на чуйку выставил координаты круга и origin так, чтобы он соответсвовал рисунку, но отображаемые координаты и границы круга отличаются от реальных. То есть видимый круг НЕ сталкивается, но внутри прямоугольнка, как бы, появился другой невидимый круг, и вот он сталкивается. Пример кода:
#include <SFML/Graphics.hpp>
#include <iostream>
#define PI 3.1415f
float getRadiansFromDegree(float degree)
{
return degree * PI / 180.0f;
}
float getDegreeFromRadians(float radians)
{
return 180.0f * radians / PI;
}
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "Rotate test");
window.setFramerateLimit(60);
sf::RectangleShape rectangle(sf::Vector2f(100, 50));
sf::FloatRect rectangle_local_bounds = rectangle.getLocalBounds();
rectangle.setOrigin(rectangle_local_bounds.width / 2, rectangle_local_bounds.height / 2);
rectangle.setPosition(300,300);
rectangle.setFillColor(sf::Color::Red);
float move_speed = 0.3;
float rotate_speed = 0.3;
float current_rotate_degree = 0;
sf::CircleShape circle(20);
sf::FloatRect circle_local_bounds = circle.getLocalBounds();
circle.setFillColor(sf::Color::Green);
sf::Clock clock;
while (window.isOpen())
{
sf::Time elapsed_time = clock.getElapsedTime();
clock.restart();
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
window.close();
}
}
float elapsed_milliseconds = elapsed_time.asMilliseconds();
float current_radians = getRadiansFromDegree(current_rotate_degree);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
{
rectangle.move(move_speed * elapsed_milliseconds * cos(current_radians), move_speed * elapsed_milliseconds * sin(current_radians));
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
{
rectangle.move(-move_speed * elapsed_milliseconds * cos(current_radians), -move_speed * elapsed_milliseconds * sin(current_radians));
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
current_rotate_degree += rotate_speed * elapsed_milliseconds;
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
current_rotate_degree -= rotate_speed * elapsed_milliseconds;
}
rectangle.setRotation(current_rotate_degree);
//Насильно выставил шар, но его реальные кооординаты отличаются от отображаемых.
sf::FloatRect rectange_global_bounds = rectangle.getGlobalBounds();
circle.setOrigin(-50,20);
circle.setPosition(rectange_global_bounds.left + rectange_global_bounds.width / 2, rectange_global_bounds.top + rectange_global_bounds.height / 2);
circle.setRotation(current_rotate_degree);
window.clear(sf::Color::Black);
window.draw(rectangle);
window.draw(circle);
window.display();
}
return 0;
}
