gyorgyf@0
|
1 var Application = {
|
gyorgyf@0
|
2 init: function() {
|
gyorgyf@0
|
3 this.canvas = document.getElementById('canvas');
|
gyorgyf@0
|
4 this.marker = document.getElementById('marker');
|
gyorgyf@0
|
5 this.label = document.getElementById('label');
|
gyorgyf@0
|
6
|
gyorgyf@12
|
7 this.canvas.addEventListener('click', this.onMouseUp.bind(this));
|
gyorgyf@0
|
8
|
gyorgyf@12
|
9 this.request("/moodconductor/moods.csv", this.loadMoods.bind(this));
|
gyorgyf@12
|
10 <<<<<<< local
|
mgeorgi@9
|
11 this.background();
|
gyorgyf@12
|
12 =======
|
gyorgyf@12
|
13 this.draw();
|
gyorgyf@12
|
14 >>>>>>> other
|
mgeorgi@9
|
15 },
|
mgeorgi@9
|
16
|
mgeorgi@9
|
17 tl: { r: 200, g: 0, b: 0 },
|
mgeorgi@9
|
18 tr: { r: 200, g: 150, b: 0 },
|
mgeorgi@9
|
19 bl: { r: 0, g: 50, b: 100 },
|
mgeorgi@9
|
20 br: { r: 200, g: 230, b: 80 },
|
mgeorgi@9
|
21
|
mgeorgi@9
|
22 interpolateColor: function(a, b, x) {
|
mgeorgi@9
|
23 return {
|
mgeorgi@9
|
24 r: Math.floor(a.r + (b.r - a.r) * x),
|
mgeorgi@9
|
25 g: Math.floor(a.g + (b.g - a.g) * x),
|
mgeorgi@9
|
26 b: Math.floor(a.b + (b.b - a.b) * x)
|
mgeorgi@9
|
27 };
|
mgeorgi@9
|
28 },
|
mgeorgi@9
|
29
|
gyorgyf@12
|
30 draw: function() {
|
mgeorgi@9
|
31 var step = 20;
|
mgeorgi@9
|
32 var ctx = this.canvas.getContext("2d");
|
mgeorgi@9
|
33 ctx.clearRect(0, 0, 320, 320);
|
mgeorgi@9
|
34
|
mgeorgi@9
|
35 for (var y = 0; y < 320; y += step) {
|
mgeorgi@9
|
36 var left = this.interpolateColor(this.tl, this.bl, y / 320);
|
mgeorgi@9
|
37 var right = this.interpolateColor(this.tr, this.br, y / 320);
|
mgeorgi@9
|
38 for (var x = 0; x < 320; x += step) {
|
mgeorgi@9
|
39 var color = this.interpolateColor(left, right, x / 320);
|
mgeorgi@9
|
40 ctx.fillStyle = "rgb(" + color.r + "," + color.g + "," + color.b + ")";
|
mgeorgi@9
|
41 ctx.fillRect(x, y, step, step);
|
mgeorgi@9
|
42 }
|
mgeorgi@9
|
43 }
|
gyorgyf@12
|
44
|
gyorgyf@12
|
45 ctx.beginPath();
|
mgeorgi@9
|
46 ctx.strokeStyle = "rgb(0,0,0)";
|
mgeorgi@9
|
47 ctx.moveTo(0, 160);
|
mgeorgi@9
|
48 ctx.lineTo(320, 160);
|
mgeorgi@9
|
49 ctx.stroke();
|
mgeorgi@9
|
50
|
mgeorgi@9
|
51 ctx.fillStyle = "rgb(0,0,0)";
|
mgeorgi@9
|
52 ctx.beginPath();
|
mgeorgi@9
|
53 ctx.moveTo(320, 160);
|
mgeorgi@9
|
54 ctx.lineTo(310, 150);
|
mgeorgi@9
|
55 ctx.lineTo(310, 170);
|
mgeorgi@9
|
56 ctx.fill();
|
mgeorgi@9
|
57
|
mgeorgi@9
|
58 ctx.strokeStyle = "rgb(0,0,0)";
|
mgeorgi@9
|
59 ctx.moveTo(160, 320);
|
mgeorgi@9
|
60 ctx.lineTo(160, 0);
|
mgeorgi@9
|
61 ctx.stroke();
|
mgeorgi@9
|
62
|
mgeorgi@9
|
63 ctx.fillStyle = "rgb(0,0,0)";
|
mgeorgi@9
|
64 ctx.beginPath();
|
mgeorgi@9
|
65 ctx.moveTo(160, 0);
|
mgeorgi@9
|
66 ctx.lineTo(150, 10);
|
mgeorgi@9
|
67 ctx.lineTo(170, 10);
|
mgeorgi@9
|
68 ctx.fill();
|
mgeorgi@9
|
69
|
mgeorgi@9
|
70 ctx.font = "16px Arial";
|
mgeorgi@9
|
71 ctx.fillText("Valence", 200, 158);
|
mgeorgi@9
|
72
|
mgeorgi@9
|
73 ctx.save();
|
mgeorgi@9
|
74 ctx.translate(158, 120);
|
mgeorgi@9
|
75 ctx.rotate(Math.PI * 1.5);
|
mgeorgi@9
|
76 ctx.font = "16px Arial";
|
mgeorgi@9
|
77 ctx.fillText("Arousal", 0, 0);
|
mgeorgi@9
|
78 ctx.restore();
|
gyorgyf@12
|
79
|
gyorgyf@12
|
80 if (this.marker) {
|
gyorgyf@12
|
81 ctx.fillStyle = "rgba(0, 0, 0, 0.5)";
|
gyorgyf@12
|
82 ctx.beginPath();
|
gyorgyf@12
|
83 ctx.arc(this.marker.x, this.marker.y, 20, 0, Math.PI*2, true);
|
gyorgyf@12
|
84 ctx.fill();
|
gyorgyf@12
|
85 }
|
gyorgyf@0
|
86 },
|
gyorgyf@0
|
87
|
mgeorgi@6
|
88 loadMoods: function(text) {
|
gyorgyf@0
|
89 this.moods = [];
|
gyorgyf@0
|
90
|
gyorgyf@0
|
91 var lines = text.split("\n");
|
mgeorgi@6
|
92
|
mgeorgi@6
|
93 for (var i = 1; i < lines.length; i++) {
|
mgeorgi@6
|
94 var row = lines[i].split(",");
|
mgeorgi@6
|
95 var mood = {
|
mgeorgi@9
|
96 label: row[0],
|
mgeorgi@9
|
97 val: Number(row[1]),
|
mgeorgi@9
|
98 aro: Number(row[2]),
|
mgeorgi@9
|
99 dom: Number(row[3])
|
mgeorgi@6
|
100 };
|
mgeorgi@6
|
101 this.moods.push(mood);
|
mgeorgi@6
|
102 }
|
mgeorgi@6
|
103 },
|
mgeorgi@9
|
104
|
gyorgyf@0
|
105 request: function(url, callback) {
|
gyorgyf@0
|
106 var request = new XMLHttpRequest();
|
gyorgyf@0
|
107 request.onreadystatechange = function() {
|
mgeorgi@6
|
108 if (callback) {
|
mgeorgi@6
|
109 callback(request.responseText);
|
mgeorgi@6
|
110 }
|
gyorgyf@0
|
111 }.bind(this);
|
gyorgyf@0
|
112 request.open("GET", url);
|
gyorgyf@0
|
113 request.send(null);
|
gyorgyf@0
|
114 },
|
gyorgyf@0
|
115
|
gyorgyf@12
|
116 onMouseUp: function(event) {
|
gyorgyf@12
|
117 event.preventDefault();
|
gyorgyf@12
|
118 this.setMarker(event);
|
gyorgyf@12
|
119 this.sendPosition(event);
|
gyorgyf@12
|
120 this.draw();
|
gyorgyf@0
|
121 },
|
gyorgyf@0
|
122
|
gyorgyf@12
|
123 sendPosition: function(event) {
|
gyorgyf@12
|
124 var x = event.pageX / 320;
|
gyorgyf@12
|
125 var y = 1 - event.pageY / 320;
|
gyorgyf@12
|
126
|
gyorgyf@12
|
127 this.request("/moodconductor/mood?x=" + x + "&y=" + y);
|
gyorgyf@0
|
128 },
|
gyorgyf@0
|
129
|
gyorgyf@12
|
130 setMarker: function(event) {
|
gyorgyf@12
|
131 this.marker = {
|
gyorgyf@12
|
132 x: event.pageX,
|
gyorgyf@12
|
133 y: event.pageY
|
gyorgyf@12
|
134 };
|
gyorgyf@12
|
135
|
gyorgyf@12
|
136 <<<<<<< local
|
gyorgyf@12
|
137 sendPosition: function(pageX, pageY) {
|
gyorgyf@12
|
138 var x = pageX / 320;
|
gyorgyf@12
|
139 var y = 1 - pageY / 320;
|
gyorgyf@12
|
140 this.request("/moodconductor/mood?x=" + x + "&y=" + y);
|
gyorgyf@0
|
141 },
|
gyorgyf@0
|
142
|
mgeorgi@6
|
143 setMarker: function(pageX, pageY) {
|
mgeorgi@9
|
144 this.background();
|
mgeorgi@9
|
145 this.drawMarker(pageX, pageY);
|
mgeorgi@9
|
146
|
mgeorgi@6
|
147 var x = pageX / 320;
|
mgeorgi@6
|
148 var y = 1 - pageY / 320;
|
gyorgyf@12
|
149 =======
|
gyorgyf@12
|
150 var x = event.pageX / 320;
|
gyorgyf@12
|
151 var y = 1 - event.pageY / 320;
|
gyorgyf@12
|
152 >>>>>>> other
|
mgeorgi@6
|
153
|
mgeorgi@6
|
154 var mood = this.findMood(x, y);
|
mgeorgi@6
|
155
|
gyorgyf@12
|
156 this.label.innerHTML = mood.label;
|
gyorgyf@12
|
157 this.mood = mood;
|
mgeorgi@9
|
158 },
|
mgeorgi@6
|
159
|
mgeorgi@6
|
160 findMood: function(x, y) {
|
mgeorgi@6
|
161 var distance = 1;
|
mgeorgi@6
|
162 var index = null;
|
gyorgyf@0
|
163
|
gyorgyf@0
|
164 for (var i = 0; i < this.moods.length; i++) {
|
gyorgyf@0
|
165 var mood = this.moods[i];
|
mgeorgi@9
|
166 var dx = Math.abs(mood.val - x);
|
mgeorgi@9
|
167 var dy = Math.abs(mood.aro - y);
|
mgeorgi@6
|
168 var d = Math.sqrt(dx * dx + dy * dy);
|
gyorgyf@0
|
169
|
mgeorgi@6
|
170 if (d < distance) {
|
mgeorgi@6
|
171 distance = d;
|
mgeorgi@6
|
172 index = i;
|
gyorgyf@0
|
173 }
|
gyorgyf@0
|
174 }
|
gyorgyf@0
|
175
|
mgeorgi@6
|
176 return this.moods[index];
|
gyorgyf@0
|
177 }
|
gyorgyf@12
|
178 }; |