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