initial commit
This commit is contained in:
commit
1e9f6b7fe0
11 changed files with 482 additions and 0 deletions
182
static/pp/pp.js
Normal file
182
static/pp/pp.js
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
(function() {
|
||||
var canvas = document.getElementById("pp-canvas");
|
||||
var ctx = canvas.getContext("2d");
|
||||
|
||||
var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
|
||||
var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
|
||||
var radius = Math.min(w, h) * 2;
|
||||
var radiusPeople = radius / 6;
|
||||
|
||||
canvas.width = w;
|
||||
canvas.height = h;
|
||||
|
||||
ctx.translate(w / 2, h / 2);
|
||||
|
||||
var sliceToColor = [
|
||||
'#ECEAE0',
|
||||
'#AC2832',
|
||||
'#CB8C1D',
|
||||
];
|
||||
|
||||
var sliceToRoom = [
|
||||
'BAD',
|
||||
'WOHNI',
|
||||
'KÜCHE',
|
||||
]
|
||||
|
||||
var imageSrc = [
|
||||
'./felix.png',
|
||||
'./tobias.png',
|
||||
'./andre.png',
|
||||
];
|
||||
// Bad, Küche, Wohni
|
||||
var pathRooms = [];
|
||||
|
||||
function drawBackground(ctx, radius) {
|
||||
sliceToColor.forEach(function (color, index) {
|
||||
drawSlice(index, sliceToColor.length, color);
|
||||
});
|
||||
}
|
||||
|
||||
function drawSlice(num, total, color) {
|
||||
var sliceSize = 360 / total;
|
||||
var start = Math.PI * 2 * (((num - 1) * sliceSize) / 360);
|
||||
var end = Math.PI * 2 * ((num * sliceSize) / 360);
|
||||
let path = new Path2D();
|
||||
ctx.beginPath(path)
|
||||
path.moveTo(0, 0);
|
||||
path.arc(0, 0, radius, start + 0.52, end + 0.52, false);
|
||||
path.lineTo(0, 0);
|
||||
ctx.fillStyle = color;
|
||||
path.closePath();
|
||||
|
||||
if (pathRooms.length < total) {
|
||||
pathRooms.push(path);
|
||||
}
|
||||
|
||||
ctx.fill(path);
|
||||
}
|
||||
|
||||
var secondsLoop = 3 * 7 * 24 * 60 * 60;
|
||||
|
||||
function degrees_to_radians(degrees) {
|
||||
var pi = Math.PI;
|
||||
return degrees * (pi/180);
|
||||
}
|
||||
|
||||
function drawPeople() {
|
||||
var now = Date.now() / 1000 - 4 * 60 * 60 * 24;
|
||||
var part = now % secondsLoop;
|
||||
var ang;
|
||||
var num;
|
||||
ctx.font = radiusPeople*0.15 + "px arial";
|
||||
ctx.textBaseline="middle";
|
||||
ctx.textAlign="center";
|
||||
ctx.fillStyle = 'black';
|
||||
var sliceSize = 360 / sliceToColor.length;
|
||||
|
||||
for(num = 0; num < sliceToColor.length; num++){
|
||||
ang = Math.PI * 2 * ((num * sliceSize) / 360);
|
||||
ang += degrees_to_radians((360 / secondsLoop) * part);
|
||||
|
||||
ctx.rotate(ang);
|
||||
ctx.translate(0, -radiusPeople*0.85);
|
||||
ctx.rotate(-ang);
|
||||
ctx.drawImage(images[num], 0 - images[num].width / 2, 0 - images[num].height / 2, images[num].width, images[num].height);
|
||||
ctx.rotate(ang);
|
||||
ctx.translate(0, radiusPeople*0.85);
|
||||
ctx.rotate(-ang);
|
||||
}
|
||||
}
|
||||
|
||||
function drawRoomNames() {
|
||||
var ang;
|
||||
var num;
|
||||
var radiusCaptions = radiusPeople * 1.3;
|
||||
ctx.font = radiusCaptions*0.15 + "px arial";
|
||||
ctx.textBaseline="middle";
|
||||
ctx.textAlign="center";
|
||||
ctx.fillStyle = 'black';
|
||||
var sliceSize = 360 / sliceToColor.length;
|
||||
|
||||
for(num = 0; num < sliceToColor.length; num++){
|
||||
ang = Math.PI * 2 * ((num * sliceSize + sliceSize / 2) / 360);
|
||||
|
||||
ctx.rotate(ang);
|
||||
ctx.translate(0, -radiusCaptions*0.85);
|
||||
ctx.rotate(-ang);
|
||||
ctx.fillText(sliceToRoom[num], 0, 0);
|
||||
ctx.rotate(ang);
|
||||
ctx.translate(0, radiusCaptions*0.85);
|
||||
ctx.rotate(-ang);
|
||||
}
|
||||
}
|
||||
|
||||
function init() {
|
||||
if (!isImgLoaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
|
||||
h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
|
||||
radius = Math.min(w, h) * 2;
|
||||
radiusPeople = radius / 6;
|
||||
canvas.width = w;
|
||||
canvas.height = h;
|
||||
ctx.translate(w / 2, h / 2);
|
||||
isInitialized = true;
|
||||
drawBackground();
|
||||
drawRoomNames();
|
||||
drawPeople();
|
||||
|
||||
canvas.addEventListener('mousemove', e => {
|
||||
let bound = canvas.getBoundingClientRect();
|
||||
let x = e.pageX - bound.top;
|
||||
let y = e.pageY - bound.left;
|
||||
activeRoom = false;
|
||||
pathRooms.forEach((path, index) => {
|
||||
if (ctx.isPointInPath(path, x, y)) {
|
||||
activeRoom = index;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
window.onresize = init;
|
||||
|
||||
var isInitialized = false;
|
||||
var isImgLoaded = false;
|
||||
var images = imageSrc.map(function(){return false;});
|
||||
|
||||
function preloadImages() {
|
||||
imageSrc.forEach(function(imgSrc, index) {
|
||||
var newImg = new Image();
|
||||
newImg.indexSrc = index;
|
||||
|
||||
newImg.onload = function() {
|
||||
var factor = (newImg.width / radius) * 13;
|
||||
newImg.width = newImg.width / factor;
|
||||
newImg.height = newImg.height / factor;
|
||||
images[index] = newImg;
|
||||
|
||||
isImgLoaded = images.reduce(function(acc, cur) {
|
||||
return acc && cur;
|
||||
}, true)
|
||||
init();
|
||||
};
|
||||
|
||||
newImg.src = imgSrc;
|
||||
});
|
||||
}
|
||||
|
||||
preloadImages();
|
||||
|
||||
setInterval(function() {
|
||||
if (!isInitialized) {
|
||||
return;
|
||||
}
|
||||
drawBackground();
|
||||
drawRoomNames();
|
||||
drawPeople();
|
||||
}, 1000);
|
||||
})();
|
||||
Loading…
Add table
Add a link
Reference in a new issue