atlas/web/_js/atlas.js

60 lines
1.9 KiB
JavaScript
Raw Normal View History

/*
========================================================================
The 2022 /r/place Atlas
An Atlas of Reddit's 2022 /r/place, with information to each
artwork of the canvas provided by the community.
Copyright (c) 2017 Roland Rytz <roland@draemm.li>
Copyright (c) 2022 r/placeAtlas2 contributors
Licensed under the GNU Affero General Public License Version 3
2022-04-09 03:23:55 +02:00
https://place-atlas.stefanocoding.me/license.txt
========================================================================
*/
window.addEventListener("error", function (e) {
2017-04-10 17:57:13 +02:00
console.log(e);
var errorMessage = "<p class=\"error\">An error has occurred:</p>";
errorMessage += "<p class=\"errorBody\">" + e.message + "</p>";
errorMessage += "<p class=\"errorBody\">on line " + e.lineno + "</p>";
errorMessage += "<p class=\"error\">If this keeps happening, feel free to tell us on <a href=\"https://discord.gg/pJkm23b2nA\">our Discord server</a>.</p>";
2017-04-10 17:57:13 +02:00
document.getElementById("loadingContent").innerHTML = errorMessage;
});
function getPositionOfEntry(entry){
let startX = 2000, startY = 2000;
for(let [x, y] of entry.path){
startX = Math.min(x, startX);
startY = Math.min(y, startY)
}
if(startX === 2000 || startY === 2000) return null;
return [parseInt(startX), parseInt(startY)];
}
2022-04-06 21:31:21 +02:00
const areaMap = new Map();
// Modified from https://stackoverflow.com/a/33670691
function calcPolygonArea(vertices) {
2022-04-06 21:31:21 +02:00
var hit = areaMap.get(vertices);
if (hit != null) {
return hit;
}
var total = 0;
for (var i = 0, l = vertices.length; i < l; i++) {
var addX = vertices[i][0];
var addY = vertices[i == vertices.length - 1 ? 0 : i + 1][1];
var subX = vertices[i == vertices.length - 1 ? 0 : i + 1][0];
var subY = vertices[i][1];
total += (addX * addY * 0.5);
total -= (subX * subY * 0.5);
}
2022-04-06 21:31:21 +02:00
var area = Math.floor(Math.abs(total));
areaMap.set(vertices, area);
return area;
}