https://wikimacro.k3info.ru/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B0%D0%BC%D0%B8&feed=atom&action=historyРабота с графами - История изменений2024-03-29T15:24:32ZИстория изменений этой страницы в викиMediaWiki 1.38.1https://wikimacro.k3info.ru/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B0%D0%BC%D0%B8&diff=4235&oldid=prevAleksandr Dragunkin: подсветка синтаксиса2023-04-14T11:03:08Z<p>подсветка синтаксиса</p>
<a href="https://wikimacro.k3info.ru/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B0%D0%BC%D0%B8&diff=4235&oldid=2531">Внесённые изменения</a>Aleksandr Dragunkinhttps://wikimacro.k3info.ru/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B0%D0%BC%D0%B8&diff=2531&oldid=prevAleksandro в 13:49, 1 сентября 20212021-09-01T13:49:51Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Предыдущая версия</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Версия от 16:49, 1 сентября 2021</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1">Строка 1:</td>
<td colspan="2" class="diff-lineno">Строка 1:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>[[Категория:Макро]]</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>[[Категория:Макро]]</div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{{Макро}}</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">----</ins></div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>В данном разделе собраны функции и команды работы с графами. Графы в '''K3''' могут быть только плоскими геометрическими. То есть, вершина графа характеризуется двумя координатами на плоскости, а ребро одним параметром - числом. Ребра в '''K3''' ориентированные. Это значит, что порядок вершин у ребра имеет значение. Ребро идет от первой вершины ко второй. Если необходим неориентированный граф, то нужно в граф добавить два ребра с одинаковыми вершинами - «туда» и «обратно».</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>В данном разделе собраны функции и команды работы с графами. Графы в '''K3''' могут быть только плоскими геометрическими. То есть, вершина графа характеризуется двумя координатами на плоскости, а ребро одним параметром - числом. Ребра в '''K3''' ориентированные. Это значит, что порядок вершин у ребра имеет значение. Ребро идет от первой вершины ко второй. Если необходим неориентированный граф, то нужно в граф добавить два ребра с одинаковыми вершинами - «туда» и «обратно».</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l267">Строка 267:</td>
<td colspan="2" class="diff-lineno">Строка 269:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> }</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> }</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> NULLOUT=FreeGraph(i); // Удаляем исходный граф</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> NULLOUT=FreeGraph(i); // Удаляем исходный граф</div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">----</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{{Макро}}</ins></div></td></tr>
</table>Aleksandrohttps://wikimacro.k3info.ru/index.php?title=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B3%D1%80%D0%B0%D1%84%D0%B0%D0%BC%D0%B8&diff=649&oldid=prevAleksandro: Новая страница: «Категория:Макро В данном разделе собраны функции и команды работы с графами. Графы в '''...»2021-07-29T18:21:31Z<p>Новая страница: «<a href="/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%9C%D0%B0%D0%BA%D1%80%D0%BE" title="Категория:Макро">Категория:Макро</a> В данном разделе собраны функции и команды работы с графами. Графы в '''...»</p>
<p><b>Новая страница</b></p><div>[[Категория:Макро]]<br />
В данном разделе собраны функции и команды работы с графами. Графы в '''K3''' могут быть только плоскими геометрическими. То есть, вершина графа характеризуется двумя координатами на плоскости, а ребро одним параметром - числом. Ребра в '''K3''' ориентированные. Это значит, что порядок вершин у ребра имеет значение. Ребро идет от первой вершины ко второй. Если необходим неориентированный граф, то нужно в граф добавить два ребра с одинаковыми вершинами - «туда» и «обратно».<br />
<br />
== Инициализация и удаление графа ==<br />
<br />
<code>INT '''BeginGraph'''()</code><br />
<br />
Функция '''BeginGraph''' инициализирует граф и присваиваем ему уникальный номер. Доступ к элементам графа осуществляется по этому номеру.<br />
<br />
<br />
<code>LOGCAL '''FreeGraph'''(INT ''&lt;NGraph&gt;'')</code><br />
<br />
Функция '''FreeGraph''' освобождает память из-под графа с номером <code>''&lt;NGraph&gt;''</code>. Функция возвращает единицу в случае удачного завершения или ноль в случае ошибки. Память обязательно должна быть освобождена по окончании использования графа.<br />
<br />
== Добавление элементов в граф ==<br />
<br />
<code>INT '''AddVertGraph'''(INT ''&lt;NGraph&gt;'', DOUBLE ''&lt;x&gt;'', DOUBLE ''&lt;y&gt;'')</code><br />
<br />
<code>INT '''AddVertGraph'''(INT ''&lt;NGraph&gt;'', INT ''&lt;UnObj&gt;'')</code><br />
<br />
Функция '''AddVertGraph''' добавляет вершину, заданную координатами <code>''&lt;x&gt;''</code>,<code>''&lt;y&gt;''</code> или номером объекта <code>''&lt;UnObj&gt;</code> ''(см. '''[[Работа с универсальными плоскими объектами]]''') в граф с номером <code>''&lt;NGraph&gt;''</code>. Функция возвращает номер вершины, начиная с единицы или ноль в случае ошибки.<br />
<br />
<br />
<code>INT '''AddEdgeGraph'''(INT ''&lt;NGraph&gt;'', INT ''&lt;Type&gt;'', DOUBLE ARRAY ''&lt;Arr&gt;'', DOUBLE ''&lt;eQ&gt;'')</code> ''(до 18.02.2020)''<br />
<br />
<code>INT '''AddEdgeGraph'''(INT ''&lt;NGraph&gt;'', INT ''&lt;Type&gt;'', DOUBLE ARRAY ''&lt;Arr&gt;'', DOUBLE ''&lt;eQ&gt;''[, INT ''<userinfo>''])</code> ''(с 18.02.2020)''<br />
<br />
<code>INT '''AddEdgeGraph'''(INT ''&lt;NGraph&gt;'', INT ''&lt;UnObj&gt;'', DOUBLE ''&lt;eQ&gt;'')</code><br />
<br />
Функция '''AddEdgeGraph''' добавляет ребро, заданной массивом <code>''&lt;Arr&gt;''</code> или объектом <code>''&lt;UnObj&gt;''</code> (см. '''[[Работа с универсальными плоскими объектами]]''') в граф с номером <code>''&lt;NGraph&gt;''</code>. <br />
<br />
Параметр <code>''&lt;Type&gt;</code> ''задает тип добавляемого ребра ('''1''' - отрезок, '''2''' - дуга). <br />
<br />
<code>''&lt;Arr&gt;''</code> — массив с координатами точек добавляемого ребра. Если добавляется отрезок, в массиве 4 параметра ('''x1, y1, x2, y2'''). Если дуга - 6 параметров ('''x1, y1, x2, y2, xm, ym'''). Координаты '''x1, y1''' - координаты начала отрезка или дуги, '''x2, y2 '''- координаты конца отрезка или дуги,''' xm, ym''' - координаты точки на дуге. <br />
<br />
Величина <code>''&lt;eQ&gt;''</code> — числовой параметр ребра графа. <br />
<br />
<code>''&lt;userinfo&gt;''</code> — пользовательская метка ребра.<br />
<br />
Функция возвращает номер ребра, начиная с единицы или ноль в случае ошибки.<br />
<br />
== Операции с графом ==<br />
<br />
<code>INT '''GetNumVerts'''(INT ''&lt;NGraph&gt;'')</code><br />
<br />
Функция '''GetNumVerts''' возвращает число вершин в графе с номером <code>''&lt;NGraph&gt;''</code>.<br />
<br />
<br />
<code>INT '''GetNumEdges'''(INT ''&lt;NGraph&gt;'')</code><br />
<br />
Функция '''GetNumEdges''' возвращает число ребер в графе с номером <code>''&lt;NGraph&gt;''</code>.<br />
<br />
<br />
<code>LOGICAL '''InterGraph'''(INT ''&lt;NGraph&gt;'')</code><br />
<br />
Функция '''InterGraph''' находит точки взаимного пересечения ребер графа с номером <code>''&lt;NGraph&gt;</code> ''и корректирует граф, чтобы не было пересекающихся ребер. Функция возвращает единицу, если граф скорректирован удачно и ноль в случае ошибки.<br />
<br />
<br />
<code>INT '''FindLoops'''(INT ''&lt;NGraph&gt;'')</code><br />
<br />
Функция '''FindLoops''' находит "циклы" в графе с номером <code>''&lt;NGraph&gt;</code> ''и записывает их в тот же граф. "Циклами" в данном случае считаются замкнутые на себя части графа,когда первая вершина совпадает с последней. Функция возвращает число найденных циклов или -1 в случае ошибки.<br />
<br />
<br />
<code>INT '''GetNumLoops'''(INT ''&lt;NGraph&gt;'')</code><br />
<br />
Функция '''GetNumLoops''' возвращает число "циклов" в графе с номером <code>''&lt;NGraph&gt;''</code>.<br />
<br />
<br />
<code>INT '''EquidLoop'''(INT ''&lt;NGraph&gt;'', INT ''&lt;NLoop&gt;'')</code><br />
<br />
Функция '''EquidLoop''' находит эквидистанту с разной высотой в цикле <code>''&lt;NLoop&gt;</code> ''графа с номером <code>''&lt;NGraph&gt;''</code>. Высоты эквидистанты заданы четвертым параметром функции <code>AddEdgeGraph</code>. При нахождении эквидистанты создается новый граф. Функция возвращает номер графа с эквидистантой или ноль в случае ошибки.<br />
<br />
<br />
<code>INT '''LoopByPoint'''(INT ''&lt;NGraph&gt;'', DOUBLE ''&lt;x&gt;'', DOUBLE ''&lt;y&gt;'')</code><br />
<br />
Функция '''LoopByPoint''' возвращает номер цикла в графе с номером <code>''&lt;NGraph&gt;</code> ''по точке, заданной своими координатами <code>''&lt;x&gt;''</code>, <code>''&lt;y&gt;''</code>. Функция возвращает номер цикла (начиная с единицы) или ноль в случае ошибки.<br />
<br />
<br />
<code>LOGICAL '''EquidGraph'''(INT ''&lt;NGraphSource&gt;, ''INT ''&lt;NGraphDest&gt;)''</code><br />
<br />
Функция '''EquidGraph''' строит эквидистантный граф с номером <code>''&lt;NGraphDest&gt;</code> ''к графу с номером <code>''&lt;NGraphSource&gt;</code> ''и помещает его в список графов.<br />
<br />
Функция возвращает единицу в случае успешного завершения или ноль в случае ошибки.<br />
<br />
<br />
<code>INT '''FindObjParts'''(INT ''&lt;NGraph&gt;, ''INT ''&lt;UnObj&gt;, ARRAY &lt;Arr&gt;'')</code><br />
<br />
Функция '''FindObjParts''' находит части объекта <code>''&lt;UnObj&gt;</code> ''(см. '''[[Работа с универсальными плоскими объектами]]''') , которые лежат внутри графа с номером <code>''&lt;NGraph&gt;</code>, ''и заполняет двумерный массив <code>''&lt;Arr&gt;</code> ''следующей структуры:<br />
:'''Array<nowiki>[n,5], </nowiki>'''<br />
где '''n''' - номер части при делении,<br />
<br />
<br />
'''Array<nowiki>[n,1]</nowiki>''' — номер объекта в списке объектов;<br />
<br />
'''Array<nowiki>[n,2]</nowiki>''' — код первой точки объекта ('''0''' - нормальная вершина, '''1''' - проходит через вершину графа);<br />
<br />
'''Array<nowiki>[n,3]</nowiki>''' — угол сопряжения первой точки объекта;<br />
<br />
'''Array<nowiki>[n,4]</nowiki>''' — код второй точки объекта ('''0''' - нормальная вершина, '''1''' - проходит через вершину графа);<br />
<br />
'''Array<nowiki>[n,5]</nowiki>''' — угол сопряжения второй точки объекта.<br />
<br />
Функция возвращает число частей '''n.'''<br />
<br />
== Получение информации о графе ==<br />
<code>LOGICAL '''GetVertGraph'''(INT ''&lt;NGraph&gt;'', INT ''&lt;NVert&gt;'', DOUBLE ''&lt;x&gt;'', DOUBLE ''&lt;y&gt;'')</code><br />
<br />
Функция возвращает координаты вершины <code>''&lt;NVert&gt;</code> ''графа с номером <code>''&lt;NGraph&gt;''</code>. Координаты записываются в переменные <code>''&lt;x&gt;''</code>, <code>''&lt;y&gt;''</code>. Функция возвращает единицу в случае удачного завершения и ноль в случае ошибки.<br />
<br />
<br />
<code>INT '''GetVertGraph'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;VertNum&gt;'')</code><br />
<br />
Функция '''GetVertGraph''' возвращает номер объекта <code>''&lt;UnObj&gt;</code> ''(см. '''[[Работа с универсальными плоскими объектами]]'''), содержащий координаты вершины с номером <code>''&lt;NumVert&gt;</code>'' графа с номером <code>''&lt;GraphNum&gt;''</code>.<br />
<br />
<br />
<code>INT '''GetEdgeGraph'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;EdgeNum&gt;'', DOUBLE ARRAY ''&lt;Arr&gt;'')</code> ''(до 18.02.2020)''<br />
<br />
<code>INT '''GetEdgeGraph'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;EdgeNum&gt;'', DOUBLE ARRAY ''&lt;Arr&gt;''[, INT ''<userinfo>''])</code> <br />
<br />
<code>INT '''GetEdgeGraph'''(INT ''&lt;GraphNum&gt;'', INT'' &lt;EdgeNum&gt;'')</code><br />
<br />
Функция '''GetEdgeGraph''' находит ребро с номером <code>''&lt;EdgeNum&gt;</code>'' графа с номером <code>''&lt;GraphNum&gt;''</code> и кладет его координаты в массив <code>''&lt;Arr&gt;''</code>.'' <br />
<br />
<code>''<userinfo>''</code> — пользовательская метка ребра.<br />
<br />
''В массиве содержатся координаты:<br />
<br />
* линии - '''4''' элемента ('''x1, y1, x2, y2''')<br />
* дуги - '''6''' элементов ('''x1, y1, x2, y2, xm, ym''')<br />
<br />
Функция возвращает число заполненных элементов массива.<br />
<br />
<br />
<code>INT '''GetEdgeGraph'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;EdgeNum&gt;'')</code><br />
<br />
Функция '''GetEdgeGraph''' возвращает номер объекта <code>''&lt;UnObj&gt;</code> ''(см. '''[[Работа с универсальными плоскими объектами]]''') ребра с номером <code>''&lt;EdgeNum&gt;''</code> графа с номером <code>''&lt;GraphNum&gt;''</code>.<br />
<br />
<br />
<code>LOGICAL '''GetVertLoop'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;LoopNum&gt;'', INT ''&lt;VertNum&gt;'', DOUBLE ''&lt;x&gt;'', DOUBLE ''&lt;y&gt;'')</code><br />
<br />
Функция '''GetVertLoop''' заполняет переменные <code>''&lt;x&gt;''</code>, <code>''&lt;y&gt;''</code> значениями координат вершины с номером <code>''&lt;VertNum&gt;</code> ''цикла с номером <code>''&lt;LoopNum&gt;''</code> графа с номером <code>''&lt;GraphNum&gt;''</code>.<br />
<br />
Функция возвращает единицу в случае удачного завершения или ноль в случае ошибки (в частности, если вершины с номером <code>''&lt;VertNum&gt;''</code> в цикле нет).<br />
<br />
<br />
<code>INT '''GetVertLoop'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;LoopNum&gt;'', INT ''&lt;VertNum&gt;'')</code><br />
<br />
Функция '''GetVertLoop''' возвращает номер объекта <code>''&lt;UnObj&gt;</code> ''(см. '''[[Работа с универсальными плоскими объектами]]''') вершины с номером <code>''&lt;VertNum&gt;</code> ''цикла с номером <code>''&lt;LoopNum&gt;''</code> графа с номером <code>''&lt;GraphNum&gt;''</code>.<br />
<br />
<br />
<code>INT '''GetEdgeLoop'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;LoopNum&gt;'', INT ''&lt;EdgeNum&gt;'', DOUBLE ARRAY ''&lt;Arr&gt;'')</code><br />
<br />
Функция '''GetEdgeLoop''' находит ребро с номером <code>''&lt;EdgeNum&gt;''</code> цикла с номером <code>''&lt;LoopNum&gt;''</code> графа с номером <code>''&lt;GraphNum&gt;''</code> и кладет его координаты в массив <code>''&lt;Arr&gt;</code> ''В массиве содержатся координаты:<br />
<br />
* линии - '''4''' элемента ('''x1, y1, x2, y2''')<br />
* дуги - '''6''' элементов ('''x1, y1, x2, y2, xm, ym''')<br />
<br />
Функция возвращает число заполненных элементов массива.<br />
<br />
<br />
<code>INT '''GetEdgeLoop'''(INT ''&lt;GraphNum&gt;'', INT ''&lt;LoopNum&gt;'', INT ''&lt;EdgeNum&gt;'')</code><br />
<br />
Функция '''GetEdgeLoop''' возвращает номер объекта <code>''&lt;UnObj&gt;</code> ''(см. '''[[Работа с универсальными плоскими объектами]]''') ребра с номером <code>''&lt;EdgeNum&gt;</code>'' цикла с номером <code>''&lt;LoopNum&gt;''</code> графа с номерм <code>''&lt;GraphNum&gt;''</code>.<br />
<br />
== Пример работы с графом ==<br />
В данном разделе представлен пример макропрограммы работы с графами.<br />
[[Файл:Clip1036.png|thumb|right|400px|Результат работы программы]]<br />
defarr aaa<nowiki>[6];</nowiki><br />
defarr loo<nowiki>[100];</nowiki><br />
i=begingraph(); // Инициализируем граф<br />
aaa<nowiki>[1]=0;</nowiki><br />
aaa<nowiki>[2]=0;</nowiki><br />
aaa<nowiki>[3]=1400;</nowiki><br />
aaa<nowiki>[4]=0;</nowiki><br />
e1=addedgegraph(i,1,aaa,50); // Добавляем в граф ребро<br />
aaa<nowiki>[1]=1400;</nowiki><br />
aaa<nowiki>[2]=0;</nowiki><br />
aaa<nowiki>[3]=1400;</nowiki><br />
aaa<nowiki>[4]=2000;</nowiki><br />
e2=addedgegraph(i,1,aaa,50); // Добавляем в граф ребро <br />
aaa<nowiki>[1]=1400;</nowiki><br />
aaa<nowiki>[2]=2000;</nowiki><br />
aaa<nowiki>[3]=0;</nowiki><br />
aaa<nowiki>[4]=2000;</nowiki><br />
e3=addedgegraph(i,1,aaa,50); // Добавляем в граф ребро<br />
aaa<nowiki>[1]=0;</nowiki><br />
aaa<nowiki>[2]=2000;</nowiki><br />
aaa<nowiki>[3]=0;</nowiki><br />
aaa<nowiki>[4]=0;</nowiki><br />
e4=addedgegraph(i,1,aaa,50); // Добавляем в граф ребро<br />
aaa<nowiki>[1]=0;</nowiki><br />
aaa<nowiki>[2]=500;</nowiki><br />
aaa<nowiki>[3]=1400;</nowiki><br />
aaa<nowiki>[4]=600;</nowiki><br />
e5=addedgegraph(i,1,aaa,100); // Добавляем в граф ребро<br />
aaa<nowiki>[1]=1400;</nowiki><br />
aaa<nowiki>[2]=600;</nowiki><br />
aaa<nowiki>[3]=0;</nowiki><br />
aaa<nowiki>[4]=500;</nowiki><br />
e6=addedgegraph(i,1,aaa,100); // Добавляем в граф ребро<br />
aaa<nowiki>[1]=700;</nowiki><br />
aaa<nowiki>[2]=0;</nowiki><br />
aaa<nowiki>[3]=700;</nowiki><br />
aaa<nowiki>[4]=2000;</nowiki><br />
e7=addedgegraph(i,1,aaa,70); // Добавляем в граф ребро<br />
aaa<nowiki>[1]=700;</nowiki><br />
aaa<nowiki>[2]=2000;</nowiki><br />
aaa<nowiki>[3]=700;</nowiki><br />
aaa<nowiki>[4]=0;</nowiki><br />
e8=addedgegraph(i,1,aaa,80); // Добавляем в граф ребро<br />
<nowiki>aaa[1]=0;</nowiki><br />
<nowiki>aaa[2]=1000;</nowiki><br />
<nowiki>aaa[3]=1400;</nowiki><br />
<nowiki>aaa[4]=1000;</nowiki><br />
<nowiki>aaa[5]=700;</nowiki><br />
<nowiki>aaa[6]=1200;</nowiki><br />
e9=addedgegraph(i,2,aaa,80); // Добавляем в граф ребро<br />
<nowiki>aaa[1]=1400;</nowiki><br />
<nowiki>aaa[2]=1000;</nowiki><br />
<nowiki>aaa[3]=0;</nowiki><br />
<nowiki>aaa[4]=1000;</nowiki><br />
<nowiki>aaa[5]=700;</nowiki><br />
<nowiki>aaa[6]=1200;</nowiki><br />
e10=addedgegraph(i,2,aaa,80); // Добавляем в граф ребро<br />
NULLOUT=InterGraph(i); // Находим точки пересечения и корректируем граф<br />
NG=FindLoops(i); // Находим циклы в графе<br />
ii=0;<br />
loop:<br />
ii=ii+1;<br />
loo<nowiki>[</nowiki>ii]=EquidLoop(i,ii); // Строим эквидистанту к циклу<br />
if (ii&lt;NG)<br />
{<br />
goto loop;<br />
}<br />
gri=0;<br />
loogri:<br />
gri=gri+1;<br />
looi=0;<br />
nedges=<nowiki>GetNumEdges(loo[gri]); // </nowiki>Получаем число ребер<br />
loolooi:<br />
looi=looi+1;<br />
nz=<nowiki>GetEdgeGraph(loo[gri],looi,aaa); // </nowiki>Получаем по очереди все ребра каждого цикла<br />
// Строим ребра<br />
if (nz==4)<br />
{<br />
<nowiki> line aaa[1],aaa[2],0 aaa[3],aaa[4],0 done;</nowiki><br />
}<br />
if (nz==6)<br />
{<br />
<nowiki> arc aaa[1],aaa[2],0 aaa[3],aaa[4],0 aaa[5],aaa[6],0;</nowiki><br />
}<br />
if (looi&lt;nedges)<br />
{<br />
goto loolooi;<br />
}<br />
if (gri&lt;NG)<br />
{<br />
goto loogri;<br />
}<br />
gri=0;<br />
llof:<br />
gri=gri+1;<br />
NULLOUT=FreeGraph(<nowiki>loo[gri]); // </nowiki>Удаляем графы с эквидистантами<br />
if (gri&lt;NG)<br />
{<br />
goto llof;<br />
}<br />
NULLOUT=FreeGraph(i); // Удаляем исходный граф</div>Aleksandro