#include <iostream>
#include <cmath>
float screen_to_angle(const float pixel_dist, const float screen_width, const float fov)
{
return atanf(pixel_dist / -((screen_width / 2.F) / tanf(fov / 2.F)));
}
float ratio_at_dist(const float dist, const float fov1, const float fov2)
{
const auto ang1 = screen_to_angle(dist, 1920, fov1 * 3.1415926 / 180.F);
const auto ang2 = screen_to_angle(dist, 1920, fov2 * 3.1415926 / 180.F);
return ang1 / ang2;
}
int main()
{
std::cout << "Ratio at 5px from center: ";
std::cout << ratio_at_dist(5.F, 51.F, 103.F) << std::endl;
std::cout << "Ratio at 960px from center: ";
std::cout << ratio_at_dist(960.F, 51.F, 103.F) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CgpmbG9hdCBzY3JlZW5fdG9fYW5nbGUoY29uc3QgZmxvYXQgcGl4ZWxfZGlzdCwgY29uc3QgZmxvYXQgc2NyZWVuX3dpZHRoLCBjb25zdCBmbG9hdCBmb3YpCnsKCXJldHVybiBhdGFuZihwaXhlbF9kaXN0IC8gLSgoc2NyZWVuX3dpZHRoIC8gMi5GKSAvIHRhbmYoZm92IC8gMi5GKSkpOwp9CgpmbG9hdCByYXRpb19hdF9kaXN0KGNvbnN0IGZsb2F0IGRpc3QsIGNvbnN0IGZsb2F0IGZvdjEsIGNvbnN0IGZsb2F0IGZvdjIpCnsKCWNvbnN0IGF1dG8gYW5nMSA9IHNjcmVlbl90b19hbmdsZShkaXN0LCAxOTIwLCBmb3YxICogMy4xNDE1OTI2IC8gMTgwLkYpOwoJY29uc3QgYXV0byBhbmcyID0gc2NyZWVuX3RvX2FuZ2xlKGRpc3QsIDE5MjAsIGZvdjIgKiAzLjE0MTU5MjYgLyAxODAuRik7CgkKCXJldHVybiBhbmcxIC8gYW5nMjsKfQoKaW50IG1haW4oKQp7CglzdGQ6OmNvdXQgPDwgIlJhdGlvIGF0IDVweCBmcm9tIGNlbnRlcjogIjsKCXN0ZDo6Y291dCA8PCByYXRpb19hdF9kaXN0KDUuRiwgNTEuRiwgMTAzLkYpIDw8IHN0ZDo6ZW5kbDsKCQoJc3RkOjpjb3V0IDw8ICJSYXRpbyBhdCA5NjBweCBmcm9tIGNlbnRlcjogIjsKCXN0ZDo6Y291dCA8PCByYXRpb19hdF9kaXN0KDk2MC5GLCA1MS5GLCAxMDMuRikgPDwgc3RkOjplbmRsOwoJCglyZXR1cm4gMDsKfQ==