comparison mcserver/static/app.js @ 6:9d2f4e6a3f36

color coding in client ui
author mgeorgi
date Fri, 22 Jun 2012 10:14:12 +0100
parents 89a05584e39e
children 180274c3b48a
comparison
equal deleted inserted replaced
4:02b4c5e122e8 6:9d2f4e6a3f36
6 6
7 this.canvas.addEventListener('mousedown', this.onMouseDown.bind(this)); 7 this.canvas.addEventListener('mousedown', this.onMouseDown.bind(this));
8 this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this)); 8 this.canvas.addEventListener('mousemove', this.onMouseMove.bind(this));
9 this.canvas.addEventListener('mouseup', this.onMouseUp.bind(this)); 9 this.canvas.addEventListener('mouseup', this.onMouseUp.bind(this));
10 10
11 this.request("/moodconductor/moods.csv", this.loadCSV.bind(this)); 11 this.request("/moods.csv", this.loadMoods.bind(this));
12 this.background();
12 }, 13 },
13 14
14 loadCSV: function(text) { 15 tl: { r: 200, g: 0, b: 0 },
16 tr: { r: 200, g: 150, b: 0 },
17 bl: { r: 0, g: 50, b: 100 },
18 br: { r: 200, g: 230, b: 80 },
19
20 interpolateColor: function(a, b, x) {
21 return {
22 r: Math.floor(a.r + (b.r - a.r) * x),
23 g: Math.floor(a.g + (b.g - a.g) * x),
24 b: Math.floor(a.b + (b.b - a.b) * x)
25 };
26 },
27
28 background: function() {
29 var step = 20;
30 var ctx = this.canvas.getContext("2d");
31 ctx.clearRect(0, 0, 320, 320);
32
33 for (var y = 0; y < 320; y += step) {
34 var left = this.interpolateColor(this.tl, this.bl, y / 320);
35 var right = this.interpolateColor(this.tr, this.br, y / 320);
36 for (var x = 0; x < 320; x += step) {
37 var color = this.interpolateColor(left, right, x / 320);
38 ctx.fillStyle = "rgb(" + color.r + "," + color.g + "," + color.b + ")";
39 ctx.fillRect(x, y, step, step);
40 }
41 }
42 ctx.strokeStyle = "rgb(0,0,0)";
43 ctx.moveTo(0, 160);
44 ctx.lineTo(320, 160);
45 ctx.stroke();
46
47 ctx.fillStyle = "rgb(0,0,0)";
48 ctx.beginPath();
49 ctx.moveTo(320, 160);
50 ctx.lineTo(310, 150);
51 ctx.lineTo(310, 170);
52 ctx.fill();
53
54 ctx.strokeStyle = "rgb(0,0,0)";
55 ctx.moveTo(160, 320);
56 ctx.lineTo(160, 0);
57 ctx.stroke();
58
59 ctx.fillStyle = "rgb(0,0,0)";
60 ctx.beginPath();
61 ctx.moveTo(160, 0);
62 ctx.lineTo(150, 10);
63 ctx.lineTo(170, 10);
64 ctx.fill();
65
66 ctx.font = "16px Arial";
67 ctx.fillText("Valence", 200, 158);
68
69 ctx.save();
70 ctx.translate(158, 120);
71 ctx.rotate(Math.PI * 1.5);
72 ctx.font = "16px Arial";
73 ctx.fillText("Arousal", 0, 0);
74 ctx.restore();
75 },
76
77 loadMoods: function(text) {
15 this.moods = []; 78 this.moods = [];
16 79
17 var lines = text.split("\n"); 80 var lines = text.split("\n");
18 81
19 for (var i = 1; i < lines.length; i++) { 82 for (var i = 1; i < lines.length; i++) {
20 var row = lines[i].split(","); 83 var row = lines[i].split(",");
21 this.moods.push({ 84 var mood = {
22 label: row[1], 85 label: row[0],
23 x: Number(row[3]), 86 val: Number(row[1]),
24 y: Number(row[5]) 87 aro: Number(row[2]),
25 }); 88 dom: Number(row[3])
89 };
90 this.moods.push(mood);
26 } 91 }
27 }, 92 },
28 93
29 request: function(url, callback) { 94 request: function(url, callback) {
30 var request = new XMLHttpRequest(); 95 var request = new XMLHttpRequest();
31 request.onreadystatechange = function() { 96 request.onreadystatechange = function() {
32 callback(request.responseText); 97 if (callback) {
98 callback(request.responseText);
99 }
33 }.bind(this); 100 }.bind(this);
34 request.open("GET", url); 101 request.open("GET", url);
35 request.send(null); 102 request.send(null);
36 }, 103 },
37 104
50 this.mouseDown = false; 117 this.mouseDown = false;
51 this.setMarker(event.pageX, event.pageY); 118 this.setMarker(event.pageX, event.pageY);
52 }, 119 },
53 120
54 setMarker: function(pageX, pageY) { 121 setMarker: function(pageX, pageY) {
55 this.marker.style.left = pageX + 'px'; 122 this.background();
56 this.marker.style.top = pageY + 'px'; 123 this.drawMarker(pageX, pageY);
57 124
58 var x = 1 - pageX / 480; 125 var x = pageX / 320;
59 var y = 1 - pageY / 960; 126 var y = 1 - pageY / 320;
60 127
61 var mood = this.findMood(x, y); 128 var mood = this.findMood(x, y);
62 129
63 this.marker.innerHTML = mood.label;
64
65 if (mood != this.mood) { 130 if (mood != this.mood) {
131 this.label.innerHTML = mood.label;
66 this.mood = mood; 132 this.mood = mood;
67 this.request("/moodconductor/mood?x=" + x + "&y=" + y); 133 this.request("/mood?x=" + x + "&y=" + y);
68 } 134 }
135 },
136
137 drawMarker: function(x, y) {
138 var ctx = this.canvas.getContext("2d");
139 ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
140 ctx.beginPath();
141 ctx.arc(x, y, 20, 0, Math.PI*2, true);
142 ctx.fill();
69 }, 143 },
70 144
71 findMood: function(x, y) { 145 findMood: function(x, y) {
72 var distance = 1; 146 var distance = 1;
73 var index = null; 147 var index = null;
74 148
75 for (var i = 0; i < this.moods.length; i++) { 149 for (var i = 0; i < this.moods.length; i++) {
76 var mood = this.moods[i]; 150 var mood = this.moods[i];
77 var dx = Math.abs(mood.x - x); 151 var dx = Math.abs(mood.val - x);
78 var dy = Math.abs(mood.y - y); 152 var dy = Math.abs(mood.aro - y);
79 var d = Math.sqrt(dx * dx + dy * dy); 153 var d = Math.sqrt(dx * dx + dy * dy);
80 154
81 if (d < distance) { 155 if (d < distance) {
82 distance = d; 156 distance = d;
83 index = i; 157 index = i;