也许您可以尝试一些可以加快算法速度的方法。
在蛮力算法中你可能会使用方程:
(x-p)^2 + (y-q)^2 < r^2
(p,q) - center of the circle, user position
r - radius (50km)
如果您想找到所有满足上述条件的像素 (x,y) 并检查它们,您的算法将转到 O(n^2)
我不会扫描这个圆圈中的所有像素,而是只检查圆圈边界上的像素。
在这种情况下,您可以使用一些更聪明的方式来定义圆。
x = p+r*cos(a)
y = q*r*sin(a)
a - angle measured in radians [0-2pi]
现在您可以对一些角度进行采样,例如其中的 20 个,迭代并找到半径为 50 公里边界的所有对 (x,y)。现在检查他们是否在雨区并提醒用户。
为了更安全,我建议您使用多个弧度(小于 50 公里),因为您的整个雨云可以在圆圈内,您的应用程序将无法识别他。例如使用 3 个内圆(r = 5km、15km、30km)并做同样的事情。该算法的效率仅取决于角度数和内圆数。
伪代码将是:
checkRainDanger()
p,q <- position
radius[] <- array of radii
for c = 1 to length(radius)
a=0
while(a<2*pi)
x = p + radius[c]*cos(a)
y = q + radius[c]*sin(a)
if rainZone(x,y)
return true
else
a+=pi/10
end_while
end_for
return false //no danger