|  |  | @@ -1,14 +1,24 @@ | 
		
	
		
			
			|  |  |  | // IE9 | 
		
	
		
			
			|  |  |  | if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; } | 
		
	
		
			
			|  |  |  | if (typeof console === "undefined") { | 
		
	
		
			
			|  |  |  | var console = { | 
		
	
		
			
			|  |  |  | log: function(logMsg) {} | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | var controls, renderer, raycaster, scene, info, nodeGeometry, selection; | 
		
	
		
			
			|  |  |  | var mouse = {"x":0, "y":0}; | 
		
	
		
			
			|  |  |  | var materials={}; | 
		
	
		
			
			|  |  |  | var curveProperties = {splineDensity: 30, curvature: 10}; | 
		
	
		
			
			|  |  |  | var mouse = { | 
		
	
		
			
			|  |  |  | "x": 0, | 
		
	
		
			
			|  |  |  | "y": 0 | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | var materials = {}; | 
		
	
		
			
			|  |  |  | var curveProperties = { | 
		
	
		
			
			|  |  |  | splineDensity: 30, | 
		
	
		
			
			|  |  |  | curvature: 10 | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | var camera; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Run on startup | 
		
	
		
			
			|  |  |  | window.onload=init; | 
		
	
		
			
			|  |  |  | window.onload = init; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Add a curved edge between two points | 
		
	
		
			
			|  |  |  | function makeEdge(e) { | 
		
	
	
		
			
				|  |  | @@ -16,7 +26,7 @@ function makeEdge(e) { | 
		
	
		
			
			|  |  |  | var a = new THREE.Vector3(e.start[0], e.start[1], e.start[2]); | 
		
	
		
			
			|  |  |  | var b = new THREE.Vector3(e.end[0], e.end[1], e.end[2]); | 
		
	
		
			
			|  |  |  | var length = new THREE.Vector3().subVectors(a, b).length(); | 
		
	
		
			
			|  |  |  | var bend = new THREE.Vector3(length/curveProperties.curvature, length/curveProperties.curvature, 0); | 
		
	
		
			
			|  |  |  | var bend = new THREE.Vector3(length / curveProperties.curvature, length / curveProperties.curvature, 0); | 
		
	
		
			
			|  |  |  | var mid = new THREE.Vector3().add(a).add(b).multiplyScalar(0.5).add(bend); | 
		
	
		
			
			|  |  |  | var spline = new THREE.CatmullRomCurve3([a, mid, b]); | 
		
	
		
			
			|  |  |  | var geometry = new THREE.Geometry(); | 
		
	
	
		
			
				|  |  | @@ -29,15 +39,24 @@ function makeEdge(e) { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Clear the whole scene | 
		
	
		
			
			|  |  |  | function makeScene(){ | 
		
	
		
			
			|  |  |  | function makeScene() { | 
		
	
		
			
			|  |  |  | // Scene, controls, camera and so on | 
		
	
		
			
			|  |  |  | var myScene = new THREE.Scene(); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Materials | 
		
	
		
			
			|  |  |  | var lineStyle = {color: "gray", transparent: false, linewidth:1}; | 
		
	
		
			
			|  |  |  | var lineStyle = { | 
		
	
		
			
			|  |  |  | color: "gray", | 
		
	
		
			
			|  |  |  | transparent: false, | 
		
	
		
			
			|  |  |  | linewidth: 1 | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | materials.edge = new THREE.LineBasicMaterial(lineStyle); | 
		
	
		
			
			|  |  |  | var pointStyle = { size: 0.2, map: materials.sprite, alphaTest: 0.5, | 
		
	
		
			
			|  |  |  | transparent: true, vertexColors:THREE.VertexColors}; | 
		
	
		
			
			|  |  |  | var pointStyle = { | 
		
	
		
			
			|  |  |  | size: 0.2, | 
		
	
		
			
			|  |  |  | map: materials.sprite, | 
		
	
		
			
			|  |  |  | alphaTest: 0.5, | 
		
	
		
			
			|  |  |  | transparent: true, | 
		
	
		
			
			|  |  |  | vertexColors: THREE.VertexColors | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | materials.point = new THREE.PointsMaterial(pointStyle); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Build all the edges | 
		
	
	
		
			
				|  |  | @@ -47,9 +66,9 @@ function makeScene(){ | 
		
	
		
			
			|  |  |  | nodeGeometry = new THREE.Geometry(); | 
		
	
		
			
			|  |  |  | nodeGeometry.labels = []; | 
		
	
		
			
			|  |  |  | nodeGeometry.colors = []; | 
		
	
		
			
			|  |  |  | for (var i=0; i < 10; ++i) { | 
		
	
		
			
			|  |  |  | for (var j=0; j < 10; ++j) { | 
		
	
		
			
			|  |  |  | var vertex = new THREE.Vector3(i-5, j-5, 0); | 
		
	
		
			
			|  |  |  | for (var i = 0; i < 10; ++i) { | 
		
	
		
			
			|  |  |  | for (var j = 0; j < 10; ++j) { | 
		
	
		
			
			|  |  |  | var vertex = new THREE.Vector3(i - 5, j - 5, 0); | 
		
	
		
			
			|  |  |  | nodeGeometry.vertices.push(vertex); | 
		
	
		
			
			|  |  |  | nodeGeometry.colors.push(new THREE.Color(0.5, 0.5, 0.5)); | 
		
	
		
			
			|  |  |  | nodeGeometry.labels.push("Click to add a qubit at (" + i + ",  " + j + ")"); | 
		
	
	
		
			
				|  |  | @@ -70,16 +89,18 @@ function makeScene(){ | 
		
	
		
			
			|  |  |  | // Gets a reference to the node nearest to the mouse cursor | 
		
	
		
			
			|  |  |  | function nearestNode() { | 
		
	
		
			
			|  |  |  | raycaster.setFromCamera(mouse, camera); | 
		
	
		
			
			|  |  |  | for (var i=0; i < nodeGeometry.vertices.length; ++i) { | 
		
	
		
			
			|  |  |  | if (raycaster.ray.distanceSqToPoint(nodeGeometry.vertices[i]) < 0.01){ return i;} | 
		
	
		
			
			|  |  |  | for (var i = 0; i < nodeGeometry.vertices.length; ++i) { | 
		
	
		
			
			|  |  |  | if (raycaster.ray.distanceSqToPoint(nodeGeometry.vertices[i]) < 0.01) { | 
		
	
		
			
			|  |  |  | return i; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return undefined; | 
		
	
		
			
			|  |  |  | return undefined; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Find out: what is the mouse pointing at? | 
		
	
		
			
			|  |  |  | function checkIntersections() { | 
		
	
		
			
			|  |  |  | var new_selection = nearestNode(); | 
		
	
		
			
			|  |  |  | if (new_selection != selection){ | 
		
	
		
			
			|  |  |  | if (new_selection != selection) { | 
		
	
		
			
			|  |  |  | selection = new_selection; | 
		
	
		
			
			|  |  |  | info.className = selection ? "visible" : "hidden"; | 
		
	
		
			
			|  |  |  | info.innerHTML = selection ? nodeGeometry.labels[new_selection] : info.innerHTML; | 
		
	
	
		
			
				|  |  | @@ -88,17 +109,22 @@ function checkIntersections() { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Make a grid | 
		
	
		
			
			|  |  |  | function makeGrid(side, n, color){ | 
		
	
		
			
			|  |  |  | function makeGrid(side, n, color) { | 
		
	
		
			
			|  |  |  | var markers = new THREE.Object3D(); | 
		
	
		
			
			|  |  |  | var gridStyle = { color: color, transparent: true, linewidth: 1, opacity:0.5}; | 
		
	
		
			
			|  |  |  | var gridStyle = { | 
		
	
		
			
			|  |  |  | color: color, | 
		
	
		
			
			|  |  |  | transparent: true, | 
		
	
		
			
			|  |  |  | linewidth: 1, | 
		
	
		
			
			|  |  |  | opacity: 0.5 | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | var material = new THREE.LineBasicMaterial(gridStyle); | 
		
	
		
			
			|  |  |  | for (var i=-n/2; i < n/2; ++i) { | 
		
	
		
			
			|  |  |  | for (var i = -n / 2; i < n / 2; ++i) { | 
		
	
		
			
			|  |  |  | var geometry = new THREE.Geometry(); | 
		
	
		
			
			|  |  |  | geometry.vertices.push(new THREE.Vector3(side*i/n, -side/2, 0)); | 
		
	
		
			
			|  |  |  | geometry.vertices.push(new THREE.Vector3(side*i/n, side/2, 0)); | 
		
	
		
			
			|  |  |  | geometry.vertices.push(new THREE.Vector3(side * i / n, -side / 2, 0)); | 
		
	
		
			
			|  |  |  | geometry.vertices.push(new THREE.Vector3(side * i / n, side / 2, 0)); | 
		
	
		
			
			|  |  |  | var line = new THREE.Line(geometry, material); | 
		
	
		
			
			|  |  |  | var line90 = line.clone(); | 
		
	
		
			
			|  |  |  | line90.rotation.z=Math.PI/2; | 
		
	
		
			
			|  |  |  | line90.rotation.z = Math.PI / 2; | 
		
	
		
			
			|  |  |  | markers.add(line); | 
		
	
		
			
			|  |  |  | markers.add(line90); | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -110,18 +136,18 @@ function onMouseMove(event) { | 
		
	
		
			
			|  |  |  | mouse.wasClick = false; | 
		
	
		
			
			|  |  |  | mouse.absx = event.clientX; | 
		
	
		
			
			|  |  |  | mouse.absy = event.clientY; | 
		
	
		
			
			|  |  |  | mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1; | 
		
	
		
			
			|  |  |  | mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1; | 
		
	
		
			
			|  |  |  | mouse.x = (event.clientX / window.innerWidth) * 2 - 1; | 
		
	
		
			
			|  |  |  | mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; | 
		
	
		
			
			|  |  |  | w = 200; | 
		
	
		
			
			|  |  |  | h = 15; | 
		
	
		
			
			|  |  |  | info.style.top = mouse.absy-h-40+"px"; | 
		
	
		
			
			|  |  |  | info.style.left = mouse.absx-w/2+"px"; | 
		
	
		
			
			|  |  |  | info.style.top = mouse.absy - h - 40 + "px"; | 
		
	
		
			
			|  |  |  | info.style.left = mouse.absx - w / 2 + "px"; | 
		
	
		
			
			|  |  |  | checkIntersections(); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Render the current frame to the screen | 
		
	
		
			
			|  |  |  | function render() { | 
		
	
		
			
			|  |  |  | renderer.render(scene, camera); | 
		
	
		
			
			|  |  |  | function render() { | 
		
	
		
			
			|  |  |  | renderer.render(scene, camera); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // This is the main control loop | 
		
	
	
		
			
				|  |  | @@ -134,7 +160,7 @@ function loopForever() { | 
		
	
		
			
			|  |  |  | // This just organises kickoff | 
		
	
		
			
			|  |  |  | function startMainLoop() { | 
		
	
		
			
			|  |  |  | scene = makeScene(); | 
		
	
		
			
			|  |  |  | document.addEventListener("mousemove", onMouseMove, false ); | 
		
	
		
			
			|  |  |  | document.addEventListener("mousemove", onMouseMove, false); | 
		
	
		
			
			|  |  |  | controls.addEventListener("change", render); | 
		
	
		
			
			|  |  |  | loopForever(); | 
		
	
		
			
			|  |  |  | } | 
		
	
	
		
			
				|  |  | @@ -151,13 +177,15 @@ function init() { | 
		
	
		
			
			|  |  |  | materials.sprite.needsUpdate = true; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Renderer | 
		
	
		
			
			|  |  |  | renderer = new THREE.WebGLRenderer( { antialias: true }); | 
		
	
		
			
			|  |  |  | renderer = new THREE.WebGLRenderer({ | 
		
	
		
			
			|  |  |  | antialias: true | 
		
	
		
			
			|  |  |  | }); | 
		
	
		
			
			|  |  |  | renderer.setSize(width, height); | 
		
	
		
			
			|  |  |  | renderer.setClearColor(0xffffff, 1); | 
		
	
		
			
			|  |  |  | document.querySelector("body").appendChild(renderer.domElement); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // Camera, controls, raycaster | 
		
	
		
			
			|  |  |  | camera = new THREE.PerspectiveCamera(45, width/height, 0.3, 100); | 
		
	
		
			
			|  |  |  | camera = new THREE.PerspectiveCamera(45, width / height, 0.3, 100); | 
		
	
		
			
			|  |  |  | controls = new THREE.OrbitControls(camera); | 
		
	
		
			
			|  |  |  | raycaster = new THREE.Raycaster(); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -169,4 +197,3 @@ function init() { | 
		
	
		
			
			|  |  |  | // Run | 
		
	
		
			
			|  |  |  | startMainLoop(); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 |