我有一个圆点为0-360的圆,第一个点和最后一个点相连,取点11和216。现在,给出任意点如何找到接近11或216的点。我需要一个通用算法。例如:如果给定点20,它应该发现它接近11,而给定200时它应该找到接近216。到这一点为止,它很容易,但是,对于点350,它应该发现它接近11,而不是216。有这个公式,但是在第三种情况下不起作用:
int find_point(int a){
int temp1=(a>=11?a-11:11-a);
int temp2=(a>=216?a-216:216-a);
if(temp1<temp2)
return 11;
else
return 216;
}
这就是圈的诀窍-就是圆的。
因此,从圆上的一个点到另一点总是有两种方法,左一种和右一种。如果这些点不在同一直径上,则一种方法会比另一种方法短。
另一个技巧是在360°处进行环绕,因为360°和0°实际上是相同的角度(因为,请参见上文–圆是圆形的)。
一个例子:
5°和355°之间的最小距离:
| 355-5 | = 350
但正确答案是10。
如果将360°添加到5:
| 355-365 | = 10
因此,我的简单想法是检查a,+ 360和-360。因此,任何覆盖都应包括在内。计算出的某些距离甚至可能超过360,但不会受到伤害,因为已搜索了最小值。
#include <algorithm>
#include <iostream>
int get_dist(int a, int b)
{
return std::min({ abs(a - b), abs(a + 360 - b), abs(a - 360 - b) });
}
int find_point(int a)
{
int d11 = get_dist(a, 11);
int d216 = get_dist(a, 216);
return d11 < d216 ? 11 : 216;
}
int main()
{
std::cout << "20 is closest to " << find_point(20) << '\n';
std::cout << "200 is closest to " << find_point(200) << '\n';
std::cout << "350 is closest to " << find_point(350) << '\n';
}
输出:
20 is closest to 11
200 is closest to 216
350 is closest to 11
也许不是最优雅的解决方案,而是一个简单且易于维护的解决方案(忽略代码中的魔术数字)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句