Skip to content

Commit cd48c9f

Browse files
committed
Complete Disjoint-set data structure.
1 parent 958e916 commit cd48c9f

File tree

2 files changed

+174
-0
lines changed

2 files changed

+174
-0
lines changed

mazes/maze.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Mazes</title>
5+
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.6/p5.min.js"></script>
6+
<script type="text/javascript" src="maze.js"></script>
7+
</head>
8+
<body>
9+
</body>
10+
</html>

mazes/maze.js

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
var squareSide = 20;
2+
var columns = 3;
3+
var rows = 3;
4+
var canvasWidth = columns * squareSide;
5+
var canvasHeight = rows * squareSide;
6+
7+
var edges = [];
8+
var vertices = [];
9+
10+
function setup(){
11+
generateEdges();
12+
generateVertices();
13+
createCanvas(canvasWidth, canvasHeight);
14+
}
15+
16+
function draw(){
17+
background(255);
18+
drawEdges();
19+
drawWalls();
20+
drawVertices();
21+
}
22+
23+
// Undirected edge:
24+
// v1: (x1, y1)
25+
// v2: (x2, y2)
26+
function generateEdges(){
27+
for(var i = 0; i < columns - 1; i++){
28+
for(var j = 0; j < rows; j++){
29+
var edge = {
30+
v1: [i, j],
31+
v2: [i + 1, j]
32+
}
33+
edges.push(edge);
34+
}
35+
}
36+
37+
for(var i = 0; i < columns; i++){
38+
for(var j = 0; j < rows - 1; j++){
39+
var edge = {
40+
v1: [i, j],
41+
v2: [i, j + 1]
42+
}
43+
edges.push(edge);
44+
}
45+
}
46+
}
47+
48+
// Vertex
49+
// parent: vertex
50+
// rank: integer
51+
// c: (x, y)
52+
// Position in array = columns * y + x
53+
function generateVertices(){
54+
for(var i = 0; i < columns; i++){
55+
for(var j = 0; j < rows; j++){
56+
var vertex = {
57+
rank: 0,
58+
c: [i, j],
59+
drawn: true
60+
}
61+
vertex.parent = vertex;
62+
vertices.push(vertex);
63+
}
64+
}
65+
}
66+
67+
// Merges two sets together
68+
// Returns false, if x, y are in the same set already
69+
function union(x, y){
70+
var xRoot = find(x);
71+
var yRoot = find(y);
72+
73+
// If x, y are already in the same set
74+
if(xRoot == yRoot){
75+
return false;
76+
}
77+
x.drawn = false;
78+
y.drawn = false;
79+
if(xRoot.rank < yRoot.rank){
80+
xRoot.parent = yRoot;
81+
}else if(yRoot.rank < xRoot.rank){
82+
yRoot.parent = xRoot;
83+
}else{
84+
yRoot.parent = xRoot;
85+
xRoot.rank += 1;
86+
}
87+
return true;
88+
}
89+
90+
// Given a vertex x, finds the root of x's tree
91+
function find(x){
92+
var xRoot = x;
93+
while(xRoot.parent != xRoot){
94+
xRoot = xRoot.parent;
95+
}
96+
return xRoot;
97+
}
98+
99+
// Removes an edge between two distinct vertices
100+
function removeEdge(index){
101+
var edge = edges[index];
102+
var x = getVertex(edge.v1[0], edge.v1[1]);
103+
var y = getVertex(edge.v2[0], edge.v2[1]);
104+
var removed = union(x, y);
105+
if(removed) edges[index] = null;
106+
}
107+
108+
// Returns the vertex at column c, row r
109+
function getVertex(c, r){
110+
return vertices[rows*c + r];
111+
}
112+
113+
function drawVertices(){
114+
fill(0);
115+
for(var i = 0; i < vertices.length; i++){
116+
var vertex = vertices[i];
117+
if(vertex.drawn == true){
118+
rect(vertex.c[0] * squareSide, vertex.c[1] * squareSide, squareSide, squareSide);
119+
}
120+
}
121+
}
122+
123+
function drawWalls(){
124+
stroke(0, 0, 0);
125+
126+
// Draw Horizontal Lines
127+
for(var i = 0; i < columns; i++){
128+
line(i * squareSide, 0, (i + 1)*squareSide, 0);
129+
line(i * squareSide, canvasHeight - 1, (i + 1)*squareSide, canvasHeight - 1);
130+
}
131+
132+
// Draw Vertical Lines
133+
for(var i = 0; i < rows; i++){
134+
line(0, i * squareSide, 0, (i + 1)*squareSide);
135+
line(canvasWidth - 1, i * squareSide, canvasWidth - 1, (i + 1)*squareSide);
136+
}
137+
}
138+
139+
function drawEdges(){
140+
for(var i = 0; i < edges.length; i++){
141+
// drawEdge(edges[i]);
142+
if(edges[i] != null) drawEdge(edges[i]);
143+
}
144+
}
145+
146+
function drawEdge(edge){
147+
var dx = edge.v2[0] - edge.v1[0];
148+
var x1, y1, x2, y2;
149+
150+
if(dx == 1){ // If edge connects two vertices horizontally
151+
x1 = (edge.v1[0] + 1) * squareSide;
152+
y1 = (edge.v1[1]) * squareSide;
153+
x2 = x1;
154+
y2 = y1 + squareSide;
155+
}else{ // If edge connects two vertices vertically
156+
x1 = (edge.v1[0]) * squareSide;
157+
y1 = (edge.v1[1] + 1) * squareSide;
158+
x2 = x1 + squareSide;
159+
y2 = y1;
160+
}
161+
// console.log(x1, y1, x2, y2);
162+
stroke(0, 0, 0);
163+
line(x1, y1, x2, y2);
164+
}

0 commit comments

Comments
 (0)