-
Notifications
You must be signed in to change notification settings - Fork 0
/
hilber_curve_2.js
97 lines (70 loc) · 1.51 KB
/
hilber_curve_2.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//////////////////////////////////////////////////
elem = document.getElementById("container");
setCanvas(elem);
w = WIDTH;
h = HEIGHT;
fetch_mouse_pos(elem, "mousemove");
//////////////////////////////////////////////////
// Hilbert curve
order=5;
N= 2**order;
total= N * N;
// first order hilbert curve
function hilbert(i){
points=[
createVector(0,0),
createVector(0,1),
createVector(1,1),
createVector(1,0),
];
index=i & 3;
v = points[index];
for(j=1;j<order;j++){
i=i>>>2;
index=i & 3;
l = 2**j;
if(index==0){
//do nothing
temp=v.x;
v.x=v.y;
v.y=temp;
}
else if(index ==1){
v.y+=l;
}
else if(index ==2){
v.x+=l;
v.y+=l;
}
else if(index ==3){
temp= l- 1 - v.x;
v.x= l-1 - v.y;
v.y= temp;
v.x+=l;
}
}
return v;
}
//make array
hilbert_points=[];
hilbert_points_array=[];
len = w/N;
for(i=0; i<total; i++){
hilbert_points.push(multiplyVec(hilbert(i), len));
hilbert_points_array.push([hilbert_points[i].x+len/2 , hilbert_points[i].y+len/2]);
}
t=1;
function draw() {
clearCanvas();
for(i=0; i<t-1; i++){
c = lerpHex("#8fa1f7", "#691796",i/t);
new line(hilbert_points_array[i][0],hilbert_points_array[i][1],hilbert_points_array[i+1][0],hilbert_points_array[i+1][1],c,10,"round");
}
if(t<total){
t+=1;
requestAnimationFrame(draw);
}
}
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
draw();