5. Алгоритм навигации робота
Author
function gen_room(x, y, s_x, s_y)
room = trues(x,y);
room[2:end-1,2:end-1] .= false;
start_coordinates = [s_x,s_y]
return room, start_coordinates
end
function gen_start_point(room)
x = size(room,1)
y = size(room,2)
gen_start_point = true
while gen_start_point
global start_x,start_y
start_x = rand(1:x);
start_y = rand(1:y);
if room[start_x, start_y] == 0
gen_start_point = false
end
end
return start_x, start_y
end
function init(x,y,s_x,s_y)
z = zeros(x,y)
robot = zeros(x,y);
robot[s_x,s_y] = 1
return robot, z
end
function gen_square(x,y)
# Пустое поле
room = zeros(x,y);
# Основные стены
room[[1,x],:] .= 1;
room[:,[1,y]] .= 1;
return room
end
# Проверка пустот и условия того, что к ним всегда был проход.
function checking_voids(x,y,room, min_point)
for i in 2:x-1
for j in 2:y-1
p = room[i, j]
if p == 0
Near = room[(i-1):(i+1), (j-1):(j+1)] # Выделение окружения клетки.
run = true
while run
NearSum = sum(Near) # Расчёт кол-ва клеток в окружении.
if NearSum > min_point
Near[rand(1:3),rand(1:3)] = 0;
else
run = false
end
end
room[(i-1):(i+1), (j-1):(j+1)] .= Near;
end
end
end
return room
end
function gen_room_rend(x,y)
# Случайные стены
room = rand([1,0],x,y);
# Проверка пустот и условия того, что к ним всегда был проход.
room = checking_voids(x,y,room, 3);
# Основные стены
room[[1,x],:] .= 1;
room[:,[1,y]] .= 1;
start_x, start_y = gen_start_point(room)
return room, start_x, start_y
end
function gen_square(x,y)
# Пустое поле
room = zeros(x,y);
# Основные стены
room[[1,x],:] .= 1;
room[:,[1,y]] .= 1;
return room
end
function gen_room_square(x,y, num, size_x, size_y)
room = gen_square(x,y)
# Генерация прямоугольников
for i in 1:num
room_mini = gen_square(size_x[i],size_y[i])
r_x = rand(1:(x-size_x[i]-1))
r_y = rand(1:(y-size_y[i]-1))
room[(1:size_x[i]).+r_x,(1:size_y[i]).+r_y] .= room_mini
end
# Проверка пустот и условия того, что к ним всегда был проход.
room = checking_voids(x,y,room, 4);
# Основные стены
room[[1,x],:] .= 1;
room[:,[1,y]] .= 1;
start_x, start_y = gen_start_point(room)
return room, start_x, start_y
end
function gen_room_square_rend(x,y, num, size_x, size_y)
room = gen_square(x,y)
# Генерация прямоугольников
for i in 1:num
# room_mini = gen_square(size_x[i],size_y[i])
room_mini, s_x, s_y = gen_room_rend(size_x[i],size_y[i]);
r_x = rand(1:(x-size_x[i]-1))
r_y = rand(1:(y-size_y[i]-1))
room[(1:size_x[i]).+r_x,(1:size_y[i]).+r_y] .= room_mini
end
# Проверка пустот и условия того, что к ним всегда был проход.
room = checking_voids(x,y,room, 4);
# Основные стены
room[[1,x],:] .= 1;
room[:,[1,y]] .= 1;
start_x, start_y = gen_start_point(room)
return room, start_x, start_y
end