话虽如此,您的一般想法是正确的。问题是现在可以以某种方式对其进行优化吗?
我们可以在这里使用许多方法。诀窍在于您安排数据的方式。在您当前的情况下,您正在做一个中心点,您的灵敏度变量是您的跨度。可以想象第一个优化不是使用从中心点左右上下移动的灵敏度,而是可以实现一个左上点,其跨度只从左上点向右和向下移动。您的 if 语句将变为:
if(x > cxy[z][0] && x < (cxy[z][0]+sensivity) && y > cxy[z][1] && y < (cxy[z][1]+sensivity))
那么这对您有什么作用:上述优化允许您保存相同的总数据量,但每次检查无需进行 2 次数学运算。考虑到您的输入参数都是浮点数,这可以节省相当多的时间。
如果您正在执行所有基于像素的操作,那么这将带我进行下一个优化。使用整数而不是浮点数进行所有计算,这也将大大加快您的整体算法时间。
现在可以进行进一步的优化,如果您愿意花费更多 RAM 以获得更好的性能,您可以代替每个区域 1 个点,而是可以为每个区域设置一个左上角和一个右下角。这将使您的 if 语句如下所示:
if(x > tlxy[z][0] && x < brxy[z][0] && y > tlxy[z][1] && y < brxy[z][1])
where tlxy is the array of top-left points, brxy is the array of bottom-right points
and z is still the "region" you are checking against
这有什么帮助:正如您在上面的 if 语句中看到的,这现在绝对没有明确的数学运算。为了支持这个算法,你需要愿意花费 2 倍于数组 cxy 的内存。
现在在您的循环中,您将通过所有 24 个区域点。如果您确定您的区域没有重叠,那么一个点一次只能落在一个区域中。您可以通过在您还增加点的点处跳出 for 循环来节省大多数 xy 输入点的时间。如下所示:
public void checkCoordinate(float x, float y){
for(int z = 0; z < 24; z++){
if(x > tlxy[z][0] && x < brxy[z][0] && y > tlxy[z][1] && y < brxy[z][1]){
points += 1;
break;
}
}
}
只有在您确定没有重叠区域(甚至没有边缘)的情况下,上述内容才有效。
在最终优化中,我可以看到可能有潜力。根据您所在区域的外观,您可以将所有区域预先分成象限。这样,您可以测试 x 点位于屏幕的左侧或右侧,然后测试 y 点位于顶部或底部。如果您的区域分布相当均匀,这可能会将您的测试时间缩短 4 倍,因为您不仅需要测试象限内的区域(如果给定的统计分布是我所说的)。在最坏的情况下,所有区域都位于一个象限中,并且您测试的所有点都在该象限中,在这种情况下,从复杂性的角度来看,问题并不比以前更糟。它只是在您的输入 x 和 y 上添加设置测试。
我希望这能给你足够的信息,至少让你开始上路!!!