mirror of
https://github.com/robonen/eulerian-cycle.git
synced 2026-03-20 10:54:46 +00:00
Update guide
This commit is contained in:
BIN
public/air.bmp
Normal file
BIN
public/air.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 MiB |
@@ -28,6 +28,10 @@ html {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
.wrapper {
|
.wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
@@ -529,3 +533,22 @@ p {
|
|||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fade-left-enter-active {
|
||||||
|
animation: fade-left 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-left-leave-active {
|
||||||
|
animation: fade-left 0.5s reverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade-left {
|
||||||
|
from {
|
||||||
|
transform: translateX(40px);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: translateX(0);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -103,7 +103,11 @@ export default {
|
|||||||
// Watchers
|
// Watchers
|
||||||
watch(
|
watch(
|
||||||
() => props.currentStep,
|
() => props.currentStep,
|
||||||
(stepId) => {
|
(stepId) => highlight(stepId)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Methodsc
|
||||||
|
const highlight = (stepId) => {
|
||||||
if (loop === null) return;
|
if (loop === null) return;
|
||||||
|
|
||||||
// Invalidate all
|
// Invalidate all
|
||||||
@@ -124,10 +128,8 @@ export default {
|
|||||||
|
|
||||||
links.value[current_id].selected = 1;
|
links.value[current_id].selected = 1;
|
||||||
activateNodes([current.source, current.target]);
|
activateNodes([current.source, current.target]);
|
||||||
}
|
};
|
||||||
);
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
const loopPosition = (coords) => {
|
const loopPosition = (coords) => {
|
||||||
const node = nodes.value[coords];
|
const node = nodes.value[coords];
|
||||||
|
|
||||||
@@ -151,6 +153,7 @@ export default {
|
|||||||
|
|
||||||
if (links.value.length > 0 && euler.check()) {
|
if (links.value.length > 0 && euler.check()) {
|
||||||
loop = euler.find();
|
loop = euler.find();
|
||||||
|
highlight(0);
|
||||||
} else {
|
} else {
|
||||||
loop = null;
|
loop = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<span class="version">{{ currentStep + 1 }} / {{ steps.length }}</span>
|
<span class="version">{{ currentStep + 1 }} / {{ steps.length }}</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:content>
|
<template v-slot:content>
|
||||||
{{ steps[currentStep].content }}
|
<p v-html="steps[currentStep].content"></p>
|
||||||
</template>
|
</template>
|
||||||
</popup>
|
</popup>
|
||||||
</template>
|
</template>
|
||||||
@@ -29,16 +29,29 @@ export default {
|
|||||||
// Const
|
// Const
|
||||||
const steps = [
|
const steps = [
|
||||||
{
|
{
|
||||||
name: "Создание вершин",
|
name: "Создание графа",
|
||||||
content:
|
content:
|
||||||
"Для создания новой вершины необходимо дважды нажать левую кнопку мыши",
|
"Для создания нового графа, необходимо добавить вершины на рабочую область. Для этого необходимо дважды кликнуть левой кнопкой мыши по рабочей области.",
|
||||||
video: "/video/create.mp4",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Связывание вершин",
|
name: "Связывание вершин",
|
||||||
content:
|
content:
|
||||||
"Чтобы связать вершины, необходимо кликнуть левой кнопкой мыши по вершине, которую необходимо связать. Далее выбираются вершины, с которыми необходимо связать",
|
"После создания вершин, их необходимо связать между собой. Для этого один раз кликните по необходимой вершине, после чего она поменяет цвет. Теперь необходимо выбрать вершины, с которыми необходимо связать. Если вершина успешно привязана, то появится ребро. Чтобы снять выделение, кликните в пустое место рабочей области.",
|
||||||
video: "/video/linking.mp4",
|
},
|
||||||
|
{
|
||||||
|
name: "Удаление вершин и ребер",
|
||||||
|
content:
|
||||||
|
"В случае, когда необходимо удалить вершину или ребро, то достаточно один раз кликнуть правой кнопкой мыши по элементу.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Нахождение эйлерова цикла",
|
||||||
|
content:
|
||||||
|
"После любых действий над вершинами или ребрами, программа проверяет наличие эйлерова цикла. Если эйлеров цикл будет найден, то:<ul><li>В верхней части программы появится количество шагов цикла и текущий шаг.</li><li>В правой части программы появится последовательность вершин в эйлеровом цикле.</li><li>Станет доступна кнопка проигрывания анимации прохождения цикла по графу.</li>",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Элементы управления анимацией",
|
||||||
|
content:
|
||||||
|
"Когда эйлеров цикл будет найден, появится возможность проиграть анимацию прохождения цикла по графу. Для этого существуют элементы управления в нижней части программы. Также анимацию можно просмотреть, начиная с нужной вершины, кликнув на нужную вершину в правой панели программы.",
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div class="popup-el popup-text">
|
<div class="popup-el popup-text">
|
||||||
<slot name="content"></slot>
|
<slot name="content"></slot>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="popup-el popup-text gray">by Robonen</div> -->
|
<slot name="footer"></slot>
|
||||||
<div class="popup-el popup-button-cont">
|
<div class="popup-el popup-button-cont">
|
||||||
<div v-if="leftBtnText" class="popup-button" @click="leftBtn">
|
<div v-if="leftBtnText" class="popup-button" @click="leftBtn">
|
||||||
{{ leftBtnText }}
|
{{ leftBtnText }}
|
||||||
|
|||||||
@@ -6,11 +6,33 @@
|
|||||||
<span class="version">v0.2</span>
|
<span class="version">v0.2</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:content>
|
<template v-slot:content>
|
||||||
|
<p>Алгоритм находит Эйлеров цикл в неориентированном графе.</p>
|
||||||
<p>
|
<p>
|
||||||
<b>Эйлеров цикл</b>
|
Перед запуском алгоритма необходимо проверить граф на эйлеровость, т.е.
|
||||||
— путь, проходящий по всем ребрам графа, и при этом только по
|
каждая вершина должна иметь четную степень. Чтобы построить Эйлеров
|
||||||
одному разу.
|
цикл, нужно запустить алгоритм из любой вершины.
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
Алгоритм напоминает поиск в глубину. Главное отличие состоит в том, что
|
||||||
|
пройденными помечаются не вершины, а ребра графа.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Начиная со стартовой вершины <b>v</b> строим путь, добавляя на каждом
|
||||||
|
шаге не пройденное еще ребро, смежное с текущей вершиной. Вершины пути
|
||||||
|
накапливаются в стеке <b>S</b>. Когда наступает такой момент, что для
|
||||||
|
текущей вершины <b>w</b> все инцидентные ей ребра уже пройдены,
|
||||||
|
записываем вершины из <b>S</b> в ответ, пока не встретим вершину,
|
||||||
|
которой инцидентны не пройденные еще ребра. Далее продолжаем обход по не
|
||||||
|
посещенным ребрам.
|
||||||
|
</p>
|
||||||
|
</template>
|
||||||
|
<template v-slot:footer>
|
||||||
|
<a href="https://github.com/robonen/" class="gray">
|
||||||
|
<div class="popup-el popup-text">Автор — Робонен А.С.</div>
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/RomaFedoro" class="gray">
|
||||||
|
<div class="popup-el popup-text">Дизайн — Фёдоров Р.М.</div>
|
||||||
|
</a>
|
||||||
</template>
|
</template>
|
||||||
</popup>
|
</popup>
|
||||||
<div class="addition-cont menu">
|
<div class="addition-cont menu">
|
||||||
@@ -90,14 +112,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="addition-cont">
|
<transition name="fade-left">
|
||||||
<div v-if="stepExists" class="step-cont">
|
<div v-if="stepExists" class="addition-cont">
|
||||||
|
<div class="step-cont">
|
||||||
<div
|
<div
|
||||||
class="step"
|
class="step"
|
||||||
v-for="(step, i) in steps"
|
v-for="(step, i) in steps"
|
||||||
:key="i"
|
:key="i"
|
||||||
:class="{
|
:class="{
|
||||||
'active-step': i === currentStepNumber || i === currentStepNumber + 1,
|
'active-step':
|
||||||
|
i === currentStepNumber || i === currentStepNumber + 1,
|
||||||
'dynamic-active-step': played && i < currentStepNumber,
|
'dynamic-active-step': played && i < currentStepNumber,
|
||||||
'last-active-step': i === currentStepNumber + 1,
|
'last-active-step': i === currentStepNumber + 1,
|
||||||
}"
|
}"
|
||||||
@@ -107,6 +131,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</transition>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
Reference in New Issue
Block a user