#include <iostream>
#include <math.h>
struct Vector2D
{
float x, y;
Vector2D() : x(0), y(0) {}
Vector2D(float x, float y) : x(x), y(y) {}
Vector2D operator -(const Vector2D& v) const
{
return (Vector2D(x - v.x, y - v.y));
}
Vector2D operator -(void) const
{
return (Vector2D(-x, -y));
}
float magnitude() { return (float)sqrt(x * x + y * y); }
};
const Vector2D minimapCenter(627, 135);
float dot(const Vector2D& a, const Vector2D& b)
{
return a.x * b.y + a.y * b.x;
}
void rotate(Vector2D& p, float theta)
{
p.x = cos(theta) * (p.x) - sin(theta) * (p.y);
p.y = sin(theta) * (p.x) + cos(theta) * (p.y);
}
float getTheta(const Vector2D& texCoord0, const Vector2D& texCoord1)
{
Vector2D a(0, -1), b = texCoord0 - texCoord1;
return atan2(a.y,a.x) - atan2(b.y,b.x);
}
Vector2D getRelativePosition(const Vector2D& texCoord0, const Vector2D& texCoord1)
{
Vector2D p = texCoord0 - minimapCenter;
rotate(p, getTheta(texCoord0, texCoord1));
//p = -p;
return p;
}
using std::cout;
using std::endl;
int main()
{
Vector2D texCoord0(309.88147, -144.74777); // top left
Vector2D texCoord1(305.99057, 389.2381); // bottom left
cout << getTheta(texCoord0, texCoord1) << endl;
Vector2D p = getRelativePosition(texCoord0, texCoord1);
cout << "(" << p.x << ", " << p.y << ")" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPiAKCnN0cnVjdCBWZWN0b3IyRAp7CiAgICBmbG9hdCB4LCB5OwogICAgVmVjdG9yMkQoKSA6IHgoMCksIHkoMCkge30KICAgIFZlY3RvcjJEKGZsb2F0IHgsIGZsb2F0IHkpIDogeCh4KSwgeSh5KSB7fQogICAgVmVjdG9yMkQgb3BlcmF0b3IgLShjb25zdCBWZWN0b3IyRCYgdikgY29uc3QKICAgIHsKICAgIAlyZXR1cm4gKFZlY3RvcjJEKHggLSB2LngsIHkgLSB2LnkpKTsKICAgIH0KICAgIFZlY3RvcjJEIG9wZXJhdG9yIC0odm9pZCkgY29uc3QKICAgIHsKICAgIAlyZXR1cm4gKFZlY3RvcjJEKC14LCAteSkpOwogICAgfQogICAgZmxvYXQgbWFnbml0dWRlKCkgeyByZXR1cm4gKGZsb2F0KXNxcnQoeCAqIHggKyB5ICogeSk7IH0KfTsKCmNvbnN0IFZlY3RvcjJEIG1pbmltYXBDZW50ZXIoNjI3LCAxMzUpOwoKZmxvYXQgZG90KGNvbnN0IFZlY3RvcjJEJiBhLCBjb25zdCBWZWN0b3IyRCYgYikKewogICAgcmV0dXJuIGEueCAqIGIueSArIGEueSAqIGIueDsKfQoKdm9pZCByb3RhdGUoVmVjdG9yMkQmIHAsIGZsb2F0IHRoZXRhKQp7CiAgICBwLnggPSBjb3ModGhldGEpICogKHAueCkgLSBzaW4odGhldGEpICogKHAueSk7CiAgICBwLnkgPSBzaW4odGhldGEpICogKHAueCkgKyBjb3ModGhldGEpICogKHAueSk7Cn0KCmZsb2F0IGdldFRoZXRhKGNvbnN0IFZlY3RvcjJEJiB0ZXhDb29yZDAsIGNvbnN0IFZlY3RvcjJEJiB0ZXhDb29yZDEpCnsKICAgIFZlY3RvcjJEIGEoMCwgLTEpLCBiID0gdGV4Q29vcmQwIC0gdGV4Q29vcmQxOwogICAgcmV0dXJuIGF0YW4yKGEueSxhLngpIC0gYXRhbjIoYi55LGIueCk7Cn0KClZlY3RvcjJEIGdldFJlbGF0aXZlUG9zaXRpb24oY29uc3QgVmVjdG9yMkQmIHRleENvb3JkMCwgY29uc3QgVmVjdG9yMkQmIHRleENvb3JkMSkKewoJVmVjdG9yMkQgcCA9IHRleENvb3JkMCAtIG1pbmltYXBDZW50ZXI7CiAgICByb3RhdGUocCwgZ2V0VGhldGEodGV4Q29vcmQwLCB0ZXhDb29yZDEpKTsKICAgIC8vcCA9IC1wOwogICAgcmV0dXJuIHA7Cn0KCnVzaW5nIHN0ZDo6Y291dDsKdXNpbmcgc3RkOjplbmRsOwppbnQgbWFpbigpCnsKICAgIFZlY3RvcjJEIHRleENvb3JkMCgzMDkuODgxNDcsIC0xNDQuNzQ3NzcpOyAvLyB0b3AgbGVmdAogICAgVmVjdG9yMkQgdGV4Q29vcmQxKDMwNS45OTA1NywgMzg5LjIzODEpOyAvLyBib3R0b20gbGVmdAogICAgCiAgICBjb3V0IDw8IGdldFRoZXRhKHRleENvb3JkMCwgdGV4Q29vcmQxKSA8PCBlbmRsOwogICAgCiAgICBWZWN0b3IyRCBwID0gZ2V0UmVsYXRpdmVQb3NpdGlvbih0ZXhDb29yZDAsIHRleENvb3JkMSk7CiAgICBjb3V0IDw8ICIoIiA8PCBwLnggPDwgIiwgIiA8PCBwLnkgPDwgIikiIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQo=