summaryrefslogtreecommitdiff
path: root/js/hypersphere.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/hypersphere.js')
-rw-r--r--js/hypersphere.js131
1 files changed, 131 insertions, 0 deletions
diff --git a/js/hypersphere.js b/js/hypersphere.js
new file mode 100644
index 0000000..d34a74d
--- /dev/null
+++ b/js/hypersphere.js
@@ -0,0 +1,131 @@
+var WIDTH = 500;
+var HEIGHT = 500;
+
+var z_angle = 4*Math.PI/9;
+var w_angle = 2*Math.PI/3;
+var matrix = [[Math.cos(0), Math.sin(0)], [Math.cos(2*Math.PI/9), Math.sin(2*Math.PI/9)], [Math.cos(z_angle), Math.sin(z_angle)], [Math.cos(w_angle), Math.sin(w_angle)]];
+
+
+var quality = 5;
+var speed = 0.2;
+
+var coordinatesSize = 4;
+var topLeft = [-coordinatesSize/2, +coordinatesSize/2];
+var topRight = [+coordinatesSize/2, +coordinatesSize/2];
+var bottomLeft = [-coordinatesSize/2, -coordinatesSize/2];
+var bottomRight = [+coordinatesSize/2, -coordinatesSize/2];
+
+var origin;
+
+$(function()
+{
+ $("#chq").click(function()
+ {
+ quality = $("#quality").val();
+ })
+})
+
+function convertCoordinates(coords)
+{
+ var x = map(coords[0], topLeft[0], topRight[0], 0, width);
+ var y = map(coords[1], topLeft[1], bottomLeft[1], 0, width);
+
+ return [x, y];
+}
+
+function transform(vector)
+{
+ var ans = [];
+ for (var i = 0; i < matrix[0].length; i++)
+ {
+ ans.push(0);
+ }
+ for (var i = 0; i < matrix.length; i++)
+ {
+ for (var j = 0; j < matrix[i].length; j++)
+ {
+ ans[j] += vector[i] * matrix[i][j];
+ }
+ }
+ return convertCoordinates(ans);
+}
+
+function pointOnSphere(r,s,t)
+{
+ var x = r * Math.cos(s) * Math.sin(t);
+ var y = r * Math.sin(s) * Math.sin(t);
+ var z = r * Math.cos(t);
+ return [x,y,z];
+}
+
+function pointOnHyperSphere(r,s,t,u)
+{
+ var x = r * Math.cos(s);
+ var y = r * Math.sin(s) * Math.cos(t);
+ var z = r * Math.sin(s) * Math.sin(t) * Math.cos(u);
+ var w = r * Math.sin(s) * Math.sin(t) * Math.sin(u);
+ return [x,y,z,w];
+}
+
+function setup()
+{
+ createCanvas(500, 500);
+ origin = [width/2, height/2];
+}
+
+function draw()
+{
+ background(255);
+ ellipseMode(CENTER);
+ var xVal = map(mouseX, 0, width, 0, 2*Math.PI);
+ matrix[0] = [Math.cos(xVal), Math.sin(xVal)];
+ var yVal = map(mouseY, 0, height, 0, 2*Math.PI);
+ matrix[1] = [Math.cos(yVal), Math.sin(yVal)];
+ if (keyIsDown(LEFT_ARROW))
+ {
+ z_angle -= speed;
+ }
+ if (keyIsDown(RIGHT_ARROW))
+ {
+ z_angle += speed;
+ }
+ if (keyIsDown(DOWN_ARROW))
+ {
+ w_angle -= speed;
+ }
+ if (keyIsDown(UP_ARROW))
+ {
+ w_angle += speed;
+ }
+
+ matrix[2] = [Math.cos(z_angle), Math.sin(z_angle)];
+ matrix[3] = [Math.cos(w_angle), Math.sin(w_angle)];
+ var i_hat = convertCoordinates(matrix[0]);
+ var j_hat = convertCoordinates(matrix[1]);
+ var k_hat = convertCoordinates(matrix[2]);
+ var l_hat = convertCoordinates(matrix[3]);
+ strokeWeight(2);
+ stroke(255, 0, 0);
+ line(origin[0], origin[1], i_hat[0], i_hat[1]);
+ stroke(0, 255, 0);
+ line(origin[0], origin[1], j_hat[0], j_hat[1]);
+ stroke(0, 0, 255);
+ line(origin[0], origin[1], k_hat[0], k_hat[1]);
+ stroke(0, 255, 255);
+ line(origin[0], origin[1], l_hat[0], l_hat[1]);
+ fill(157, 0, 255);
+ noStroke();
+ for (var s = 0; s < 2*Math.PI; s += 1/quality)
+ {
+ for (var t = 0; t < 2*Math.PI; t += 1/quality)
+ {
+ for (var u = 0; u < 2*Math.PI; u += 1/quality)
+ {
+ var transformed = transform(pointOnHyperSphere(1, s, t, u));
+ ellipse(transformed[0], transformed[1], 1, 1);
+ }
+ }
+ }
+
+
+}