sampleTopologyPolygons = {
const sampleTopology = _.cloneDeep(_sampleTopology);
const shiftedArcIds = { left: new Map(), right: new Map() };
function getShiftedArcId(arcId, edge) {
if (arcId < 0) return ~getShiftedArcId(~arcId, edge);
if (shiftedArcIds[edge].has(arcId)) return shiftedArcIds[edge].get(arcId);
let shift = ((edge == "left") ? 1 : -1) * sampleTopology.bbox[2];
if (!sampleTopology.arcs[arcId]) debugger;
let newArcId = sampleTopology.arcs.length;
let newArc = sampleTopology.arcs[arcId].map(c => [c[0] + shift, c[1]]);
sampleTopology.arcs.push(newArc);
shiftedArcIds[edge].set(arcId, newArcId);
return newArcId;
}
function clonePolygon(sourceGeometry, polygonArcs) {
return {
type: "Polygon",
arcs: polygonArcs.map(a => [...a]),
properties: {...sourceGeometry.properties}
};
}
function extractPolygons(geometry) {
if (geometry.type == "Polygon") {
return [clonePolygon(geometry, geometry.arcs)];
}
if (geometry.type == "MultiPolygon") {
return geometry.arcs.map(polygonArcs => clonePolygon(geometry, polygonArcs));
}
return [];
}
const mapEdgeArcIds = { left: new Set(), right: new Set() };
const leftEdge = 1;
const rightEdge = sampleTopology.bbox[2] - 1;
sampleTopology.arcs.forEach((arc, i) => {
let isLeft = false, isRight = false;
for (let coord of arc) {
isLeft ||= coord[0] <= leftEdge;
isRight ||= coord[0] >= rightEdge;
}
if (isLeft) {
mapEdgeArcIds.left.add(i);
mapEdgeArcIds.left.add(~i);
}
if (isRight) {
mapEdgeArcIds.right.add(i);
mapEdgeArcIds.right.add(~i);
}
});
const polygonIdsToMerge = new Set();
const currentPolygons = sampleTopology.objects.traced.geometries.map(g => extractPolygons(g)).flat();
const newPolygons = [];
for (let polygon of currentPolygons) {
const arcIds = polygon.arcs.flat();
for (let edge of ["left", "right"]) {
if (arcIds.some(id => mapEdgeArcIds[edge].has(id))) {
const newArcs = arcIds.map(id => getShiftedArcId(id, edge));
newPolygons.push({
type: "Polygon",
arcs: newArcs,
properties: {...polygon.properties, isGenerated: true, sourceEdge: edge, _arcs: newArcs.map(id => sampleTopology.arcs[id]) }
});
polygonIdsToMerge.add(polygon.properties.id);
}
}
}
const polyGroups = _.groupBy(currentPolygons.concat(newPolygons), p => polygonIdsToMerge.has(p.properties.id));
const polygonsToKeep = polyGroups["false"];
const polygonsToMerge = _.groupBy(polyGroups["true"], p => p.properties.id);
//return Object.values(polygonsToMerge)[0].filter(p => p.properties.isGenerated);
//return topojson.mergeArcs(sampleTopology, Object.values(polygonsToMerge)[0]);
//return { sampleTopology, polyGroups, polygonsToKeep, polygonsToMerge };
/*
for (let polygon of currentPolygons) {
if (!polygonIdsToMerge.has(polygon.properties.id)) {
finalPolygons.push(polygon);
continue;
}
else {
}
}
*/
return { currentPolygons, newPolygons, mapEdgeArcIds, polygonIdsToMerge };
}