Anders and Briegel in Python
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
5.6KB

  1. // IE9
  2. if (typeof console === "undefined") {
  3. var console = {
  4. log: function(logMsg) {}
  5. };
  6. }
  7. var controls, renderer, raycaster, scene, info, nodeGeometry, selection;
  8. var mouse = {
  9. "x": 0,
  10. "y": 0
  11. };
  12. var materials = {};
  13. var curveProperties = {
  14. splineDensity: 30,
  15. curvature: 10
  16. };
  17. var camera;
  18. // Run on startup
  19. window.onload = init;
  20. // Add a curved edge between two points
  21. function makeEdge(e) {
  22. // Make the geometry of the curve
  23. var a = new THREE.Vector3(e.start[0], e.start[1], e.start[2]);
  24. var b = new THREE.Vector3(e.end[0], e.end[1], e.end[2]);
  25. var length = new THREE.Vector3().subVectors(a, b).length();
  26. var bend = new THREE.Vector3(length / curveProperties.curvature, length / curveProperties.curvature, 0);
  27. var mid = new THREE.Vector3().add(a).add(b).multiplyScalar(0.5).add(bend);
  28. var spline = new THREE.CatmullRomCurve3([a, mid, b]);
  29. var geometry = new THREE.Geometry();
  30. var splinePoints = spline.getPoints(curveProperties.splineDensity);
  31. Array.prototype.push.apply(geometry.vertices, splinePoints);
  32. // Make the actual Object3d thing
  33. var line = new THREE.Line(geometry, materials.edge);
  34. return line;
  35. }
  36. // Clear the whole scene
  37. function makeScene() {
  38. // Scene, controls, camera and so on
  39. var myScene = new THREE.Scene();
  40. // Materials
  41. var lineStyle = {
  42. color: "gray",
  43. transparent: false,
  44. linewidth: 1
  45. };
  46. materials.edge = new THREE.LineBasicMaterial(lineStyle);
  47. var pointStyle = {
  48. size: 0.2,
  49. map: materials.sprite,
  50. alphaTest: 0.5,
  51. transparent: true,
  52. vertexColors: THREE.VertexColors
  53. };
  54. materials.point = new THREE.PointsMaterial(pointStyle);
  55. // Build all the edges
  56. //var edgeGroup = new THREE.Object3D();
  57. // Build all the nodes
  58. nodeGeometry = new THREE.Geometry();
  59. nodeGeometry.labels = [];
  60. nodeGeometry.colors = [];
  61. for (var i = 0; i < 10; ++i) {
  62. for (var j = 0; j < 10; ++j) {
  63. var vertex = new THREE.Vector3(i - 5, j - 5, 0);
  64. nodeGeometry.vertices.push(vertex);
  65. nodeGeometry.colors.push(new THREE.Color(0.5, 0.5, 0.5));
  66. nodeGeometry.labels.push("Click to add a qubit at (" + i + ", " + j + ")");
  67. }
  68. }
  69. var particles = new THREE.Points(nodeGeometry, materials.point);
  70. var grid = makeGrid(10, 10, "lightgray");
  71. myScene.add(grid);
  72. // Add the above stuff into the scene and return
  73. //myScene.add(edgeGroup);
  74. myScene.add(particles);
  75. return myScene;
  76. }
  77. // Gets a reference to the node nearest to the mouse cursor
  78. function nearestNode() {
  79. raycaster.setFromCamera(mouse, camera);
  80. for (var i = 0; i < nodeGeometry.vertices.length; ++i) {
  81. if (raycaster.ray.distanceSqToPoint(nodeGeometry.vertices[i]) < 0.01) {
  82. return i;
  83. }
  84. }
  85. return undefined;
  86. }
  87. // Find out: what is the mouse pointing at?
  88. function checkIntersections() {
  89. var new_selection = nearestNode();
  90. if (new_selection != selection) {
  91. selection = new_selection;
  92. info.className = selection ? "visible" : "hidden";
  93. info.innerHTML = selection ? nodeGeometry.labels[new_selection] : info.innerHTML;
  94. render();
  95. }
  96. }
  97. // Make a grid
  98. function makeGrid(side, n, color) {
  99. var markers = new THREE.Object3D();
  100. var gridStyle = {
  101. color: color,
  102. transparent: true,
  103. linewidth: 1,
  104. opacity: 0.5
  105. };
  106. var material = new THREE.LineBasicMaterial(gridStyle);
  107. for (var i = -n / 2; i < n / 2; ++i) {
  108. var geometry = new THREE.Geometry();
  109. geometry.vertices.push(new THREE.Vector3(side * i / n, -side / 2, 0));
  110. geometry.vertices.push(new THREE.Vector3(side * i / n, side / 2, 0));
  111. var line = new THREE.Line(geometry, material);
  112. var line90 = line.clone();
  113. line90.rotation.z = Math.PI / 2;
  114. markers.add(line);
  115. markers.add(line90);
  116. }
  117. return markers;
  118. }
  119. // Handle mouse movement
  120. function onMouseMove(event) {
  121. mouse.wasClick = false;
  122. mouse.absx = event.clientX;
  123. mouse.absy = event.clientY;
  124. mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  125. mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
  126. w = 200;
  127. h = 15;
  128. info.style.top = mouse.absy - h - 40 + "px";
  129. info.style.left = mouse.absx - w / 2 + "px";
  130. checkIntersections();
  131. }
  132. // Render the current frame to the screen
  133. function render() {
  134. renderer.render(scene, camera);
  135. }
  136. // This is the main control loop
  137. function loopForever() {
  138. controls.update();
  139. requestAnimationFrame(loopForever);
  140. }
  141. // This just organises kickoff
  142. function startMainLoop() {
  143. scene = makeScene();
  144. document.addEventListener("mousemove", onMouseMove, false);
  145. controls.addEventListener("change", render);
  146. loopForever();
  147. }
  148. // Called on startup
  149. function init() {
  150. // Measure things, get references
  151. var width = window.innerWidth;
  152. var height = window.innerHeight;
  153. info = document.getElementById("infoholder");
  154. materials.sprite = new THREE.Texture(document.getElementById("ball"));
  155. materials.sprite.needsUpdate = true;
  156. // Renderer
  157. renderer = new THREE.WebGLRenderer({
  158. antialias: true
  159. });
  160. renderer.setSize(width, height);
  161. renderer.setClearColor(0xffffff, 1);
  162. document.querySelector("body").appendChild(renderer.domElement);
  163. // Camera, controls, raycaster
  164. camera = new THREE.PerspectiveCamera(45, width / height, 0.3, 100);
  165. controls = new THREE.OrbitControls(camera);
  166. raycaster = new THREE.Raycaster();
  167. // Center the camera
  168. controls.center.set(0, 0, 0);
  169. controls.rotateSpeed = 0.2;
  170. camera.position.set(0, 0, 20);
  171. // Run
  172. startMainLoop();
  173. }