let db = require("../config/db.js"); let util = require("util"); let turf = require("turf"); let mathFunc = require("./mathFunc.js"); module.exports = { organisePolygonPoints(polygonPoints) { console.log(polygonPoints); let polygons = [] let polygonDict = {}; polygonPoints.map((point) => { if (!(point.polygonID in polygonDict)) { polygonDict[point.polygonID] = {}; polygonDict[point.polygonID].coords = []; polygonDict[point.polygonID].gameID = point.gameID; polygonDict[point.polygonID].userID = point.userID; polygonDict[point.polygonID].colour = point.colour; polygonDict[point.polygonID].polygonID = point.polygonID; } polygonDict[point.polygonID].coords.push({lat: point.lat, lng: point.lng}); }); for (let [polygon, polygonData] of Object.entries(polygonDict)){ polygons.push(polygonDict[polygon]); } return polygons }, submitFinalCollation(res, gameID, userID, points, area, mergedPolygonIDs) { query = util.format("CALL insertPolygon(\"%s\", \"%s\", %d)", gameID, userID, area); db.get().query(query, function(err, rows) { if (err) { console.log(err); return res.send(400); } let polygonID = rows[0][0].polygonID; query = "INSERT INTO polygonPoints (polygonID, lat, lng) VALUES "; let delimiterNecessary = false; points.map((point) => { if (delimiterNecessary) { query += ","; } query += util.format("(\"%s\",%s,%s)", polygonID, point.lat, point.lng); delimiterNecessary = true; }); query += ";"; db.get().query(query, function(err, pointRows) { if (err) { console.log(err); return res.send(400); } module.exports.deleteMergedPolygons(mergedPolygonIDs, () => res.send(rows[0][0])); // res.send(rows[0][0]); return; }); }); }, deleteMergedPolygons(mergedPolygonIDs, next) { if (mergedPolygonIDs.length > 0) { let id = mergedPolygonIDs.pop(); console.log(id); let deleteQuery = util.format("CALL deletePolygon(\"%s\");", id); db.get().query(deleteQuery, function(err, pointRows) { if (err) { console.log(err); return res.send(400); } module.exports.deleteMergedPolygons(mergedPolygonIDs, next); return; }); } else { next(); } }, collatePolygons(res, gameID, userID, points) { let query = util.format("CALL selectUserPolygon(\"%s\", \"%s\");", gameID, userID); db.get().query(query, function (err, rows) { if (err) { console.log(err); res.send(500); } let polygonPoints = points; let polygons = module.exports.organisePolygonPoints(rows[0]); let polygonResult = []; let polygonsMerged = []; polygons.map((polygon) => { if (polygon[0].lat != polygon[polygon.length - 1].lat && polygon[0].lng != polygon[polygon.length - 1].lng) { polygon.push({lat: polygon[0].lat, lng: polygon[0].lng}) } let intersect = module.exports.checkIntersects(polygonPoints, polygon.coords); if (intersect != null) { polygonPoints = module.exports.unionPolygon(polygonPoints, polygon.coords); polygonsMerged.push(polygon.polygonID); } else { polygonResult.push(polygon); } }); let area = mathFunc.calculateArea(points); // module.exports.polygonDestruction(res, gameID, userID, polygonPoints, area, polygonsMerged); module.exports.submitFinalCollation(res, gameID, userID, polygonPoints, area, polygonsMerged); }); }, unionPolygon(points1, points2){ let arrayPoints1 = [module.exports.convertPointsObjToArray(points1)]; let arrayPoints2 = [module.exports.convertPointsObjToArray(points2)]; let poly1 = turf.polygon(arrayPoints1); let poly2 = turf.polygon(arrayPoints2); let unionPoly = turf.union(poly1, poly2); return module.exports.convertPointsArrayToObj(unionPoly.geometry.coordinates[0]); }, checkIntersects(points1, points2) { let arrayPoints1 = [module.exports.convertPointsObjToArray(points1)]; let arrayPoints2 = [module.exports.convertPointsObjToArray(points2)]; let poly1 = turf.polygon(arrayPoints1); let poly2 = turf.polygon(arrayPoints2); return turf.intersect(poly1, poly2); }, convertPointsObjToArray(points){ let array = points.map((point) => { return [point.lng, point.lat]; }); return array; }, convertPointsArrayToObj(points){ let array = points.map((point) => { return {lat: point[1], lng: point[0]}; }); return array; } }