annotate mcserver/static/app.js @ 11:2c3fe4b24640

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