Mercurial > hg > mood-conductor
comparison mcserver/static/app.js~ @ 9:180274c3b48a
send on mouse release
author | mgeorgi |
---|---|
date | Fri, 22 Jun 2012 10:36:35 +0100 |
parents | 9d2f4e6a3f36 |
children | 9d9169751aba |
comparison
equal
deleted
inserted
replaced
8:f9d621228bd9 | 9:180274c3b48a |
---|---|
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("/moods.csv", this.loadMoods.bind(this)); | 11 this.request("/moods.csv", this.loadMoods.bind(this)); |
12 this.request("/colors.txt", this.loadColors.bind(this)); | 12 this.background(); |
13 }, | |
14 | |
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(); | |
13 }, | 75 }, |
14 | 76 |
15 loadMoods: function(text) { | 77 loadMoods: function(text) { |
16 this.moods = []; | 78 this.moods = []; |
17 | 79 |
18 var lines = text.split("\n"); | 80 var lines = text.split("\n"); |
19 | 81 |
20 for (var i = 1; i < lines.length; i++) { | 82 for (var i = 1; i < lines.length; i++) { |
21 var row = lines[i].split(","); | 83 var row = lines[i].split(","); |
22 var mood = { | 84 var mood = { |
23 label: row[1], | 85 label: row[0], |
24 x: Number(row[3]), | 86 val: Number(row[1]), |
25 y: Number(row[5]) | 87 aro: Number(row[2]), |
88 dom: Number(row[3]) | |
26 }; | 89 }; |
27 | |
28 // var div = document.createElement('div'); | |
29 // this.canvas.appendChild(div); | |
30 // div.style.position = 'absolute'; | |
31 // div.style.left = mood.x * 320 + 'px'; | |
32 // div.style.top = mood.y * 320 + 'px'; | |
33 // div.innerHTML = mood.label; | |
34 | |
35 this.moods.push(mood); | 90 this.moods.push(mood); |
36 } | 91 } |
37 }, | 92 }, |
38 | 93 |
39 loadColors: function(text) { | |
40 this.colors = {}; | |
41 | |
42 var lines = text.split("\n"); | |
43 | |
44 for (var i = 1; i < lines.length; i++) { | |
45 var row = lines[i].split("\t"); | |
46 this.colors[row[0]] = row[2]; | |
47 } | |
48 }, | |
49 | |
50 request: function(url, callback) { | 94 request: function(url, callback) { |
51 var request = new XMLHttpRequest(); | 95 var request = new XMLHttpRequest(); |
52 request.onreadystatechange = function() { | 96 request.onreadystatechange = function() { |
53 if (callback) { | 97 if (callback) { |
54 callback(request.responseText); | 98 callback(request.responseText); |
73 this.mouseDown = false; | 117 this.mouseDown = false; |
74 this.setMarker(event.pageX, event.pageY); | 118 this.setMarker(event.pageX, event.pageY); |
75 }, | 119 }, |
76 | 120 |
77 setMarker: function(pageX, pageY) { | 121 setMarker: function(pageX, pageY) { |
78 this.marker.style.left = pageX + 'px'; | 122 this.background(); |
79 this.marker.style.top = pageY + 'px'; | 123 this.drawMarker(pageX, pageY); |
80 | 124 |
81 var x = pageX / 320; | 125 var x = pageX / 320; |
82 var y = 1 - pageY / 320; | 126 var y = 1 - pageY / 320; |
83 | 127 |
84 var mood = this.findMood(x, y); | 128 var mood = this.findMood(x, y); |
85 | 129 |
86 if (mood != this.mood) { | 130 if (mood != this.mood) { |
87 this.marker.innerHTML = mood.label; | 131 this.label.innerHTML = mood.label; |
88 this.mood = mood; | 132 this.mood = mood; |
89 this.canvas.style.backgroundColor = '#' + this.colors[mood.label]; | |
90 this.request("/mood?x=" + x + "&y=" + y); | 133 this.request("/mood?x=" + x + "&y=" + y); |
91 } | 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(); | |
92 }, | 143 }, |
93 | 144 |
94 findMood: function(x, y) { | 145 findMood: function(x, y) { |
95 var distance = 1; | 146 var distance = 1; |
96 var index = null; | 147 var index = null; |
97 | 148 |
98 for (var i = 0; i < this.moods.length; i++) { | 149 for (var i = 0; i < this.moods.length; i++) { |
99 var mood = this.moods[i]; | 150 var mood = this.moods[i]; |
100 var dx = Math.abs(mood.x - x); | 151 var dx = Math.abs(mood.val - x); |
101 var dy = Math.abs(mood.y - y); | 152 var dy = Math.abs(mood.aro - y); |
102 var d = Math.sqrt(dx * dx + dy * dy); | 153 var d = Math.sqrt(dx * dx + dy * dy); |
103 | 154 |
104 if (d < distance) { | 155 if (d < distance) { |
105 distance = d; | 156 distance = d; |
106 index = i; | 157 index = i; |