@@ -14,38 +14,20 @@ class VisibleGraphState(GraphState): | |||
def __init__(self, *args, **kwargs): | |||
GraphState.__init__(self, *args, **kwargs) | |||
self.ws = create_connection("ws://localhost:5001") | |||
self.diff = [] | |||
atexit.register(self.shutdown) | |||
self.ws.send(json.dumps({"method":"clear"})) | |||
#self.ws.send(json.dumps({"method":"clear"})) | |||
def shutdown(self): | |||
if len(self.diff)>0: | |||
self.update() | |||
self.update() | |||
self.ws.close() | |||
def send(self, method, *args, **kwargs): | |||
kwargs.update({"method": method}) | |||
self.diff.append(kwargs) | |||
def add_node(self, node, meta = {}): | |||
GraphState.add_node(self, node, meta) | |||
self.send("add_node", node=node, meta=meta) | |||
def add_edge(self, start, end): | |||
GraphState.add_edge(self, start, end) | |||
self.send("add_edge", start=start, end=end) | |||
def del_edge(self, start, end): | |||
GraphState.del_edge(self, start, end) | |||
self.send("del_edge", start=start, end=end) | |||
def act_local_rotation(self, node, operation): | |||
GraphState.act_local_rotation(self, node, operation) | |||
self.send("update_vop", node = node, vop = self.vops[node]) | |||
def to_json(self): | |||
ngbh = {a: {b : True for b in self.ngbh[a]} | |||
for a in self.ngbh} | |||
return {"vops": self.vops, "ngbh": ngbh, "meta": self.meta} | |||
def update(self): | |||
#data = json.dumps({"diff": self.diff, "state":self.to_json()}) | |||
data = json.dumps({"diff": self.diff}) | |||
data = json.dumps(self.to_json()) | |||
self.ws.send(data) | |||
self.diff = [] | |||
@@ -1,10 +1,12 @@ | |||
from abp import VisibleGraphState | |||
import numpy as np | |||
s = VisibleGraphState() | |||
for i in range(1000): | |||
s.add_node(i) | |||
for i in range(200): | |||
x = 10*np.cos(np.pi*2*i/60) | |||
y = 10*np.sin(np.pi*2*i/60) | |||
s.add_node(i, {"position": (x, y, i/50.)}) | |||
s.act_local_rotation(i, "hadamard") | |||
s.update() | |||
for i in range(1000-1): | |||
for i in range(200-1): | |||
s.act_cz(i, i+1) | |||
s.update() |
@@ -99,6 +99,19 @@ function act_cz(a, b){ | |||
} | |||
} | |||
function edgelist() { | |||
var seen = {}; | |||
var output = []; | |||
for (var i in ngbh) { | |||
for (var j in ngbh[i]) { | |||
if (!Object.prototype.hasOwnProperty.call(seen, j)){ | |||
output.push([i, j]); | |||
} | |||
} | |||
seen[i] = true; | |||
} | |||
return output; | |||
} | |||
function log_graph_state() { | |||
console.log(JSON.stringify(vops)); | |||
@@ -9,8 +9,11 @@ function connect_to_server() { | |||
ws.onmessage = function (evt) | |||
{ | |||
var received_msg = evt.data; | |||
console.log("Message received: " + evt.data); | |||
var new_state = JSON.parse(evt.data); | |||
vops = new_state.vops; | |||
ngbh = new_state.ngbh; | |||
meta = new_state.meta; | |||
updateScene(); | |||
}; | |||
ws.onclose = function() | |||
@@ -7,8 +7,10 @@ var curveProperties = { | |||
// Add a curved edge between two points | |||
function makeEdge(start, end) { | |||
// Make the geometry of the curve | |||
var a = new THREE.Vector3(start.x, start.y, start.z); | |||
var b = new THREE.Vector3(end.x, end.y, end.z); | |||
//var a = new THREE.Vector3(start.x, start.y, start.z); | |||
//var b = new THREE.Vector3(end.x, end.y, end.z); | |||
var a = start; | |||
var b = end; | |||
var length = new THREE.Vector3().subVectors(a, b).length(); | |||
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); | |||
@@ -1,26 +1,28 @@ | |||
function updateScene(state) { | |||
var colors = ["red", "green", "yellow", "blue", "pink", "orange", "purple"]; | |||
function updateScene() { | |||
var oldState = scene.getObjectByName("graphstate"); | |||
scene.remove(oldState); | |||
oldState = null; | |||
var geometry = new THREE.Geometry(); | |||
//nodeGeometry.labels = []; | |||
//nodeGeometry.colors = []; | |||
for (var i in state.nodes) { | |||
var node = state.nodes[i]; | |||
var pos = state.meta[i].pos; | |||
var vertex = new THREE.Vector3(pos.x, pos.y, pos.z); | |||
for (var i in vops) { | |||
var vop = vops[i]; | |||
var pos = meta[i].position; | |||
var vertex = new THREE.Vector3(pos[0], pos[1], pos[2]); | |||
geometry.vertices.push(vertex); | |||
//geometry.colors[i] = new THREE.Color(n.color); | |||
//geometry.labels[i] = n.label; | |||
geometry.colors[i] = new THREE.Color(colors[vops[i] % colors.length]); | |||
} | |||
var edges = new THREE.Object3D(); | |||
for (i=0; i < state.edges.length; ++i) { | |||
var edge = state.edges[i]; | |||
var start = state.meta[edge[0]].pos; | |||
var end = state.meta[edge[1]].pos; | |||
var newEdge = makeEdge(start, end); | |||
var my_edges = edgelist(); | |||
for (i=0; i < my_edges.length; ++i) { | |||
var edge = my_edges[i]; | |||
var start = meta[edge[0]].position; | |||
var startpos = new THREE.Vector3(start[0], start[1], start[2]); | |||
var end = meta[edge[1]].position; | |||
var endpos = new THREE.Vector3(end[0], end[1], end[2]); | |||
var newEdge = makeEdge(startpos, endpos); | |||
edges.add(newEdge); | |||
} | |||
@@ -1,12 +1,7 @@ | |||
// IE9 | |||
if (typeof console === "undefined") { | |||
var console = { | |||
log: function(logMsg) {} | |||
}; | |||
} | |||
var controls, renderer, raycaster, scene, selection, camera; | |||
var mouseprevpos = {}; | |||
// Run on startup | |||
window.onload = init; | |||
@@ -14,8 +9,6 @@ window.onload = init; | |||
function makeScene() { | |||
var myScene = new THREE.Scene(); | |||
var grid = new THREE.GridHelper(20, 2); | |||
graph = new graph_model(); | |||
myScene.add(graph.object); | |||
grid.rotation.x = Math.PI/2; | |||
grid.setColors(0xdddddd, 0xeeeeee); | |||
myScene.add(grid); | |||
@@ -38,29 +31,51 @@ function onWindowResize(evt){ | |||
render(); | |||
} | |||
function bind_events() { | |||
window.addEventListener("resize", onWindowResize, false); | |||
renderer.domElement.addEventListener("mousedown", function (event) { | |||
var mouse = new THREE.Vector2(); // create once and reuse | |||
mouse.x = ( event.clientX / renderer.domElement.width ) * 2 - 1; | |||
mouse.y = - ( event.clientY / renderer.domElement.height ) * 2 + 1; | |||
mouseprevpos.x = mouse.x; | |||
mouseprevpos.y = mouse.y; | |||
}); | |||
renderer.domElement.addEventListener("mouseup", function (event) { | |||
var mouse = new THREE.Vector2(); // create once and reuse | |||
mouse.x = ( event.clientX / renderer.domElement.width ) * 2 - 1; | |||
mouse.y = - ( event.clientY / renderer.domElement.height ) * 2 + 1; | |||
if (mouse.x != mouseprevpos.x || mouse.y != mouseprevpos.y ){return;} | |||
var raycaster = new THREE.Raycaster(); // create once and reuse | |||
raycaster.setFromCamera( mouse, camera ); | |||
var plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0); | |||
var intersection = raycaster.ray.intersectPlane(plane); | |||
console.log(intersection); | |||
intersection.x = Math.round(intersection.x); | |||
intersection.y = Math.round(intersection.y); | |||
add_node(Object.keys(vops).length, intersection); | |||
updateScene(); | |||
}); | |||
controls.addEventListener("change", render); | |||
} | |||
// Called on startup | |||
function init() { | |||
// Measure things, get references | |||
var width = window.innerWidth; | |||
var height = window.innerHeight; | |||
// Renderer | |||
renderer = new THREE.WebGLRenderer({"antialias":true}); | |||
renderer.setSize(width, height); | |||
renderer.setSize(window.innerWidth, window.innerHeight); | |||
renderer.setClearColor(0xffffff, 1); | |||
document.querySelector("body").appendChild(renderer.domElement); | |||
window.addEventListener("resize", onWindowResize, false); | |||
renderer.domElement.addEventListener("click", function (evt) { | |||
add_node(0); | |||
}); | |||
// Time to load the materials | |||
loadMaterials(); | |||
// Camera, controls, raycaster | |||
camera = new THREE.PerspectiveCamera(45, width / height, 0.3, 100); | |||
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.3, 100); | |||
controls = new THREE.OrbitControls(camera); | |||
// Center the camera | |||
@@ -70,8 +85,8 @@ function init() { | |||
camera.position.set(0, 0, 40); | |||
// Run | |||
bind_events(); | |||
scene = makeScene(); | |||
controls.addEventListener("change", render); | |||
connect_to_server(); | |||
render(); | |||
} |
@@ -14,11 +14,11 @@ function loadMaterials(argument) { | |||
materials.edge = new THREE.LineBasicMaterial(lineStyle); | |||
var pointStyle = { | |||
color: 0xcccccc, | |||
size: 0.1, | |||
map: textures.sprite, | |||
alphaTest: 0.5, | |||
transparent: true, | |||
vertexColors:THREE.VertexColors | |||
}; | |||
materials.point = new THREE.PointsMaterial(pointStyle); | |||
@@ -27,7 +27,7 @@ function loadMaterials(argument) { | |||
map: textures.sprite, | |||
alphaTest: 0.5, | |||
transparent: true, | |||
color: "red" | |||
vertexColors:THREE.VertexColors | |||
}; | |||
materials.qubit = new THREE.PointsMaterial(qubitStyle); | |||
@@ -7,8 +7,10 @@ function poll() { | |||
ws.onmessage = function (evt) | |||
{ | |||
var received_msg = evt.data; | |||
console.log("Message received: " + evt.data); | |||
var new_state = JSON.parse(evt.data); | |||
vops = new_state.vops; | |||
ngbh = new_state.ngbh; | |||
updateScene(); | |||
}; | |||
ws.onclose = function() | |||
@@ -17,5 +19,3 @@ function poll() { | |||
}; | |||
} | |||
window.onload = poll; | |||