刚才有人告诉我,解决办法产生了0,1,2,3类错误结果,是正确的:
#define LONG_LONG_SIGN (sizeof(long long) * 8 - 1)
double dx = point.x - center.x;
double dy = point.y - center.y;
long long *pdx = (void *)&dx;
long long *pdy = (void *)&dy;
int quadrant = ((*pdy >> LONG_LONG_SIGN) & 3) ^ ((*pdx >> LONG_LONG_SIGN) & 1);
这一解决办法是Xy坐标。
我先对这种方法和按原始问题划分的方法进行了一些业绩测试:我的结果是,分管方法总是比较快(目前我有稳定的160/180关系),因此,我倾向于采用分机操作方法。
<>>>>>
如果有人有兴趣,所有三个算法均并入https://github.com/Evgeny Karkan/EKAlgorithms” rel=“nofollow”>。 EKAlgorithms C/Objective-C Deposit,作为“便利选择”算法:
- Original branching algorithm
- Bitwise algorithm by @ruslik from the accepted answer.
- Alternative bitwise promoted by one of my colleagues which is a bit slower than second algorithm but returns quadrants in correct order.
所有的算法都得到了优化,以便采用双重计算点。
业绩测试向我们显示,一般而言,第一种分支算法是MacOS的获奖者。 X,虽然在六氯环己烷机器上,我们确实看到第二算法比分管更快。
www.un.org/Depts/DGACM/index_spanish.htm 因此,一般结论是坚持分行算法,因为双向版本没有带来任何业绩收益。