182 lines
5.1 KiB
JavaScript
182 lines
5.1 KiB
JavaScript
(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);
|
|
})();
|