Skip to content

Commit 787fd66

Browse files
author
Carlos Martin
committed
Moved math helper functions for hyperbolic space to mathlib.js
1 parent 7d9a5a2 commit 787fd66

File tree

3 files changed

+106
-122
lines changed

3 files changed

+106
-122
lines changed

hyperbolic/hyperbolic.html

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<!DOCTYPE html>
22
<html>
33
<body>
4+
<script src="mathlib.js"></script>
45
<script src="hyperbolic.js"></script>
56
</body>
67
</html>

hyperbolic/hyperbolic.js

-122
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,3 @@
1-
var dimensions = 2;
2-
3-
/* Returns the sum of two vectors */
4-
function sum(vector1, vector2) {
5-
var result = [];
6-
for (var i = 0; i < dimensions; ++i) {
7-
result[i] = vector1[i] + vector2[i];
8-
}
9-
return result;
10-
}
11-
12-
/* Returns the difference of two vectors */
13-
function difference(vector1, vector2) {
14-
return sum(vector1, scale(vector2, -1));
15-
}
16-
17-
/* Returns the metric tensor */
18-
function get_metric(position) {
19-
var factor = 1;
20-
for (var i = 0; i < dimensions; ++i) {
21-
factor -= position[i] * position[i];
22-
}
23-
24-
var result = [];
25-
for (var i = 0; i < dimensions; ++i) {
26-
result[i] = [];
27-
for (var j = 0; j < dimensions; ++j) {
28-
if (i == j) {
29-
result[i][j] = 1/(factor * factor);
30-
} else {
31-
result[i][j] = 0;
32-
}
33-
}
34-
}
35-
return result;
36-
}
37-
38-
/* Returns the connection coefficients (Christoffel symbols) */
39-
function get_connection(position) {
40-
var factor = 1;
41-
for (var i = 0; i < dimensions; ++i) {
42-
factor -= position[i] * position[i];
43-
}
44-
45-
var result = [];
46-
for (var i = 0; i < dimensions; ++i) {
47-
result[i] = [];
48-
for (var j = 0; j < dimensions; ++j) {
49-
result[i][j] = [];
50-
for (var k = 0; k < dimensions; ++k) {
51-
result[i][j][k] = 0;
52-
if (i == k) result[i][j][k] += position[j];
53-
if (i == j) result[i][j][k] += position[k];
54-
if (j == k) result[i][j][k] -= position[i];
55-
result[i][j][k] *= 2/factor;
56-
}
57-
}
58-
}
59-
return result;
60-
}
61-
62-
/* Returns a raycast */
63-
function get_ray(position, velocity, steps) {
64-
var positions = [];
65-
positions[0] = position;
66-
positions[1] = sum(position, velocity);
67-
for (var step = 0; step < steps; ++step) {
68-
positions[step + 2] = [];
69-
var connection = get_connection(positions[step + 1]);
70-
for (var i = 0; i < dimensions; ++i) {
71-
positions[step + 2][i] = 2 * positions[step + 1][i] - positions[step][i];
72-
for (var j = 0; j < dimensions; ++j) {
73-
for (var k = 0; k < dimensions; ++k) {
74-
positions[step + 2][i] -= connection[i][j][k] * (positions[step + 1][j] - positions[step][j]) * (positions[step + 1][k] - positions[step][k]);
75-
}
76-
}
77-
}
78-
}
79-
return positions;
80-
}
81-
82-
/* Returns the product of a vector and a scalar */
83-
function scale(vector, scalar) {
84-
var result = [];
85-
for (var i = 0; i < dimensions; ++i) {
86-
result[i] = vector[i] * scalar;
87-
}
88-
return result;
89-
}
90-
91-
/* Returns the inner product of two vectors */
92-
function inner(vector1, vector2, metric) {
93-
var result = 0;
94-
for (var i = 0; i < dimensions; ++i) {
95-
for (var j = 0; j < dimensions; ++j) {
96-
result += metric[i][j] * vector1[i] * vector2[j];
97-
}
98-
}
99-
return result;
100-
}
101-
102-
/* Returns the norm of a vector */
103-
function norm(vector, metric) {
104-
return Math.sqrt(inner(vector, vector, metric));
105-
}
106-
107-
108-
109-
110-
111-
112-
113-
114-
115-
116-
117-
118-
119-
120-
121-
122-
1231
var canvas = document.createElement('canvas');
1242
canvas.width = 500;
1253
canvas.height = 500;

hyperbolic/mathlib.js

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
var dimensions = 2;
2+
3+
/* Returns the sum of two vectors */
4+
function sum(vector1, vector2) {
5+
var result = [];
6+
for (var i = 0; i < dimensions; ++i) {
7+
result[i] = vector1[i] + vector2[i];
8+
}
9+
return result;
10+
}
11+
12+
/* Returns the difference of two vectors */
13+
function difference(vector1, vector2) {
14+
return sum(vector1, scale(vector2, -1));
15+
}
16+
17+
/* Returns the metric tensor */
18+
function get_metric(position) {
19+
var factor = 1;
20+
for (var i = 0; i < dimensions; ++i) {
21+
factor -= position[i] * position[i];
22+
}
23+
24+
var result = [];
25+
for (var i = 0; i < dimensions; ++i) {
26+
result[i] = [];
27+
for (var j = 0; j < dimensions; ++j) {
28+
if (i == j) {
29+
result[i][j] = 1/(factor * factor);
30+
} else {
31+
result[i][j] = 0;
32+
}
33+
}
34+
}
35+
return result;
36+
}
37+
38+
/* Returns the connection coefficients (Christoffel symbols) */
39+
function get_connection(position) {
40+
var factor = 1;
41+
for (var i = 0; i < dimensions; ++i) {
42+
factor -= position[i] * position[i];
43+
}
44+
45+
var result = [];
46+
for (var i = 0; i < dimensions; ++i) {
47+
result[i] = [];
48+
for (var j = 0; j < dimensions; ++j) {
49+
result[i][j] = [];
50+
for (var k = 0; k < dimensions; ++k) {
51+
result[i][j][k] = 0;
52+
if (i == k) result[i][j][k] += position[j];
53+
if (i == j) result[i][j][k] += position[k];
54+
if (j == k) result[i][j][k] -= position[i];
55+
result[i][j][k] *= 2/factor;
56+
}
57+
}
58+
}
59+
return result;
60+
}
61+
62+
/* Returns a raycast */
63+
function get_ray(position, velocity, steps) {
64+
var positions = [];
65+
positions[0] = position;
66+
positions[1] = sum(position, velocity);
67+
for (var step = 0; step < steps; ++step) {
68+
positions[step + 2] = [];
69+
var connection = get_connection(positions[step + 1]);
70+
for (var i = 0; i < dimensions; ++i) {
71+
positions[step + 2][i] = 2 * positions[step + 1][i] - positions[step][i];
72+
for (var j = 0; j < dimensions; ++j) {
73+
for (var k = 0; k < dimensions; ++k) {
74+
positions[step + 2][i] -= connection[i][j][k] * (positions[step + 1][j] - positions[step][j]) * (positions[step + 1][k] - positions[step][k]);
75+
}
76+
}
77+
}
78+
}
79+
return positions;
80+
}
81+
82+
/* Returns the product of a vector and a scalar */
83+
function scale(vector, scalar) {
84+
var result = [];
85+
for (var i = 0; i < dimensions; ++i) {
86+
result[i] = vector[i] * scalar;
87+
}
88+
return result;
89+
}
90+
91+
/* Returns the inner product of two vectors */
92+
function inner(vector1, vector2, metric) {
93+
var result = 0;
94+
for (var i = 0; i < dimensions; ++i) {
95+
for (var j = 0; j < dimensions; ++j) {
96+
result += metric[i][j] * vector1[i] * vector2[j];
97+
}
98+
}
99+
return result;
100+
}
101+
102+
/* Returns the norm of a vector */
103+
function norm(vector, metric) {
104+
return Math.sqrt(inner(vector, vector, metric));
105+
}

0 commit comments

Comments
 (0)