<?xml version="1.0" ?>
<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.5-Based Variant V1.1//EN" "dtd/kdedbx45.dtd" [
  <!ENTITY % addindex "IGNORE">
  <!ENTITY % Ukrainian "INCLUDE">

]>
<book id="rocs" 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@kde.org</email
> </author>

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

<date
>23 жовтня 2021 року</date>
<releaseinfo
>KDE Gear 21.08</releaseinfo>

<legalnotice
>&FDLNotice;</legalnotice>

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

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

</bookinfo>

<chapter id="introduction">
<title
>Вступ</title>
<para
>У цьому розділі наведено короткий огляд основних можливостей та прийомів роботи у &rocs;. Користувачам, які хочуть негайно перейти до навчання принципам роботи у &rocs;, ми пропонуємо перейти до читання розділу <xref linkend="introduction-nutshell"/>, користуючись настановами розділу <xref linkend="scripting"/> щодо написання алгоритмів. </para>

<sect1 id="introduction-goals">
<title
>Мета, цільова аудиторія програми та процес роботи з нею</title>
<para
>&rocs; — комплексний інструмент для теорії графів, призначене для всіх, хто цікавиться розробкою та вивченням алгоритмів, пов’язаних з графами. Це зокрема</para>
<itemizedlist>
    <listitem
><para
>викладачі, які хочуть продемонструвати роботу алгоритмів, пов’язаних з графами, студентам,</para
></listitem>
    <listitem
><para
>студенти і дослідники, які бажають краще розібратися у роботі алгоритмів,</para
></listitem>
    <listitem
><para
>усі, хто цікавиться структурами даних та алгоритмами.</para
></listitem>
</itemizedlist>
<para
>Для усіх цих користувачів у &rocs; передбачено простий у користуванні графічний редактор для створення графів, потужний рушій для роботи зі скриптами та виконання алгоритмів, а також декілька допоміжних інструментів для імітацій, експериментів та експортування графів. Типовим способом використання &rocs; є створення графу або вручну (тобто перетягуванням вершин і ребер на полотно), або а допомогою засобів створення графів. Після цього можна реалізувати і виконати алгоритми обробки графів для створеного графу. Усі внесені алгоритмом зміни буде негайно показано у редакторі графів. </para>

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

<sect1 id="introduction-nutshell">
<title
>Ядро &rocs;</title>
<para
>Загалом, кожен сеанс &rocs; є проєктом: під час запуску &rocs; створюється порожній проєкт; якщо завантажуєтеся якийсь проєкт, він стає поточним. Сам проєкт складається з <emphasis
>документів графів</emphasis
>, <emphasis
>скриптів або алгоритмів</emphasis
> та <emphasis
>журналу</emphasis
>. </para>

<sect2>
<title
>Документи графів</title>
<para
>Документ графу відтворює вміст полотна у редакторі графів. У ньому містяться дані щодо визначених користувачем типів вузлів та ребер, їхніх властивостей, а також щодо вже створених вузлів і ребер. Тобто, &rocs; вважає набір усіх вузлів і ребер документа графів (необов’язково з’єднаних) самим графом. Доступ до усіх елементів документа графу можна отримати за допомогою рушія обробки скриптів та загального об’єкта <userinput
><command
>Document</command
></userinput
>. </para>
</sect2>

<sect2>
<title
>Типи ребер</title>
<para
>Іноді, граф може складатися із ребер різних типів (наприклад, незорієнтований граф плюс ребра дерева, обчислені за допомогою алгоритму пошуку у ширину), які слід обробляти і показувати у різний спосіб. Для цього, окрім типового типу ребер, ви можете визначити довільні інші типи ребер. Кожен тип ребер має власне візуальне представлення, динамічні властивості, а також може бути орієнтованим або незорієнтованим. У інтерфейсі написання скриптів передбачено зручні методи для доступу до ребер певних типів. </para>
</sect2>

<sect2>
<title
>Типи вузлів</title>
<para
>Аналогічно до типів ребер ви можете визначити різні типи вершити графу (наприклад, надати певним вершинам особливі ролі). У кожного типу вершин (вузлів) передбачено власне представлення та динамічні властивості. </para>
</sect2>

<sect2>
<title
>Властивості</title>
<para
>Кожен елемент (вершини або ребра) може мати властивості. Ці властивості має бути визначено у відповідному типі вершин або ребер. Властивості ідентифікуються за назвами і можуть містити будь-які значення. Доступ до властивостей виконується за назвами. Для створення або внесення змін до наявних властивостей слід використовувати бічну панель <guilabel
>Типи елементів</guilabel
>. Для відкриття діалогового вікна властивостей слід використовувати кнопку <inlinemediaobject
><imageobject
><imagedata fileref="document-properties.png" format="PNG"/> </imageobject
></inlinemediaobject
><guibutton
>Властивості</guibutton
>. </para>
<para
>Крім того, ви можете скористатися рушієм обробки скриптів для доступу до зареєстрованих властивостей та зміни їхніх значень. У наведеному нижче прикладі ми припускаємо, що властивість «weight» зареєстровано для типового типу ребер. <programlisting
>var nodes = Document.nodes()
for (var i = 0; i &lt; nodes.length; ++i){
    nodes[i].weight = i;
}
for (var i = 0; i &lt; nodes.length; ++i){
    Console.log("weight of node " + i + ": " + nodes[i].weight);
}
</programlisting>
</para>
</sect2>
</sect1>

<sect1 id="introduction-tutorial">
<title
>Покрокові настанови</title>
<para
>У цьому розділі ми створимо приклад проєкту для вивчення декількох найважливіших можливостей &rocs;. Метою є створення графу та скрипту для ілюстрування простого 2-апроксимаційного алгоритму розв’язування задачі <emphasis
>мінімального вершинного покриття</emphasis
>. Задача мінімального вершинного покриття полягає у визначенні підмножини вузлів графу C мінімального розміру, такої, що кожне з ребер графу з’єднано з принаймні одним вузлом з C. Відомо, що ця задача має NP-складність. Ми хочемо проілюструвати спосіб визначення парної апроксимації обчисленням відповідника вказаного графу. </para>
<para
>Нашою метою буде візуалізації зв’язку між відповідностями і мінімальним вершинним покриттям. Для цього ми визначимо два типи ребер: один для показу відповідних ребер і ще один для показу звичайних ребер; а також два типи вузлів, за допомогою яких відрізнятимемо вузли, що належать до C, і вузли, що не належать до C. </para>

<sect2>
<title
>Створення графу</title>
<para
>Для створення графу скористаймося типовим засобом створення графів &rocs;. Викликати цей засіб можна за допомогою пункту основного меню <menuchoice
><guimenu
>Документ графу</guimenu
> <guisubmenu
>Інструменти</guisubmenu
> <guimenuitem
>Створити граф</guimenuitem
></menuchoice
>. Виберемо <guilabel
>Випадковий граф</guilabel
> з 30 вузлами, 90 ребрами і зреном 1 (зерном є початкове значення для генератора випадкових значень; використання одного зерна призведе до створення тих самих графів). </para>
</sect2>

<sect2>
<title
>Створення типів елементів</title>
<para
>Ми скористаємося панеллю <guilabel
>Типи елементів</guilabel
> і створимо другий тип вершин, а також другий тип ребер. Для обох нових типів ми відкриємо діалогове вікно властивостей за допомогою відповідних кнопок <inlinemediaobject
><imageobject
><imagedata fileref="document-properties.png" format="PNG"/></imageobject
></inlinemediaobject
><guibutton
>Властивості</guibutton
> і встановимо ідентифікатори у значення <literal
>2</literal
>. Далі, ми змінимо кольори елементів цих двох нових типів (для того, щоб їх було просто відрізнити від типових типів). Нарешті, ми встановимо двоспрямований тип ребер і визначимо для ідентифікаторів типових типів значення <literal
>1</literal
>. </para>
</sect2>

<sect2>
<title
>Алгоритм</title>
<para
>Нарешті, нам слід реалізувати алгоритм апроксимації. Для цього ми скористаємося таким кодом: </para>
<programlisting
>for (var i=0; i &lt; Document.nodes.length; i++) {
    Document.nodes[i].type = 1;
}
for (var i=0; i &lt; Document.edges.length; i++) {
    Document.edges[i].type = 1;
}

var E = Document.edges(); // набір необроблених ребер
var C = new Array();      // відповідні ребра
while (E.length 
> 0) {
    var e = E[0];         // беремо перше ребро e={u,v}
    var u = e.from();
    var v = e.to();
    e.type = 2;           // робимо ребро відповідним
    E.shift();            // вилучити e (тобто E[0]) зі списку ребер
    C.push(u);            // додати u до C
    C.push(v);            // додати v до C

    // позначити u,v як вузли у C
    u.type = 2;
    v.type = 2;

    // вилучити з E усі ребра, суміжні з u або v
    var adjacent = u.edges();
    for (var i=0; i &lt; adjacent.length; i++) {
        var index = E.indexOf(adjacent[i]); // знайти індекс
        if (index != -1) {
            E.splice(index, 1); // вилучити його, якщо знайдено
        }
    }
    var adjacent = v.edges();
    for (var i=0; i &lt; adjacent.length; i++) {
        var index = E.indexOf(adjacent[i]); // знайти індекс
        if (index != -1) {
            E.splice(index, 1); // вилучити його, якщо знайдено
        }
    }
}
Console.log("Покриття вершин містить " + C.length + " вузлів.");
</programlisting>
</sect2>

<sect2>
<title
>Виконання алгоритму</title>
<para
>Алгоритм можна виконати за допомогою кнопки <inlinemediaobject
><imageobject
><imagedata fileref="media-playback-start.png" format="PNG"/></imageobject
></inlinemediaobject
><guibutton
>Виконати</guibutton
> на панелі керування скриптами. </para>
</sect2>
</sect1>
</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
>У редакторі передбачено панель полотна, на якій можна розташовувати вершини і ребра. Подвійне клацання на будь-якому з елементів цієї панелі відкриває відповідне меню властивостей. Ви можете скористатися цими інструментами за допомогою <emphasis
>вкладок бічної панелі</emphasis
> для створення та редагування графів.</para>
    <para
>Доступні інструменти:</para>
      <itemizedlist>
        <listitem
><para
>Згори ліворуч на панелі розташовано вказані нижче кнопки дій. Натискання кнопки дії, означатиме, що вказівник миші виконуватиме відповідну дію на панелі редактора графів:</para>
          <itemizedlist>
            <listitem
><para
><inlinemediaobject
><imageobject
><imagedata fileref="sc-actions-rocsselect.png" format="PNG"/></imageobject
></inlinemediaobject
><guiicon
>Позначити і пересунути</guiicon
>: щоб позначити елементи, натисніть ліву кнопку миші на порожньому місці на графі, утримуйте кнопку натисненою і рухом вказівника миші створіть прямокутник, у якому міститимуться елементи даних та/або ребра. Якщо треба позначити окремий елемент, просто клацніть лівою кнопкою миші на цьому елементі. Якщо ви наведете вказівник миші на позначений елемент або набір елементів, натиснете і утримуватимете натисненою ліву кнопку миші, а потім почнете рухати вказівник, разом з ним почнуть рухатися позначені елементи. Пересунути позначені елементи можна також за допомогою клавіш зі стрілочками.</para
></listitem>

            <listitem
><para
><inlinemediaobject
><imageobject
><imagedata fileref="sc-actions-rocsnode.png" format="PNG"/></imageobject
></inlinemediaobject
><guiicon
>Створити вузол</guiicon
>: клацніть у довільній точці панелі редактора, щоб створити новий вузол, який належатиме поточній позначеній структурі даних. Якщо ви продовжите утримувати кнопку миші, програма покаже контекстне меню, за допомогою якого ви зможете вибрати тип даних нового елемента (якщо передбачено різні типи даних елементів).</para
></listitem>

            <listitem
><para
><inlinemediaobject
><imageobject
><imagedata fileref="sc-actions-rocsedge.png" format="PNG"/></imageobject
></inlinemediaobject
><guiicon
>Створити ребро</guiicon
>: наведіть вказівник миші на позицію першого вузла, натисніть і утримуйте натисненою ліву кнопку миші, перетягніть вказівник до позиції другого вузла, до якого має прямувати ребро. Виконати цю дію можна буде, лише якщо у поточному графі можливе додавання такого ребра (наприклад, у незорієнтованому графі не можна додавати декілька ребер між двома вузлами). Якщо ви утримуватимете натисненою кнопку миші і далі, програма покаже меню, за допомогою якого можна буде вибрати тип ребра (якщо типи ребер передбачено поточним типом графу).</para
></listitem>

            <listitem
><para
><inlinemediaobject
><imageobject
><imagedata fileref="sc-actions-rocsdelete.png" format="PNG"/></imageobject
></inlinemediaobject
><guiicon
>Вилучити елемент</guiicon
>: клацніть на елементі графу, щоб його вилучити. Якщо ви вилучите вузол, всі ребра, які з ним з’єднано, також буде вилучено.</para
></listitem>
          </itemizedlist>
        </listitem>
      </itemizedlist>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term
>Бічна панель</term>
    <listitem
><para
>Праворуч розташовано бічну панель, за допомогою якої можна отримати доступ до декількох робочих інструментів:</para>
      <itemizedlist>
        <listitem
><para
><guilabel
>Типи елементів</guilabel
>: за допомогою цього віджета можна отримати безпосередній доступ до доступних типів ребер і вузлів.</para
></listitem>

        <listitem
><para
><guilabel
>Журнал</guilabel
>: у кожного з проєктів є власний журнал, яким можна скористатися, наприклад, для занотовування завдань, результатів та спостережень.</para
></listitem>

        <listitem
><para
><guilabel
>Програмний інтерфейс для роботи зі скриптами</guilabel
>: за допомогою цього віджета можна отримати безпосередній доступ до документації зі скриптів.</para
></listitem>
      </itemizedlist>
    </listitem>
  </varlistentry>
  <varlistentry>
    <term
>Редактор скриптів</term>
    <listitem
><para
>У полі цього текстового редактора ви можете створювати скрипти алгоритмів у спосіб, описаний у розділі <xref linkend="scripting"/>. Ви можете працювати одночасно над декількома алгоритмами: для цього достатньо відкрити або створити декілька вкладок скриптів за допомогою головного меню програми.</para
></listitem>
  </varlistentry>
  <varlistentry>
    <term
>Дані, виведені скриптом:</term>
    <listitem
><para
>До цього поля програма виводитиме діагностичні повідомлення або дані, виведені скриптом, залежно від перемикача у верхній частині цього віджета. Якщо під час виконання скрипту станеться помилка, програма негайно перемкнеться у режим діагностичних повідомлень.</para
></listitem>
  </varlistentry>
  <varlistentry>
    <term
>Керування</term>
    <listitem
><para
>На цій панелі розташовано елементи керування виконанням скриптів. Ви можете наказати програмі виконати скрипт, відкритий у редакторів скриптів, натисканням кнопки <inlinemediaobject
><imageobject
><imagedata fileref="media-playback-start.png" format="PNG"/></imageobject
></inlinemediaobject
><guibutton
>Пуск</guibutton
>. Якщо виконання скрипту ще не завершено, його можна зупинити натисканням кнопки <inlinemediaobject
><imageobject
><imagedata fileref="process-stop.png" format="PNG"/></imageobject
></inlinemediaobject
><guibutton
>Стоп</guibutton
>.</para
></listitem>
  </varlistentry>
</variablelist>
</sect1>

<!--FIXME nop alignment action any more?-->
</chapter>

<chapter id="scripting">
<title
>Скрипти</title>
<sect1>
    <title
>Виконання алгоритмів у &rocs;</title>
<para
>&rocs; внутрішньо використовує рушій Java Script QtScript. Це означає, що усі реалізовані вами алгоритми має бути написано мовою Java Script. Нижче ми розберемо те, як отримати доступ та змінити елементи документа графу за допомогою рушія роботи зі скриптами. Важливо зауважити, що зміни, внесені за допомогою рушія обробки скриптів, безпосередньо буде відображено у властивостях елементів редактора графів. </para>

<sect2>
<title
>Керування виконанням скриптів</title>
<para
>Передбачено різні режими виконання ваших алгоритмів. </para>
<itemizedlist>
    <listitem
><para>
        <inlinemediaobject
><imageobject>
        <imagedata fileref="media-playback-start.png" format="PNG"/></imageobject
></inlinemediaobject
> <guibutton
>Виконати</guibutton
>: виконати скрипт, аж до завершення його роботи.</para
></listitem>
    <listitem
><para>
        <inlinemediaobject
><imageobject>
        <imagedata fileref="process-stop.png" format="PNG"/></imageobject
></inlinemediaobject
> <guibutton
>Стоп</guibutton
>: припинити виконання скрипту (доступне, лише якщо виконується скрипт).</para
></listitem>
</itemizedlist>
</sect2>

<sect2>
<title
>Дані, виведені скриптом</title>
<para
>Під час виконання алгоритму діагностичні повідомлення та повідомлення, виведені програмою, буде показано на панелі <emphasis
>Вивід повідомлень</emphasis
>. Якщо рушієм обробки скриптів буде виявлено синтаксичну помилку у вашому скрипті, відповідне повідомлення також буде показано серед діагностичних повідомлень. Зауважте, що всі повідомлення, виведені програмою, також буде показано і у списку діагностичних повідомлень (напівжирним шрифтом). </para>
<para
>Керувати текстом, який буде виведено скриптом, можна за допомогою таких функцій: </para>
<programlisting
>Console.log(string message);            // показати повідомлення як виведене скриптом
Console.debug(string message);          // показати повідомлення як діагностичне
Console.error(string message);          // показати повідомлення як помилку
</programlisting>
</sect2>

<sect2>
<title
>Інтерфейс (API) роботи зі скриптами</title>
<para
>Кожна з різних частин &rocs; надає статичний елемент, доступ до якого можна отримати за допомогою рушія обробки скриптів. Цими частинами є: <itemizedlist
> <listitem
><para
><userinput
><command
>Document</command
></userinput
> — документ графу;</para
></listitem
> <listitem
><para
><userinput
><command
>Console</command
></userinput
> — виведені до консолі записи журналу.</para
></listitem
> </itemizedlist
> Явне використання програмного інтерфейсу та довідку з методів можна знайти у вбудованій довідці бічної панелі &rocs;. </para>
</sect2>
</sect1>
</chapter>

<chapter id="import-export">
<title
>Імпортування та експортування</title>
<sect1 id="import-export-projects">
    <title
>Обмін проєктами &rocs;</title>
    <para
>Проєкти &rocs; можна імпортувати та експортувати у форматі файлів архівів <literal role="extension"
>.tar.gz</literal
>. Такими архівами можна скористатися для обміну проєктами, імпортування та експортування можна здійснювати за допомогою пунктів меню <menuchoice
><guimenu
>Документ графу</guimenu
> <guimenuitem
>Імпортувати проєкт…</guimenuitem
></menuchoice
> та <menuchoice
><guimenu
>Документ графу</guimenu
> <guimenuitem
>Експортувати проєкт як</guimenuitem
></menuchoice
>, відповідно. </para>

<sect2 id="import-export-graphs">
    <title
>Імпортування та експортування документів графів</title>
    <para
>У поточній версії &rocs; передбачено підтримку імпортування та експортування даних файлів у таких форматах:</para>
    <itemizedlist>
        <listitem
><para
>файли DOT, також відомі як файли Graphviz</para
></listitem>
        <listitem
><para
>файли <acronym
>GML</acronym
></para
></listitem>
        <listitem
><para
>Файли у форматі TGF</para
></listitem>
        <listitem
><para
>Формат KML</para
></listitem>
    </itemizedlist>

<sect3 id="format-specification-tgf">
<title
>Формат файлів звичайних графів (TGF)</title>
<para
><emphasis
>Звичайний формат графів</emphasis
> (Trivial Graph Format або <acronym
>TGF</acronym
>) є простим текстовим форматом файлів, призначеним для опису графів. Файл <acronym
>TGF</acronym
> містить список визначень вузлів з прив’язкою ідентифікаторів вузлів до міток, за яким вказано список ребер. У такому форматі можливий запис лише однієї мітки на вузол і одного значення на ребро. &rocs; обробляє імпортовані графи у цьому форматі як неорієнтовані. Експортовані графи у цьому форматі міститимуть по два ребра на з’єднання, якщо з’єднання у них є двонапрямленими. </para>

<sect4>
<title
>Специфікація формату</title>
    <itemizedlist>
        <listitem
><para
>Файл починається зі списку вузлів (один вузол на рядок), далі має бути рядок з єдиним символом «#», за яким має йти список ребер (по одному ребру на рядок).</para
></listitem>
        <listitem
><para
>Запис вузла складається з цілого числа (ідентифікатора), пробілу і довільного рядка.</para
></listitem>
        <listitem
><para
>Запис ребра складається з двох цілих чисел (ідентифікаторів), відокремлених пробілом, пробілу та довільного рядка. Вважається, що спрямоване ребро виходить з вузла з першим ідентифікатором і прямує до вузла з другим ідентифікатором.</para
></listitem>
    </itemizedlist>
</sect4>
<sect4>
<title
>Приклад</title>
<programlisting
>1 starting node
2 transmitter
3 sink
#
1 2 blue
2 1 red
2 3 green
</programlisting>
</sect4>
</sect3>

<sect3 id="format-specification-dot">
<title
>Мова DOT та формат файлів графів Graphviz</title>
<para
>Мова &DOT; є мовою текстового опису графів, у якій поєднується придатне до читання людиною представлення графів та можливості ефективної обробки графу програмами компонування. &DOT; є типовим форматом файлів для комплексу програм для візуалізації графів Graphviz, але цей формат також широко використовується іншими програмами для обробки графів. Типовими суфіксами назв файлів у форматі &DOT; є <literal role="extension"
>.gv</literal
> та <literal role="extension"
>.dot</literal
>. </para>

<sect4>
<title
>Непідтримувані можливості</title>
<para
>Програма &rocs; здатна обробляти всі файли графів, які містять дані, що відповідають специфікації мови &DOT;<footnote
><para
>https://graphviz.org/doc/info/lang.html</para
></footnote
>. Передбачено повну підтримку можливостей мови, окрім таких виключень: </para>
    <itemizedlist>
        <listitem
><para
>підграфи: через відсутність концепції підграфів у &rocs;, підграфи (subgraph) імпортуються лише як набори елементів даних зі з’єднаннями. Зокрема, не імпортуються дані щодо вхідних і вихідних з’єднань між підграфами.</para
></listitem>
        <listitem
><para
>Атрибути &HTML; і &XML;: атрибути (зокрема мітки) що містять синтаксичні конструкції &HTML; або &XML; читаються без обробки. Зокрема, не виконується обробка інструкцій щодо зміни шрифтів та стилю запису з атрибутів.</para
></listitem>
    </itemizedlist>
</sect4>
<sect4>
<title
>Приклад</title>
<programlisting
>digraph myGraph {
    a -> b -> c;
    b -> d;
}
</programlisting>
</sect4>
</sect3>
</sect2>
</sect1>
</chapter>

<chapter id="graph-layout">
    <title
>Компонування графу</title>

    <sect1>
        <title
>Автоматичне компонування графів у &rocs;</title>
        <para
>&rocs; може виконувати компонування графів автоматично. Доступ до засобу компонування графів &rocs; можна отримати з головного меню програми: <menuchoice
><guimenu
>Документ графу</guimenu
> <guisubmenu
>Інструменти</guisubmenu
> <guimenuitem
>Компонування графу</guimenuitem
></menuchoice
>. Для компонування можна застосовувати два різних алгоритми: компонування на основі сил і компонування з радіальним деревом. Щоб застосувати одне з компонувань, виберіть відповідну вкладку вікна засобу компонування графів, вкажіть бажані параметри і виконайте алгоритм натисканням кнопки <guibutton
>Гаразд</guibutton
>. Подробиці щодо кожного з алгоритмів компонування наведено у нижче. </para>

    <sect2>
        <title
>Компонування на основі сил</title>

        <para
>Компонування на основі сил може бути застосоване до будь-яких графів. Якщо описувати цей алгоритм просто, він імітує сили, які діють на кожен з вузлів графу. Між сусідніми парами вузлів діють сили відштовхування і притягання. Величини цих сил можна вказати пересуванням відповідних повзунків у інтерфейсі користувача. </para>

        <screenshot>
          <screeninfo
>Знімок вікна вкладки компонування на основі сил засобу компонування графів &rocs;.</screeninfo>
          <mediaobject>
            <imageobject
><imagedata fileref="force-based-layout-ui-screenshot.png" format="PNG"/></imageobject>
            <textobject
><phrase
>Знімок вікна вкладки компонування на основі сил засобу компонування графів &rocs;.</phrase
></textobject>
          </mediaobject>
        </screenshot>

        <para
>Іншим параметром, який можна змінювати є коефіцієнт площі. Цей параметр керує розсіюванням вузлів за площею. У компонуваннях, які створено із більшими значеннями коефіцієнта площі, відстань між вузлами є більшою. </para>

    <sect3>
        <title
>Компонування з радіальним деревом</title>
        <para
>Компонування «радіальне дерево» може бути застосовано лише до дерев. Будь-які спроби застосувати цей алгоритм компонування до інших типів графів призводитимуть до повідомлення про помилку. Параметри компонування «радіальне дерево» може бути вибрати за допомогою відповідного інтерфейсу користувача. </para>


        <screenshot>
          <screeninfo
>Знімок вікна вкладки компонування «Радіальне дерево» засобу компонування графів &rocs;.</screeninfo>
          <mediaobject>
            <imageobject
><imagedata fileref="radial-tree-layout-ui-screenshot.png" format="PNG"/></imageobject>
            <textobject
><phrase
>Знімок вікна вкладки компонування «Радіальне дерево» засобу компонування графів &rocs;.</phrase
></textobject>
          </mediaobject>
        </screenshot>

        <para
>Параметр типу дерева надає змогу вибрати між довільним деревоподібним компонуванням і кореневим деревоподібним компонуванням. У довільному компонуванні вузли розташовуються довільно без видимої ієрархії. У кореневому компонуванні кореневий вузол розташовується згори, а усі підлеглі дерева — під ним; це компонування надає змогу бачити ієрархію вузлів. </para>

        <para
>Параметр центру або кореня визначає, який з вузлів буде використано як кореневий для кореневого компонування або як центр для довільного компонування. Центром довільного компонування є перший вузол, який оброблятиметься алгоритмом. Усі інші вузли буде розташовано на колах із центром у центральному вузлі. Центр або корінь може бути вибрано алгоритмом компонування у автоматичному режимі. </para>

        <para
>Параметр відокремлення вузлів керує відстанню між вузлами. Збільшення значення цього параметра спричиняє збільшення відстані між вузлами. Відповідно, зменшення значення робить відстань між вузлами меншою. </para>
    </sect3>
    </sect2>
    </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–2012</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Wagner Reck (wagner.reck AT gmail.com), 2008–2012</para
></listitem>
	<listitem
><para
>Авторські права на програму належать Andreas Cord-Landwehr (cordlandwehr AT kde.org), 2011–2015</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 kde.org), 2011–2015</para
></listitem>
</itemizedlist>

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

&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:
-->
