5. Алгоритм навигации робота
Author
In [ ]:
cd( @__DIR__ );
include( "room_functions.jl" );
gr();
using Random
Random.seed!(3); # Попробуйте закомментировать
In [ ]:
function поворот( a::CartesianIndex, b::Number )
vecA = [ a[1], a[2] ];
rotM = [ cosd(b) sind(b)
-sind(b) cosd(b) ]
CartesianIndex( (Int.(round.(rotM * vecA )))...)
end;
In [ ]:
стена = true; проезд = false;
не_посещали = 1; посетили = 2;
не_знаю = 1; здесь_стена = 2; можно_ехать = 3;
Получится совсем без коментариев?.. Вроде это нехорошо, но код ведь почти на русском...
In [ ]:
function шагаем( положение, направление, изученная_карта, пройденная_карта, вся_карта )
пройденная_карта[ положение ] = посетили
точка_впереди = положение + направление
изученная_карта[ точка_впереди ] = ( вся_карта[ точка_впереди ] == 1 ? здесь_стена : можно_ехать )
следующая_точка = точка_впереди;
if изученная_карта[ точка_впереди ] == здесь_стена || пройденная_карта[ точка_впереди ] == посетили
направление = поворот( направление, 90 )
else
if вся_карта[ точка_впереди ] == проезд положение = точка_впереди; end;
end
return положение, направление, изученная_карта, пройденная_карта
end;
In [ ]:
направление = CartesianIndex( 1, 0 );
карта, старт_x, старт_y = gen_room_rend( 25, 22 )
положение = CartesianIndex( старт_x, старт_y );
путь = [ Tuple(положение) ];
пройденная_карта = не_посещали .* ones( size(карта)... );
изученная_карта = не_знаю .* ones( size(карта)... );
изученная_карта[ положение ] = можно_ехать;
for i = 1:400
global положение, направление, изученная_карта, пройденная_карта
положение, направление, изученная_карта, пройденная_карта =
шагаем( положение, направление, изученная_карта,
пройденная_карта, карта )
push!(путь, Tuple( положение ))
end
heatmap( карта', c=:grays, aspect_ratio=:equal, leg=:false )
plot!( first.(путь), last.(путь), lw=1 )
spy!( изученная_карта', c=:reds, markersize=3 )
scatter!( [старт_x], [старт_y], shape=:xcross, msw=5 )
scatter!( [положение[1]], [положение[2]], markersize=5 )
Out[0]: