Skip to content

Commit 30447d7

Browse files
authored
Merge pull request #52 from tpSpace/quang
Resolve issue #49
2 parents 138da53 + cca2589 commit 30447d7

File tree

8 files changed

+132
-90
lines changed

8 files changed

+132
-90
lines changed

dest/graph/code/main.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1111
};
1212
// ts-check
1313
// constants
14-
import getAdjacencyList from './pathFindingAlgorithms/utility.js';
15-
import { getEndNode } from "./pathFindingAlgorithms/utility.js";
16-
import { getSourceNode } from "./pathFindingAlgorithms/utility.js";
17-
import { getNodeXCoordinates } from "./pathFindingAlgorithms/utility.js";
18-
import { getNodeYCoordinates } from "./pathFindingAlgorithms/utility.js";
19-
import getShortestDistanceBFS from "./pathFindingAlgorithms/bfs.js";
14+
import getAdjacencyList from '../code/pathFindingAlgorithms/utility.js';
15+
import { getEndNode, getSourceNode, getNodeXCoordinates, getNodeYCoordinates } from "./pathFindingAlgorithms/utility.js";
16+
import { getShortestDistanceBFS } from "./pathFindingAlgorithms/bfs.js";
2017
import { getPathDFS } from "./pathFindingAlgorithms/dfs.js";
21-
import createText from './popup.js';
18+
import createText from "./popup.js";
2219
const canvas = document.getElementById('canvas');
2320
const ctx = canvas.getContext('2d');
2421
const clear = document.getElementById('clear');
Lines changed: 57 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,68 @@
1+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3+
return new (P || (P = Promise))(function (resolve, reject) {
4+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7+
step((generator = generator.apply(thisArg, _arguments || [])).next());
8+
});
9+
};
110
//BFS algorithm
211
import { initPath } from "../main.js";
312
import { initPrevPath } from "../main.js";
13+
import { delayRender } from "./utility.js";
414
//Helper function that uses BFS to transverse the graph
515
export function bfs(adj, src, dest, v, prev, dist) {
6-
let queue = [];
7-
let visited = new Array(v);
8-
for (let i = 0; i < v; i++) {
9-
visited[i] = false;
10-
dist[i] = Number.MAX_VALUE;
11-
prev[i] = -1;
12-
}
13-
visited[src] = true;
14-
dist[src] = 0;
15-
queue.push(src);
16-
while (queue.length > 0) {
17-
let u = queue[0];
18-
queue.shift();
19-
for (let i in adj[u]) {
20-
if (visited[adj[u][i]] == false) {
21-
visited[adj[u][i]] = true;
22-
dist[adj[u][i]] = dist[u] + 1;
23-
prev[adj[u][i]] = u;
24-
queue.push(adj[u][i]);
25-
initPrevPath(adj[u][i]);
26-
if (adj[u][i] == dest) {
27-
return true;
16+
return __awaiter(this, void 0, void 0, function* () {
17+
let queue = [];
18+
let visited = new Array(v);
19+
for (let i = 0; i < v; i++) {
20+
visited[i] = false;
21+
dist[i] = Number.MAX_VALUE;
22+
prev[i] = -1;
23+
}
24+
visited[src] = true;
25+
dist[src] = 0;
26+
queue.push(src);
27+
while (queue.length > 0) {
28+
let u = queue[0];
29+
queue.shift();
30+
for (let i in adj[u]) {
31+
if (visited[adj[u][i]] == false) {
32+
visited[adj[u][i]] = true;
33+
dist[adj[u][i]] = dist[u] + 1;
34+
prev[adj[u][i]] = u;
35+
queue.push(adj[u][i]);
36+
initPrevPath(adj[u][i]);
37+
yield delayRender(10);
38+
if (adj[u][i] == dest) {
39+
return true;
40+
}
2841
}
2942
}
3043
}
31-
}
32-
return false;
44+
return false;
45+
});
3346
}
3447
//Helper function to backtrack the path and print the shortest path
35-
export default function getShortestDistanceBFS(adj, src, dest) {
36-
let v = adj.length;
37-
let prev = new Array(v).fill(0);
38-
let dist = new Array(v).fill(0);
39-
if (!bfs(adj, src, dest, v, prev, dist)) {
40-
alert('Source and destination vertex is not connected!');
41-
}
42-
let path = [];
43-
let crawl = dest;
44-
path.push(crawl);
45-
while (prev[crawl] != -1) {
46-
path.push(prev[crawl]);
47-
crawl = prev[crawl];
48-
}
49-
for (let i = path.length - 1; i >= 0; i--)
50-
initPath(path[i]);
48+
export function getShortestDistanceBFS(adj, src, dest) {
49+
return __awaiter(this, void 0, void 0, function* () {
50+
let v = adj.length;
51+
let prev = new Array(v).fill(0);
52+
let dist = new Array(v).fill(0);
53+
if (!(yield bfs(adj, src, dest, v, prev, dist))) {
54+
alert('Source and destination vertex is not connected!');
55+
}
56+
let path = [];
57+
let crawl = dest;
58+
path.push(crawl);
59+
while (prev[crawl] != -1) {
60+
path.push(prev[crawl]);
61+
crawl = prev[crawl];
62+
}
63+
for (let i = path.length - 1; i >= 0; i--) {
64+
yield delayRender(80);
65+
initPath(path[i]);
66+
}
67+
});
5168
}
Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,49 @@
1+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3+
return new (P || (P = Promise))(function (resolve, reject) {
4+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7+
step((generator = generator.apply(thisArg, _arguments || [])).next());
8+
});
9+
};
110
import { initPath } from "../main.js";
11+
import { delayRender } from "./utility.js";
212
export function drawPath(stack) {
3-
for (let i in stack) {
4-
initPath(stack[i]);
5-
}
13+
return __awaiter(this, void 0, void 0, function* () {
14+
for (let i in stack) {
15+
initPath(stack[i]);
16+
yield delayRender(10);
17+
}
18+
});
619
}
720
export function DFS(visited, adjList, source, destination, stack) {
8-
visited[source] = true;
9-
stack.push(source);
10-
if (source == destination) {
11-
drawPath(stack);
12-
return;
13-
}
14-
for (let i in adjList[source]) {
15-
if (!visited[adjList[source][i]]) {
16-
DFS(visited, adjList, adjList[source][i], destination, stack);
21+
return __awaiter(this, void 0, void 0, function* () {
22+
visited[source] = true;
23+
stack.push(source);
24+
if (source == destination) {
25+
yield drawPath(stack);
26+
return;
27+
}
28+
for (let i in adjList[source]) {
29+
if (!visited[adjList[source][i]]) {
30+
yield DFS(visited, adjList, adjList[source][i], destination, stack);
31+
}
1732
}
18-
}
19-
stack.pop();
33+
stack.pop();
34+
});
2035
}
2136
export function getPathDFS(adjList, source, destination) {
22-
let n = adjList.length;
23-
let visited = new Array(n + 1);
24-
let stack = [];
25-
for (let i = 0; i < n + 1; i++) {
26-
visited[i] = false;
27-
}
28-
DFS(visited, adjList, source, destination, stack);
29-
if (stack.length === 0) {
30-
alert("No path found!");
31-
}
37+
return __awaiter(this, void 0, void 0, function* () {
38+
let n = adjList.length;
39+
let visited = new Array(n + 1);
40+
let stack = [];
41+
for (let i = 0; i < n + 1; i++) {
42+
visited[i] = false;
43+
}
44+
yield DFS(visited, adjList, source, destination, stack);
45+
if (stack.length === 0) {
46+
alert("No path found!");
47+
}
48+
});
3249
}

dest/graph/code/pathFindingAlgorithms/utility.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ export function getNodeYCoordinates(v) {
104104
}
105105
return -1;
106106
}
107+
export function delayRender(ms) {
108+
return new Promise(resolve => setTimeout(resolve, ms));
109+
}
107110
// let graph: string[][] = [
108111
// ['#', '#', '#', '#', '#'],
109112
// ['#', 'A', '.', '.', '#'],

src/graph/code/main.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@
44
// ts-check
55
// constants
66

7-
import getAdjacencyList from './pathFindingAlgorithms/utility.js';
8-
import {getEndNode} from "./pathFindingAlgorithms/utility.js";
9-
import {getSourceNode} from "./pathFindingAlgorithms/utility.js";
10-
import {getNodeXCoordinates} from "./pathFindingAlgorithms/utility.js";
11-
import {getNodeYCoordinates} from "./pathFindingAlgorithms/utility.js";
12-
import getShortestDistanceBFS from "./pathFindingAlgorithms/bfs.js";
7+
import getAdjacencyList from '../code/pathFindingAlgorithms/utility.js';
8+
import {getEndNode, getSourceNode, getNodeXCoordinates, getNodeYCoordinates} from "./pathFindingAlgorithms/utility.js";
9+
import {getShortestDistanceBFS} from "./pathFindingAlgorithms/bfs.js";
1310
import {getPathDFS} from "./pathFindingAlgorithms/dfs.js";
14-
import createText from './popup.js';
11+
import createText from "./popup.js";
1512

1613
const canvas = document.getElementById('canvas') as HTMLCanvasElement;
1714
const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
@@ -313,7 +310,7 @@ start.addEventListener('click', ()=>{
313310
if (selectedAlgorithm !== '') {
314311
switch (selectedAlgorithm) {
315312
case 'bfs': {
316-
getShortestDistanceBFS(adjList, startNode, endNode);matrix[prevStart[0]][prevStart[1]] = 1;
313+
getShortestDistanceBFS(adjList, startNode, endNode);matrix[prevStart[0]][prevStart[1]] = 1;
317314
break;
318315
}
319316
case 'dfs': {
@@ -330,7 +327,7 @@ start.addEventListener('click', ()=>{
330327
createText("Please select an algorithms","red");
331328
}
332329
} else {
333-
createText('Please set the start and end point',"red");
330+
createText('Please set the start and end point',"red");
334331
}
335332
});
336333
select.addEventListener('change', (event)=>{

src/graph/code/pathFindingAlgorithms/bfs.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
//BFS algorithm
22
import {initPath} from "../main.js";
33
import {initPrevPath} from "../main.js";
4+
import {delayRender} from "./utility.js";
45

56
//Helper function that uses BFS to transverse the graph
6-
export function bfs(adj: number[][],
7+
export async function bfs(adj: number[][],
78
src: number,
89
dest: number,
910
v: number,
@@ -32,6 +33,7 @@ export function bfs(adj: number[][],
3233
prev[adj[u][i]] = u;
3334
queue.push(adj[u][i]);
3435
initPrevPath(adj[u][i]);
36+
await delayRender(10);
3537
if (adj[u][i] == dest){
3638
return true;
3739
}
@@ -41,12 +43,12 @@ export function bfs(adj: number[][],
4143
return false;
4244
}
4345
//Helper function to backtrack the path and print the shortest path
44-
export default function getShortestDistanceBFS(adj: number[][], src: number, dest: number){
46+
export async function getShortestDistanceBFS(adj: number[][], src: number, dest: number){
4547
let v = adj.length;
4648
let prev = new Array(v).fill(0);
4749
let dist = new Array(v).fill(0);
4850

49-
if (!bfs(adj, src, dest, v, prev, dist)){
51+
if (!await bfs(adj, src, dest, v, prev, dist)){
5052
alert('Source and destination vertex is not connected!');
5153
}
5254

@@ -58,6 +60,8 @@ export default function getShortestDistanceBFS(adj: number[][], src: number, des
5860
path.push(prev[crawl]);
5961
crawl = prev[crawl];
6062
}
61-
for (let i = path.length - 1; i >= 0; i--)
63+
for (let i = path.length - 1; i >= 0; i--){
64+
await delayRender(80);
6265
initPath(path[i]);
66+
}
6367
}

src/graph/code/pathFindingAlgorithms/dfs.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
import {initPath} from "../main.js";
22
import {initPrevPath} from "../main.js";
3+
import {delayRender} from "./utility.js";
34

4-
export function drawPath(stack: number[]) {
5+
6+
export async function drawPath(stack: number[]) {
57
for(let i in stack) {
68
initPath(stack[i]);
9+
await delayRender(10);
710
}
811
}
912

10-
export function DFS(visited: boolean[],
13+
export async function DFS(visited: boolean[],
1114
adjList: number[][],
1215
source: number,
1316
destination: number,
@@ -16,19 +19,19 @@ export function DFS(visited: boolean[],
1619
stack.push(source);
1720

1821
if (source == destination) {
19-
drawPath(stack);
22+
await drawPath(stack);
2023
return;
2124
}
2225

2326
for (let i in adjList[source]) {
2427
if (!visited[adjList[source][i]]) {
25-
DFS(visited, adjList, adjList[source][i], destination, stack);
28+
await DFS(visited, adjList, adjList[source][i], destination, stack);
2629
}
2730
}
2831
stack.pop();
2932
}
3033

31-
export function getPathDFS(adjList: number[][], source: number, destination: number) {
34+
export async function getPathDFS(adjList: number[][], source: number, destination: number) {
3235
let n = adjList.length;
3336
let visited: boolean[] = new Array(n + 1);
3437
let stack: number[] = [];
@@ -37,7 +40,7 @@ export function getPathDFS(adjList: number[][], source: number, destination: num
3740
visited[i] = false;
3841
}
3942

40-
DFS(visited, adjList, source, destination, stack);
43+
await DFS(visited, adjList, source, destination, stack);
4144

4245
if (stack.length === 0) {
4346
alert("No path found!");

src/graph/code/pathFindingAlgorithms/utility.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ export function getNodeYCoordinates(v: number): number{
114114
return -1;
115115
}
116116

117+
export function delayRender(ms: number) {
118+
return new Promise(resolve => setTimeout(resolve, ms));
119+
}
120+
117121

118122
// let graph: string[][] = [
119123
// ['#', '#', '#', '#', '#'],

0 commit comments

Comments
 (0)