NotesWhat is notes.io?

Notes brand slogan

Notes - notes.io

%Класс Rob_rot, каждый объект этого класса является
%ссылкой ( handle ) на объект, представляющий
% ИСПОЛНИТЕЛЯ "ориентированнный робот на клетчатом поле"
%
%Командный интерфейс ( методы класса ):
% forward, rot, is_bord, mark, is_mark, get_side, get_tmpr
%
%Направление перемещения, поворотов и проверки наличия препятствия задаются
%ОТНОСИТЕЛЬНО:
% шаг вперед; повернуть налево; повернуть направо;
% проверить, есть ли препятствие прямо по курсу, слева, справа
%
%************************************************************************
%ОТЛИЧАЕТСЯ от класса Rob_rel тем, что вместо двух методов Rob_relLeft и
%Rob_relRight в классе Rob_rot имеется лишь один метод rot, но с параметром,
%который может принимать 3 значения: 'left', 'right', 'back' (или 'l',
%'r','b')
%а также тем, что метод Rob_rotis_bord имеет параметр, который может
%принимать также 3 значения: 'forward', 'left', 'right'
%
%-------------------------------------------------------------------------
%Версия: 1.0*
%Дата: 13.03.2013
%-----------------------------------------------------------------------



classdef Rob_rot < handle
% Rob_rot - класс-оболочка класса Robot.Robot( )

properties( Access = private )
hField % ссылка на объект класса Robot.Robot (робот на клетчатом поле)
end


methods( Access = public )

function obj = Rob_rot( mapfile )
%Rob_rot - конструктор класса
%
%СИНТАКСИС:
% r = Rob_rot()
% r = Rob_rot( mapfile )
%
%В 1-ом случае открвается стандартное диалоговое окно для
%выбора файла, в случае отказа, открывается диалог для
%определения параметров поля
%
%Во 2-м случае:
% - mapfile - имя файла, в котором сохранена обстановка на поле
%
%РЕЗУЛЬТАТ:
% - r = ссылка ( handle ) на созданный объект класса Rob_rot
%
%-------------------------------------------------------------
% Командный интерфейс робота ( методы класса ):
% forward, rot, is_bord, mark, is_mark, get_side, get_tmpr
%
%-------------------------------------------------------------
%Изменить ( установить или отредактировать ) начальную обстановку
%на поле можно с помощью мыши:
% -клик по клетке устанавливает маркер
% -клик по маркеру удаляет маркер
% -клик по пунктирной линии сетки клетчатого поля устанавливает
% перегородку
% -клик по перегородке удаляет перегородку
% -клик по роботу и перемещение мыши при неотпущенной клавише
% перемещает робота вслед за курсором в нужную клетку
% ( "неисправного" робота также можно "починить" таким способом )
%После любого числа таких действий робот сразу готов к командному
%управлению
%
%-------------------------------------------------------------
%Если r.outside = 'none', то считается, что поле ограничено рамкой
% r.outside = 'ismark', то считается, что за пределами рамки сплошь установлены маркеры
% r.outside = 'nomark', то считается, что за пределами рамки исходно маркеров нет
%
%При r.outside не равном 'none' считается, что все перегородки, вплотную примыкающие к рамке поля
%( которая в данном случае не рассматривается как ограждение ),
%мыслятся продолженными до бесконечности в невидимую часть поля в соответствующих направлениях
%( невидимая часть поля всегда остается невидимой )
%
%-------------------------------------------------------------
%Сохранить результат РУЧНОГО редактирования обстановки на поле
%можно с помощью комбинации клавиш CTRL+S
%( при этом окно с роботом должно быть текущим! )
%
%Восстановить последнюю сохраненную обстановку на поле можно с помощью
%комбинации клавиш CTRL+R ( при этом окно с роботом должно быть текущим! )
%
%Просмотреть значения температур клеток можно с помощью коьбинации клавиш
%CRTL+T ( при этом окно с роботом должно быть текущим! )
%Повторное нажатие этой комбинации клавиш убирает значения температур из
%клеток
%Визуализированные значения температур можно редактировать ( результаты редактирования
%сохраняются только в опреративной памяти, для сохранения на диске
%требуется CTRL+S )
%
%Динамически менять время задержки выполнения команд робота мможно с помощью
%комбинации клавиш CTRL+"плюс" или CTRL+"минус", соответственно
%( при этом окно с роботом должно быть текущим! )

if nargin == 0
mapfile = [];
end

obj.hField = Robot.Robot( @Robot.Body1, mapfile );

if ~isvalid( obj.hField )
% поле не создано
delete( obj )
else
set( obj.hField.hFig, 'userdata', obj ) %чтобы можно было удалять объект при закрытии окна ( см. Robot.Robot.RobObjctDelete )
end

end % function obj = Rob_rot




function forward( obj )
%forward - команда переместить робота вперед в соседнюю клетку
%
%СИНТАКСИС:
% r.forward( )
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля, прямо по курсу робота
% перегородки нет
%
%РЕЗУЛЬТАТ:
% - Робот в соседней по направлению side клетке ( если
% только на пути робота нет перегородки, в противном случае
% происходит "поломка" робота )


if ~isvalid( obj )
% Это возможно, в случае отказа пользователя создать поле в соответствующем диалоге
error 'Поле с роботом отсутствует'
end

if numel( obj ) ~= 1
error 'Команда step применима только к одному отдельному роботу ( к объекту класса Rob_rot из 1-го элемента )'
end

if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end

side = obj.hField.get_side_();

coderror = obj.hField.step( side );

switch coderror
case 3
error 'Робот выведен из стоя'
case 4
error 'Значение параметра должно быть ''n'' | ''s'' | ''o'' | ''w'''
case 5
error 'Фатальная ошибка: робот наехал на загородку'
end

end % function forward



function rot( obj, side )
%rot - команда развернуть робота налево, направо или назад
%
%СИНТАКСИС:
% r.rot( side )
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля
% - side = 'l' ('left') | 'r' ('right') | 'b' ('back')
%РЕЗУЛЬТАТ:
% - Робот развёрнут влево на 90 градусов

if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end

coderror = obj.hField.rot( side );

switch coderror
case 3
error 'Робот выведен из стоя'
case 4
error 'Не предусмотренное значение параметра'
end

end




function ansv = is_bord( obj, side )
%is_bord - команда проверить наличие перегородки в заданном направлении
%
%СИНТАКСИС:
% ansv = r.is_bord( side )
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля
% - side = 'forward' ('f') | 'left' ('l') | 'right' ('r')
%
%РЕЗУЛЬТАТ:
% - ansv = 1 ( true ), eсли в направлении side есть перегородка
% = 0 ( false ) - в противном случае

if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end

if numel( obj ) ~= 1
error 'Команда is_bord применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end

if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end

absSide = obj.hField.get_side_();

absSide = Robot.cod_side( absSide );
switch upper( side )
case {'LEFT', 'L'}
absSide = mod( absSide - 1, 4);
case {'RIGHT','R'}
absSide = mod( absSide + 1, 4);
case {'FORWARD', 'F'}
%направление остается прежним
otherwise
error 'Входной параметр должен иметь значение ''forward'' (''f'') |''left'' (''l'') | ''right'' (''r'')'
end
absSide = Robot.decod_side( absSide );

[ansv, coderror] = obj.hField.is_bord( absSide );

switch coderror
case 3
error 'Робот выведен из стоя'
case 4
error 'Значение параметра должно быть ''n'' | ''s'' | ''o'' | ''w'''
end

end % function ansv = is_bord




function mark( obj )
%mark - команда поставить маркер в клетку с роботом
%
%СИНТАКСИС:
% r.mark()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке поля
%
%РЕЗУЛЬТАТ:
% - В клетке с роботом стоит маркер
%( повторная марировка ничего не изменяет, снять уже поставленный маркер нельзя )

if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end

if numel( obj ) ~= 1
error 'Команда mark применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end

if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end

coderror = obj.hField.mark();

switch coderror
case 3
error 'Робот выведен из стоя'
end
end % function mark



function ansv = is_mark( obj )
%is_mark - команда проверить наличие маркера клетки поля
%
%СИНТАКСИС:
% ansv = r.is_mark()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке
%
%РЕЗУЛЬТАТ:
% - ansv = 1 ( true ), eсли в клетке с роботом стоит маркер
% = 0 ( false ) - в противном случае

if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end

if numel( obj ) ~= 1
error 'Команда is_mark применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end

if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end

[ansv, coderror] = obj.hField.is_mark();
switch coderror
case 3
error 'Робот выведен из стоя'
end

end % function ansv = is_mark



function val = get_tmpr( obj )
%get_tmpr - команда измерить и сообщить "температуру" текущей клетки
%
%СИНТАКСИС:
% val = r.get_tmpr()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке
%
%РЕЗУЛЬТАТ:
% - val = целое число ( double ) = "температура" клетки с роботом
%
% ( при создании нового объекта класса Rob_rot, "температурное"
% поле формируется случайно, но при загрузке ранее созданного
% объекта из файла - оно прежнее )

if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end

if numel( obj ) ~= 1
error 'Команда get_tmpr применима только к одному отдельному роботу ( к объекту класса RobAbs из 1-го элемента )'
end

if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end

[val, coderror] = obj.hField.get_tmpr();

switch coderror
case 3
error 'Робот выведен из стоя'
end

end % function val = get_tmpr


function side = get_side( obj )
%get_side - команда сообщить текущее направление робота
%
%СИНТАКСИС:
% side = r.get_side()
%
%ДАНО:
% - r = ссылка на объект класса Rob_rot:
% робот в некотрой клетке
%
%РЕЗУЛЬТАТ:
% - side = 'n' (Север) | 's' (Юг) | 'o' (Восток) | 'w' (Запад)
% - текущее направление робота
%

if ~isvalid( obj )
% Это возможно, в случае отказа создать поле в соответствующем диалоге
error 'Поле с роботом не создано'
end

if numel( obj ) ~= 1
error 'Команда get_side применима только к одному отдельному роботу ( к объекту класса Rob_rot из 1-го элемента )'
end

if Robot.Control.is_star_to_end( obj.hField.hFig ) == 1
error 'Робот не готов к работе. Требуется сохранить результат РУЧНОГО редактирования обстановки на поле нажатимем комбинации CTRL+S (при активном окне с роботом) или восстановить исходную обстановку нажатием CTRL+R'
end

[side, coderror] = obj.hField.get_side();

switch coderror
case 3
error 'Робот выведен из стоя'
end

end % function side = get_side

end % methods public

end % classdef
     
 
what is notes.io
 

Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...

With notes.io;

  • * You can take a note from anywhere and any device with internet connection.
  • * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
  • * You can quickly share your contents without website, blog and e-mail.
  • * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
  • * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.

Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.

Easy: Notes.io doesn’t require installation. Just write and share note!

Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )

Free: Notes.io works for 12 years and has been free since the day it was started.


You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;


Email: [email protected]

Twitter: http://twitter.com/notesio

Instagram: http://instagram.com/notes.io

Facebook: http://facebook.com/notesio



Regards;
Notes.io Team

     
 
Shortened Note Link
 
 
Looding Image
 
     
 
Long File
 
 

For written notes was greater than 18KB Unable to shorten.

To be smaller than 18KB, please organize your notes, or sign in.