4. Описание окружения робота

Автор
avatar-yurevyurev
Notebook

Общие функции

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]:
init (generic function with 1 method)
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]:
gen_start_point (generic function with 1 method)

Пустая прямоугольная комната

In [ ]:
function gen_square(x,y)
    # Пустое поле
    room = zeros(x,y);
    # Основные стены
    room[[1,x],:] .= 1;
    room[:,[1,y]] .= 1;
   return room
end
Out[0]:
gen_square (generic function with 1 method)
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]:
checking_voids (generic function with 1 method)
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]:
gen_room_rend (generic function with 1 method)
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]:
gen_square (generic function with 1 method)
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]:
gen_room_square (generic function with 1 method)
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]:
gen_room_square_rend (generic function with 1 method)
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]: