Я видел это сделано с очередью. По сути псевдо-код выглядит примерно так:
points = new list()
queue = new queue()
for x,y in image_coordinates:
if is_cloud(x,y):
point = new point(x=x, y=y, distance=0, cloud_x=x, cloud_y=y)
queue.push(point)
else:
point = new point(x=x, y=y, distance=null, could_x=null, cloud_y=null)
points.push(point)
while(!queue.is_empty()):
point = queue.pop()
for neighbor in point.neighbors():
if angle_is_correct(point.cloud_x, point.cloud_y, neighbor.point.x, neighbor.point.y):
if neighbor.is_direct(): //N,S,E,W
new_distance = point.distance + 1
else: //NE, SE, SW, NW
new_distance = point.distance + SQRT_2
if neighbor.point.distance == null or neighbor.point.distance > new_distance:
neighbor.point.distance = new_distance
neighbor.point.cloud_x = point.cloud_x
neighbor.point.cloud_y = point.cloud_y
queue.push(neighbor.point)
Когда разбег законченные точки будут списком х, у координаты, их расстояние до ближайшего облака, а х, у координаты ближайшего облака (которые вам, вероятно, не нужны). Вы должны использовать функцию angle_is_correct
, чтобы убедиться, что учитываете только облака, которые находятся в правильном направлении. Вы также можете продолжить оптимизацию, чтобы прекратить добавлять точки в очередь, если их расстояние превышает максимальное расстояние.
Я не совсем уверен в алгоритмической сложности, но я подозреваю, что можно было бы разработать доказательство, чтобы показать, что это O (n) или O (log (n)). Все, что я знаю, это то, что он быстро работал для меня, когда мне это нужно.
Что именно вы задаёли? Вы пытаетесь создать теневую маску? Потому что это звучит так, будто вы начинаете с этого. Если нет, то что вы пытаетесь классифицировать? – Pace
Что я пытаюсь сделать, чтобы связать тень с облаком, чтобы уменьшить ошибки в тени – WAF