atlas/web/_js/main/atlas.js

52 lines
1.6 KiB
JavaScript
Raw Normal View History

/*!
* The 2022 r/place Atlas
* Copyright (c) 2017 Roland Rytz <roland@draemm.li>
* Copyright (c) 2022 Place Atlas contributors
* Licensed under AGPL-3.0 (https://2022.place-atlas.stefanocoding.me/license.txt)
*/
2023-04-07 11:44:33 +02:00
window.addEventListener("error", e => {
2022-05-06 09:41:22 +02:00
console.error(e)
let errorMessage = "<h4 class=\"mb-3\">An error has occurred:</h4>"
errorMessage += "<p class=\"text-danger\">" + e.message + "</p>"
errorMessage += "<p class=\"text-danger\">on line " + e.lineno + "</p>"
errorMessage += "<p>If this keeps happening, feel free to tell us on <a href=\"https://discord.gg/pJkm23b2nA\">our Discord server</a>.</p>"
document.getElementById("loadingContent").innerHTML = errorMessage
})
2017-04-10 17:57:13 +02:00
function getPositionOfEntry(entry) {
2023-03-19 07:03:49 +01:00
let startX = canvasSize.x, startY = canvasSize.y
for (const [x, y] of entry.path) {
2022-05-06 09:41:22 +02:00
startX = Math.min(x, startX)
startY = Math.min(y, startY)
}
2023-03-19 07:03:49 +01:00
if (startX === canvasSize.x || startY === canvasSize.y) return null
2022-05-06 09:41:22 +02:00
return [parseInt(startX), parseInt(startY)]
}
2022-05-06 09:41:22 +02:00
const areaMap = new Map()
2023-04-03 19:09:03 +02:00
// Modified from https://stackoverflow.com/a/33670691
function calcPolygonArea(vertices) {
2022-05-06 09:41:22 +02:00
const hit = areaMap.get(vertices)
2023-04-03 19:09:03 +02:00
if (hit) {
2022-05-06 09:41:22 +02:00
return hit
2022-04-06 21:31:21 +02:00
}
2022-05-06 09:41:22 +02:00
let total = 0
for (let i = 0, l = vertices.length; i < l; i++) {
2022-05-06 09:41:22 +02:00
const addX = vertices[i][0]
2023-03-17 18:30:33 +01:00
const addY = vertices[i === vertices.length - 1 ? 0 : i + 1][1]
const subX = vertices[i === vertices.length - 1 ? 0 : i + 1][0]
2022-05-06 09:41:22 +02:00
const subY = vertices[i][1]
2022-05-06 09:41:22 +02:00
total += (addX * addY * 0.5)
total -= (subX * subY * 0.5)
}
2022-05-06 09:41:22 +02:00
const area = Math.floor(Math.abs(total))
areaMap.set(vertices, area)
2022-05-06 09:41:22 +02:00
return area
}