<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN" "dtd/kdex.dtd" [

  <!ENTITY kappname "&rocs;">
  <!ENTITY package "kdeedu">
  <!ENTITY % addindex "IGNORE">
  <!ENTITY % Ukrainian "INCLUDE">
]>
<book lang="&language;">

<bookinfo>
<title
>Підручник з &rocs;</title>
<authorgroup>
<author
><personname
> <firstname
>Tomaz</firstname
> <surname
>Canabrava</surname
> </personname
> <email
>tomaz.canabrava@gmail.com</email
> </author>
<author
><personname
> <firstname
>Andreas</firstname
> <surname
>Cord-Landwehr</surname
> </personname
> <email
>cordlandwehr@googlemail.com</email
> </author>

<othercredit role="translator"
><firstname
>Юрій</firstname
><surname
>Чорноіван</surname
><affiliation
><address
><email
>yurchor@ukr.net</email
></address
></affiliation
><contrib
>Переклад українською</contrib
></othercredit
> 
</authorgroup>

<copyright
><year
>2009</year
><holder
>Tomaz Canabrava</holder
></copyright>
<copyright
><year
>2011</year
><holder
>Andreas Cord-Landwehr</holder
></copyright>

<date
>4 грудня 2011 року</date>
<releaseinfo
>1.1 &kde; 4.8</releaseinfo>

<legalnotice
>&FDLNotice;</legalnotice>

<abstract>
<para
>&rocs; — інструмент побудови та перегляду графів, створений для KDE. </para>
</abstract>

<keywordset>
<keyword
>KDE</keyword>
<keyword
>kdeedu</keyword>
<keyword
>математика</keyword>
<keyword
>математика</keyword>
<keyword
>графи</keyword>
<keyword
>вузол</keyword>
<keyword
>ребро</keyword>
</keywordset>

</bookinfo>

<chapter id="introduction">
<title
>Вступ</title>
<para
>&rocs; — комплексне середовище розробки для теорії графів, призначене для всіх, хто цікавиться розробкою та аналізом алгоритмів, пов’язаних з графами. Це зокрема</para>
<itemizedlist>
	<listitem
><para
>викладачі, які хочуть продемонструвати роботу алгоритмів, пов’язаних з графами, студентам,</para
></listitem>
	<listitem
><para
>студенти, які бажають краще зрозуміти теорію і розібратися у роботі алгоритмів,</para
></listitem>
	<listitem
><para
>всі, чия робота пов’язана з розробкою алгоритмів теорії графів, та всі, кому потрібен інструмент для тестування прототипів.</para
></listitem>
</itemizedlist>
<para
>Для всіх цих користувачів у &rocs; передбачено простий у користуванні редактор графів для створення і внесення змін до графів, потужний рушій обробки скриптів Qt Script для виконання алгоритмів та декілька допоміжних інструментів для налаштування ваших графів та структур даних для експериментів. Отже звичайна процедура роботи з програмою передбачає написання алгоритму, створення графу та перегляд у режимі реального часу обробки алгоритмом графу.</para>

<screenshot>
<screeninfo
>Знімок вікна &rocs;.</screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="rocs-screenshot.png" format="PNG"/>
</imageobject>
<textobject>
<phrase
>Знімок вікна &rocs;.</phrase>
</textobject>
</mediaobject>
</screenshot>
</chapter>

<chapter id="user-interface">
<title
>Інтерфейс користувача &rocs;</title>

<sect1 id="user-interface-all">
<title
>Загальні елементи інтерфейсу користувача</title>
<para
>Інтефейс користувача програми поділено на декілька логічних частин, як це показано на наведеному нижче знімку. </para>
<screenshot>
	<screeninfo
>Елементи графічного інтерфейсу &rocs;.</screeninfo>
	<mediaobject>
	<imageobject>
	<imagedata fileref="rocs-interfaces.png" format="PNG"/>
	</imageobject>
	<textobject>
	<phrase
>Елементи графічного інтерфейсу &rocs;.</phrase>
	</textobject>
	</mediaobject>
</screenshot>
<variablelist>
<varlistentry>
	<term
>Панель візуального редактора графів</term>
	<listitem
><para
>щоб мати змогу малювати або вносити зміни до графів на панелі візуального редактора графів, вам слід спочатку вибрати інструмент на цій панелі.</para
></listitem>
</varlistentry>
<varlistentry>
	<term
>Візуальний редактор графів</term>
	<listitem
><para
>Це ділянка вікна програми, у якій ви можете малювати ваші графи. Клацання правою кнопкою миші на панелі малювання, частинах графу або позначених елементах графу відкриє контекстне меню, вміст якого залежатиме від об’єкта.</para
></listitem>
</varlistentry>
<varlistentry>
	<term
>Властивості графу</term>
	<listitem
><para
>Тут ви побачите повний список всіх графів на панелі візуального редактора графів. Тут ви можете вносити зміни, наприклад, до назви графу, видимих властивостей, зокрема назв вузлів або значень у вузлах, визначати типові кольори для елементів графу.</para
></listitem>
</varlistentry>
<varlistentry>
	<term
>Редактор скриптів</term>
	<listitem
><para
>У полі цього текстового редактора ви можете створювати скрипти алгоритмів мовою Qt Script (у нашому випадку це просто діалект JavaScript). Ви можете працювати одночасно над декількома алгоритмами: для цього достатньо відкрити або створити декілька вкладок скриптів за допомогою головного меню програми. Якщо зміни, внесені на якійсь із вкладок це не збережено, програма показуватиме невеличкий символ диска на заголовку цієї вкладки.</para
></listitem>
</varlistentry>
<varlistentry>
	<term
>Панель діагностичних повідомлень та виведення даних</term>
	<listitem
><para
>До цього поля програма виводитиме діагностичні повідомлення або дані, виведені скриптом, залежно від вибору параметра виведення даних. Якщо під час виконання скрипту станеться помилка, програма негайно перемкнеться у режим діагностичних повідомлень. Крім того, серед діагностичних повідомлень будуть і всі повідомлення, виведені скриптом під час виконання.</para
></listitem>
</varlistentry>
<varlistentry>
	<term
>Виконання скриптів</term>
	<listitem
><para
>За допомогою цього меню можна керувати виконанням алгоритмів. Ви можете виконати скрипт, створений у редакторів скриптів, для графу, відкритого на панелі візуального редактора графів, натисканням кнопки <guiicon
>Пуск</guiicon
>. Якщо виконання скрипту ще не завершено, його можна зупинити натисканням кнопки <guiicon
>Стоп</guiicon
>.</para
></listitem>
</varlistentry>
</variablelist>
</sect1>

<sect1 id="user-interface-toolbars">
<title
>Панелі інструментів</title>
<para
>На панелі візуального редактора графів передбачено декілька можливих панелей інструментів, за допомогою яких ви зможете отримувати доступ до можливостей програми у одне клацання кнопкою миші. За типових налаштувань буде показано такі панелі інструментів:</para>
<itemizedlist>
	<listitem
><para
>Головна панель інструментів</para
></listitem>
	<listitem
><para
>Панель інструментів вирівнювання</para
></listitem>
</itemizedlist>

<sect2 id="user-interface-toolbars-main">
<title
>Головна панель інструментів</title>
<para
>На <emphasis
>головній панелі інструментів</emphasis
> буде показано вказані нижче кнопки дій. Натискання кнопки дії, означатиме, що вказівник миші виконуватиме відповідну дію на панелі візуального редактора графів:</para>
<itemizedlist>
<listitem
><para
><guilabel
>Пересунути</guilabel
>: щоб позначити елементи, натисніть ліву кнопку миші на порожньому місці на графі, утримуйте кнопку натисненою і рухом вказівника миші створіть прямокутник, у якому міститимуться всі вузли і/або ребра. Якщо треба позначити окремий елемент, просто клацніть лівою кнопкою миші на цьому елементі. Якщо ви наведете вказівник миші на позначений елемент або набір елементів, натиснете і утримуватимете натисненою ліву кнопку миші, а потім почнете рухати вказівник, разом з ним почнуть рухатися позначені елементи. Пересунути позначені елементи можна також за допомогою клавіш зі стрілочками.</para
></listitem>
<listitem
><para
><guilabel
>Додати вузол</guilabel
>: клацніть у довільній точці панелі візуального редактора, щоб створити новий вузол, який належатиме поточному позначеному графу.</para
></listitem>
<listitem
><para
><guilabel
>Додати ребро</guilabel
>: наведіть вказівник миші на позицію першого вузла, натисніть і утримуйте натисненою ліву кнопку миші, перетягніть вказівник до позиції другого вузла, до якого має прямувати ребро. Виконати цю дію можна буде, лише якщо у поточному графі можливе додавання такого ребра (наприклад, у незорієнтованому графі не можна додавати декілька ребер між двома вузлами).</para
></listitem>
<listitem
><para
><guilabel
>Вилучити</guilabel
>: клацніть на елементі графу, щоб його вилучити. Якщо ви вилучите вузол, всі ребра, які з ним з’єднано, також буде вилучено.</para
></listitem>
<listitem
><para
><guilabel
>Масштаб</guilabel
>: наведіть вказівник на панель візуального редактора, натисніть і утримуйте натисненою ліву кнопку миші, перетягніть вказівник так, щоб у отриманому прямокутнику містилися всі потрібні вам елементи, відпустіть кнопку миші. Панель візуального редактора буде масштабовано відповідно до вказаного вами прямокутника. Збільшити або зменшити масштаб можна за допомогою прокручування коліщатка миші. Подвійне клацання лівою кнопкою миші відновлює початковий масштаб.</para
></listitem>
</itemizedlist>
<screenshot>
<screeninfo
>Головна панель інструментів.</screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="rocs-toolbar-main.png" format="PNG"/>
</imageobject>
<textobject>
<phrase
>Головна панель інструментів.</phrase>
</textobject>
</mediaobject>
</screenshot>
</sect2>

<sect2 id="user-interface-toolbars-alignment">
<title
>Панель інструментів вирівнювання</title>
<para
>Крім того, ви можете додати відкрити додаткову <emphasis
>панель вирівнювання</emphasis
>. Натискання кнопки дії на цій панелі призведе до негайного виконання дії над поточними позначеними вузлами.</para>
<itemizedlist>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsaligntop.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Вгору</guilabel
>: вирівняти вузли за вертикальною позицією найвищого з них. Змінено буде лише вертикальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignvmiddle.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Центр</guilabel
>: вирівняти вузли на вертикальною позицією середнього значення вертикальних координат всіх позначених вузлів. Змінено буде лише вертикальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignbottom.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Основа</guilabel
>: вирівняти вузли за вертикальною позицією найнижчого з них. Змінено буде лише вертикальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignleft.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Ліворуч</guilabel
>: вирівняти вузли на горизонтальною позицією найлівішого вузла. Змінено буде лише горизонтальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignhmiddle.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Центр</guilabel
>: вирівняти вузли на горизонтальною позицією найвищого вузла. Змінено буде лише горизонтальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsalignright.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Праворуч</guilabel
>: вирівняти вузли на горизонтальною позицією найправішого вузла. Змінено буде лише горизонтальні координати.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsaligncircle.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Коло</guilabel
>: розташувати вузли на колі з діаметром, рівним максимальній відстані між вузлами. Вузли на колі буде розташовано у такому самому порядку, у якому їх видно з центра мас вузлів.</para
></listitem>
<listitem
><para>
<inlinemediaobject
><imageobject>
<imagedata fileref="hi22-action-rocsaligntree.png" format="PNG"/></imageobject>
</inlinemediaobject
> <guilabel
>Мінімізувати кількість перетинів ребер</guilabel
>: застосувати алгоритм Фругтермана-Рейнґольда для мінімізації (наближено) кількості ребер, що перетинаються.</para
></listitem>
</itemizedlist>
<screenshot>
<screeninfo
>Панель інструментів вирівнювання.</screeninfo>
<mediaobject>
<imageobject>
<imagedata fileref="rocs-toolbar-alignment.png" format="PNG"/>
</imageobject>
<textobject>
<phrase
>Панель інструментів вирівнювання.</phrase>
</textobject>
</mediaobject>
</screenshot>
</sect2>
</sect1>

<sect1 id="user-interface-graph-properties">
	<title
>Властивості графу</title>
	<para
>На лівій бічній панелі буде наведено параметри кожного з відкритих графів. Всі ці параметри є загальними для окремого графу, їх можна змінити для окремих вузлів та ребер за допомогою діалогових вікон «Властивості вузла» та «Властивості ребра».</para>

	<itemizedlist>
	<listitem
><para
><guilabel
>Назва</guilabel
>: назва, яку має використовувати ваш алгоритм для доступу до графу. </para
></listitem>
	<listitem
><para
><guilabel
>Колір даних</guilabel
> для нових вузлів. Змінити колір вузлів для всіх поточних вузлів можна натисканням кнопки <guilabel
>Всі</guilabel
>. </para
></listitem>
	<listitem
><para>
	  <guilabel
>Колір вказівника</guilabel
> <!--FIXME color of edges?-->
	</para
></listitem>
	</itemizedlist>
	<para
>У останньому рядку параметрів буде наведено кнопки перемикання:</para>
	<itemizedlist>
	<listitem
><para
><guilabel
>Показувати назви у:</guilabel
> <guilabel
>Даних</guilabel
> або <guilabel
>Вказівниках</guilabel
>. </para
></listitem>
	<listitem
><para
><guilabel
>Показувати значення у:</guilabel
> <guilabel
>Вузлах</guilabel
> або <guilabel
>Ребрах</guilabel
>. </para
></listitem>
	<!-- FIXME missing Graph Type Undirected Graph, Directed Graph, Multigraph -->
	</itemizedlist>
</sect1>
</chapter>

<chapter id="using-rocs">
<title
>Користування &rocs;</title>
<para
>Зазвичай, спочатку слід створити граф у візуальному редакторі графів. Ви можете зробити це або вручну, тобто додаванням вузлів та з’єднуванням цих вузлів, або за допомогою одного з допоміжних алгоритмів, пункти яких можна знайти у меню <guimenu
>Інструменти</guimenu
> <guimenuitem
>Створити граф</guimenuitem
>. Нарешті, ви також можете скористатися допоміжними інструментами меню <guimenu
>Інструменти</guimenu
> <guimenuitem
>Додавання значень</guimenuitem
> для того, щоб пов’язати певні початкові значення з вузлами та ребрами графу. Вам також слід надати графові назву. Цю назву буде використано як ідентифікатор, — ви повинні користуватися саме нею під час написання скриптів.</para>

<sect1 id="using-rocs-scripting">
<title
>Написання скриптів</title>
<para
>У &rocs; для скриптів використано мову програмування JavaScript. Це означає, що визначення змінних та функцій, а також їхнє використання виконується точно так само, як у JavaScript. Крім того, у &rocs; передбачено набір функцій, за допомогою яких ви зможете отримувати доступ до графів та їхніх частин на панелі візуального редактора графів. </para>

<sect2
><title
>Доступ до графу</title>
<para
>У інтерфейсі написання скриптів ви можете отримати доступ до графу простим введенням його назви або використанням цієї назви як об’єкта у одній з вказаних нижче функцій. Щоб отримати доступ до вузла або ребра вам слід отримати ідентифікатор від об’єкта графу.</para>
<variablelist>
<varlistentry>
<term
>Об’єкти графу</term>
<listitem>
<programlisting
>// функції
     array list_nodes();
     array list_edges();
     node add_node(name);
     edge add_edge(from, to);
     node node_byname(QString&amp; name);
     node begin_node();
     array end_nodes();

// змінні
     bool directed
     bool automate
     string name
     string nodeDefaultColor // у HEXA
     string edgeDefaultColor  // у HEXA
</programlisting>
</listitem>
</varlistentry>

<varlistentry>
<term
>Об’єкти вузлів</term>
<listitem>
<programlisting
>// функції
     array adj_nodes();
     array adj_edges();
     array input_edges();
     array output_edges();
     array loop_edges();
     array connected_edges(Node *n);
     void self_remove();

// змінні
    double x
    double y
    double width
    string value
    string name
    string color  // у HEXA
    bool begin
    bool end
</programlisting>
</listitem>
</varlistentry>

<varlistentry>
<term
>Об’єкти ребер</term>
<listitem>
<programlisting
>string color ( em hexa )
    string value
    string name
    double width
    string style ( dot, dash, dash dot, solid )

    node start();
    node  end();

    void self_remove();
</programlisting>
</listitem>
</varlistentry>
</variablelist>
</sect2>

<sect2 id="script-graph-algorithms">
<title
>Алгоритми графів</title>
<para
>Іноді для виконання типових завдань, наприклад обчислення найкоротшого маршруту між двома вузлами, варто скористатися функцією. У поточній версії програми передбачено можливість виклику з рушія обробки скриптів вказаних нижче алгоритмів для вузлів одного графу.</para>
<variablelist>
<varlistentry>
<term
>Обчислення найкоротшого маршруту</term>
<listitem>
	<para
>Обчислює найкоротший шлях між вузлами <emphasis
>початок</emphasis
> і <emphasis
>кінець</emphasis
>. Обидва вузли мають належати одному графу. Під час обчислення враховується те, чи є граф зорієнтованим.</para>
	<funcsynopsis>
	<funcprototype
><funcdef
>array <function
>dijkstra_shortest_path</function
></funcdef
> <paramdef
>Node* <parameter
><replaceable
>початок</replaceable
></parameter
></paramdef
> <paramdef
>Node* <parameter
><replaceable
>кінець</replaceable
></parameter
></paramdef
> </funcprototype>
	</funcsynopsis>
</listitem>
</varlistentry>
</variablelist>
</sect2>
</sect1>

<sect1 id="script-example">
<title
>Приклад</title>
<para
>Ось простий приклад скрипту, який встановлює кольори перших чотирьох вузлів на першому графі.</para>
<programlisting
>/* Простий приклад, який встановлює кольори перших чотирьох вузлів першого 
графу: */

var colors = new Array("red", "green", "blue", "yellow");

/* graphs — це масив графів, доступ до окремого графу можна отримувати за його індексом
у масиві або за його назвою, отже, якщо назвою першого графу є Untitled0, можна скористатися 
такими командами  */
var list1= graphs[0].list_nodes(); //  перша форма.
var list2=Untitled0.list_nodes();              // друга форма
 
 for ( var i = 0; i &lt; colors.length; i++){
        if (i 
> list2.length) break;
        list2[i].color = colors[i]
 }
</programlisting>
</sect1>
<sect1>
	<title
>Імпортування та експортування</title>
	<para
>У поточній версії &rocs; передбачено підтримку імпортування та експортування даних файлів у таких форматах:</para>
	<itemizedlist>
		<listitem
><para
>файли DOT, також відомі як файли Graphviz;</para
></listitem>
		<listitem
><para
>файли GML;</para
></listitem>
		<listitem
><para
>звичайні текстові файли.</para
></listitem>
	</itemizedlist>
	<para
>У поточній версії з більшості цих файлів імпортується лише декілька значень. Серед імпортованих значень дані вузлів та відповідних з’єднань, назви всіх елементів, значення та, якщо їх вказано, координати.</para>
</sect1>
</chapter>

<chapter id="credits">
<title
>Подяки і ліцензія</title>

<para
>&rocs; </para>
<para
>Авторські права на програму:</para>
<itemizedlist>
	<listitem
><para
>Авторські права на програму належать Ugo Sangiori (ugorox AT gmail.com), 2008</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Tomaz Canabrava (tcanabrava AT kde.org), 2008–2011</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Wagner Reck (wagner.reck AT gmail.com), 2008–2011</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Andreas Cord-Landwehr (cordlandwehr AT googlemail.com), 2011</para
></listitem>
</itemizedlist>

<para
>Авторські права на документацію:</para>
<itemizedlist>
	<listitem
><para
>Авторські права на документацію належать &Anne-Marie.Mahfouf; &Anne-Marie.Mahfouf.mail;, 2009</para
></listitem>
	<listitem
><para
>Авторські права на документацію належать Tomaz Canabrava tcanabrava at kde dot org, 2009</para
></listitem>
	<listitem
><para
>Авторські права на документацію належать Andreas Cord-Landwehr (cordlandwehr AT googlemail.com), 2011</para
></listitem>
</itemizedlist>

<para
>Переклад українською: Юрій Чорноіван <email
>yurchor@ukr.net</email
></para
> 
&underFDL; &underGPL; </chapter>

<appendix id="installation">
<title
>Встановлення</title>

<sect1 id="getting-rocs">
<title
>Як отримати &rocs;</title>
&install.intro.documentation; </sect1>

<sect1 id="compilation">
<title
>Збирання і встановлення</title>
&install.compile.documentation; </sect1>
</appendix>

&documentation.index;
</book>
<!--
Local Variables:
mode: sgml
sgml-minimize-attributes: nil
sgml-general-insert-case: lower
sgml-indent-step:0
sgml-indent-data:nil
End:
-->
