4. Описание окружения робота
Автор
Общие функции
In [ ]:
using Images
In [ ]:
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
Out[0]:
In [ ]:
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
Out[0]:
Пустая прямоугольная комната
In [ ]:
function gen_square(x,y)
# Пустое поле
room = zeros(x,y);
# Основные стены
room[[1,x],:] .= 1;
room[:,[1,y]] .= 1;
return room
end
Out[0]:
In [ ]:
x = 20; y = 20;
room = gen_square(x,y)
s_x, s_y = gen_start_point(room)
robot, z = init(x,y,s_x,s_y)
heatmap(RGB.(robot, z, z) + RGB.(z, room, z), cbar=:none, c = :blues)
heatmap!(title = "Start point: " * "(" * string(s_x) * "," * string(s_y) * ")")
Out[0]:
Случайная комната с мусором
In [ ]:
# Проверка пустот и условия того, что к ним всегда был проход.
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
Out[0]:
In [ ]:
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
Out[0]:
In [ ]:
x = 30; y = 40;
room, s_x, s_y = gen_room_rend(x,y);
robot, z = init(x,y,s_x,s_y)
heatmap(RGB.(robot, z, z) + RGB.(z, room, z), cbar=:none, c = :blues)
heatmap!(title = "Start point: " * "(" * string(s_x) * "," * string(s_y) * ")")
Out[0]:
Комната из прямоугольников
In [ ]:
function gen_square(x,y)
# Пустое поле
room = zeros(x,y);
# Основные стены
room[[1,x],:] .= 1;
room[:,[1,y]] .= 1;
return room
end
Out[0]:
In [ ]:
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
Out[0]:
In [ ]:
room, s_x, s_y = gen_room_square(x,y, 5, [13,11,20,9,6], [25,29,12,27,10])
robot, z = init(x,y,s_x,s_y)
heatmap(RGB.(robot, z, z) + RGB.(z, room, z), cbar=:none, c = :blues)
heatmap!(title = "Start point: " * "(" * string(s_x) * "," * string(s_y) * ")")
Out[0]:
Объединение двух предыдущих алгоритмов
In [ ]:
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
Out[0]:
In [ ]:
room, s_x, s_y = gen_room_square_rend(x,y, 5, [13,11,20,9,6], [25,29,12,27,10])
robot, z = init(x,y,s_x,s_y)
heatmap(RGB.(robot, z, z) + RGB.(z, room, z), cbar=:none, c = :blues)
heatmap!(title = "Start point: " * "(" * string(s_x) * "," * string(s_y) * ")")
Out[0]:
Комната по картинке из Paint
In [ ]:
img = channelview(load( "$(@__DIR__)/resources/Без имени.png" ))
room = img[1,:,:]
x = size(room,1)
y = size(room,2)
s_x, s_y = gen_start_point(room)
robot, z = init(x,y,s_x,s_y)
heatmap(RGB.(robot, z, z) + RGB.(z, room, z), cbar=:none, c = :blues)
heatmap!(title = "Start point: " * "(" * string(s_x) * "," * string(s_y) * ")")
Out[0]: