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