#include <cmath>
#include <iostream>
#include <utility>
std::pair<float, float> rotate(std::pair<float, float> origin, std::pair<float, float> start, unsigned int degrees)
{
std::pair<float, float> diff = std::make_pair(start.first - origin.first, start.second - origin.second);
float currentAngle = ::atan2(diff.second, std::abs(diff.first));
float newAngle = currentAngle + (degrees / 180.0 * 3.1415926539);
float radius = std::sqrt(diff.first * diff.first + diff.second * diff.second);
float cosAngle = ::cos(newAngle);
float sinAngle = ::sin(newAngle);
float x = origin.first + radius * cosAngle;
float y = origin.second + radius * sinAngle;
return std::make_pair(x, y);
}
int main()
{
std::pair<float, float> origin = std::make_pair(0.0, 0.0);
std::pair<float, float> start = std::make_pair(1.0, 0.0);
const unsigned int degrees = 45;
for (unsigned int i = 0; i < 360; i += degrees)
{
std::pair<float, float> newPos = rotate(origin, start, i);
std::cout << "Rotated to " << i << " degrees: (" << newPos.first << ", " << newPos.second << ")" << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGNtYXRoPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx1dGlsaXR5PgoKc3RkOjpwYWlyPGZsb2F0LCBmbG9hdD4gcm90YXRlKHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IG9yaWdpbiwgc3RkOjpwYWlyPGZsb2F0LCBmbG9hdD4gc3RhcnQsIHVuc2lnbmVkIGludCBkZWdyZWVzKQp7CglzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBkaWZmID0gc3RkOjptYWtlX3BhaXIoc3RhcnQuZmlyc3QgLSBvcmlnaW4uZmlyc3QsIHN0YXJ0LnNlY29uZCAtIG9yaWdpbi5zZWNvbmQpOwoJZmxvYXQgY3VycmVudEFuZ2xlID0gOjphdGFuMihkaWZmLnNlY29uZCwgc3RkOjphYnMoZGlmZi5maXJzdCkpOwoJZmxvYXQgbmV3QW5nbGUgPSBjdXJyZW50QW5nbGUgKyAoZGVncmVlcyAvIDE4MC4wICogMy4xNDE1OTI2NTM5KTsKCWZsb2F0IHJhZGl1cyA9IHN0ZDo6c3FydChkaWZmLmZpcnN0ICogZGlmZi5maXJzdCArIGRpZmYuc2Vjb25kICogZGlmZi5zZWNvbmQpOwoJZmxvYXQgY29zQW5nbGUgPSA6OmNvcyhuZXdBbmdsZSk7CglmbG9hdCBzaW5BbmdsZSA9IDo6c2luKG5ld0FuZ2xlKTsKCWZsb2F0IHggPSBvcmlnaW4uZmlyc3QgKyByYWRpdXMgKiBjb3NBbmdsZTsKCWZsb2F0IHkgPSBvcmlnaW4uc2Vjb25kICsgcmFkaXVzICogc2luQW5nbGU7CglyZXR1cm4gc3RkOjptYWtlX3BhaXIoeCwgeSk7Cn0KCmludCBtYWluKCkgCnsKCXN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IG9yaWdpbiA9IHN0ZDo6bWFrZV9wYWlyKDAuMCwgMC4wKTsKCXN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IHN0YXJ0ID0gc3RkOjptYWtlX3BhaXIoMS4wLCAwLjApOwoJY29uc3QgdW5zaWduZWQgaW50IGRlZ3JlZXMgPSA0NTsKCWZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgMzYwOyBpICs9IGRlZ3JlZXMpCgl7CgkJc3RkOjpwYWlyPGZsb2F0LCBmbG9hdD4gbmV3UG9zID0gcm90YXRlKG9yaWdpbiwgc3RhcnQsIGkpOwoJCXN0ZDo6Y291dCA8PCAiUm90YXRlZCB0byAiIDw8IGkgPDwgIiBkZWdyZWVzOiAoIiA8PCBuZXdQb3MuZmlyc3QgPDwgIiwgIiA8PCBuZXdQb3Muc2Vjb25kIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==
Rotated to 0 degrees: (1, 0)
Rotated to 45 degrees: (0.707107, 0.707107)
Rotated to 90 degrees: (-4.37114e-08, 1)
Rotated to 135 degrees: (-0.707107, 0.707107)
Rotated to 180 degrees: (-1, -8.74228e-08)
Rotated to 225 degrees: (-0.707107, -0.707107)
Rotated to 270 degrees: (1.19249e-08, -1)
Rotated to 315 degrees: (0.707107, -0.707107)