UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

59 lines (46 loc) 6.15 kB
import Graph from './graph'; import getEdgesOfSubgraphs from './get-edges-of-subgraphs'; import graphCycles from './graph-cycles'; import { List } from 'immutable'; export default function calculateInnerCycles(verticesArray, edgesArray) { var innerCycles = new List(); var graph = new Graph(verticesArray.length); edgesArray.forEach(function (line) { graph.addEdge(line[0], line[1]); graph.addEdge(line[1], line[0]); }); graph.BCC(); var subgraphs = graph.subgraphs.filter(function (subgraph) { return subgraph.length >= 3; }); var edgesOfSubgraphsArray = getEdgesOfSubgraphs(subgraphs, graph); var edges = []; edgesOfSubgraphsArray.forEach(function (es) { es.forEach(function (edge) { return edges.push(edge); }); }); var cycles = graphCycles(verticesArray, edges); cycles.v_cycles.forEach(function (cycle) { cycle.shift(); innerCycles = innerCycles.push(cycle); }); return innerCycles; } export function isClockWiseOrder(innerCycleWithCoords) { // See: https://stackoverflow.com/a/1165943 and http://blog.element84.com/polygon-winding.html var i = 0; var twiceEnclosedArea = 0; var size = innerCycleWithCoords.size; for (i = 0; i < size; i++) { var _innerCycleWithCoords = innerCycleWithCoords.get(i), x1 = _innerCycleWithCoords.x, y1 = _innerCycleWithCoords.y; var _innerCycleWithCoords2 = innerCycleWithCoords.get((i + 1) % size), x2 = _innerCycleWithCoords2.x, y2 = _innerCycleWithCoords2.y; twiceEnclosedArea += (x2 - x1) * (y2 + y1); } return twiceEnclosedArea > 0; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9ncmFwaC1pbm5lci1jeWNsZXMuanMiXSwibmFtZXMiOlsiR3JhcGgiLCJnZXRFZGdlc09mU3ViZ3JhcGhzIiwiZ3JhcGhDeWNsZXMiLCJMaXN0IiwiY2FsY3VsYXRlSW5uZXJDeWNsZXMiLCJ2ZXJ0aWNlc0FycmF5IiwiZWRnZXNBcnJheSIsImlubmVyQ3ljbGVzIiwiZ3JhcGgiLCJsZW5ndGgiLCJmb3JFYWNoIiwiYWRkRWRnZSIsImxpbmUiLCJCQ0MiLCJzdWJncmFwaHMiLCJmaWx0ZXIiLCJzdWJncmFwaCIsImVkZ2VzT2ZTdWJncmFwaHNBcnJheSIsImVkZ2VzIiwiZXMiLCJwdXNoIiwiZWRnZSIsImN5Y2xlcyIsInZfY3ljbGVzIiwiY3ljbGUiLCJzaGlmdCIsImlzQ2xvY2tXaXNlT3JkZXIiLCJpbm5lckN5Y2xlV2l0aENvb3JkcyIsImkiLCJ0d2ljZUVuY2xvc2VkQXJlYSIsInNpemUiLCJnZXQiLCJ4MSIsIngiLCJ5MSIsInkiLCJ4MiIsInkyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxLQUFQLE1BQWtCLFNBQWxCO0FBQ0EsT0FBT0MsbUJBQVAsTUFBZ0MsMEJBQWhDO0FBQ0EsT0FBT0MsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxTQUFRQyxJQUFSLFFBQW1CLFdBQW5COztBQUVBLGVBQWUsU0FBU0Msb0JBQVQsQ0FBOEJDLGFBQTlCLEVBQTZDQyxVQUE3QyxFQUF5RDtBQUN0RSxNQUFJQyxjQUFjLElBQUlKLElBQUosRUFBbEI7O0FBRUEsTUFBSUssUUFBUSxJQUFJUixLQUFKLENBQVVLLGNBQWNJLE1BQXhCLENBQVo7QUFDQUgsYUFBV0ksT0FBWCxDQUFtQixnQkFBUTtBQUN6QkYsVUFBTUcsT0FBTixDQUFjQyxLQUFLLENBQUwsQ0FBZCxFQUF1QkEsS0FBSyxDQUFMLENBQXZCO0FBQ0FKLFVBQU1HLE9BQU4sQ0FBY0MsS0FBSyxDQUFMLENBQWQsRUFBdUJBLEtBQUssQ0FBTCxDQUF2QjtBQUNELEdBSEQ7O0FBS0FKLFFBQU1LLEdBQU47O0FBRUEsTUFBSUMsWUFBWU4sTUFBTU0sU0FBTixDQUFnQkMsTUFBaEIsQ0FBdUI7QUFBQSxXQUFZQyxTQUFTUCxNQUFULElBQW1CLENBQS9CO0FBQUEsR0FBdkIsQ0FBaEI7QUFDQSxNQUFJUSx3QkFBd0JoQixvQkFBb0JhLFNBQXBCLEVBQStCTixLQUEvQixDQUE1Qjs7QUFFQSxNQUFJVSxRQUFRLEVBQVo7QUFDQUQsd0JBQXNCUCxPQUF0QixDQUE4QixjQUFNO0FBQ2xDUyxPQUFHVCxPQUFILENBQVc7QUFBQSxhQUFRUSxNQUFNRSxJQUFOLENBQVdDLElBQVgsQ0FBUjtBQUFBLEtBQVg7QUFDRCxHQUZEOztBQUlBLE1BQUlDLFNBQVNwQixZQUFZRyxhQUFaLEVBQTJCYSxLQUEzQixDQUFiO0FBQ0FJLFNBQU9DLFFBQVAsQ0FBZ0JiLE9BQWhCLENBQXdCLGlCQUFTO0FBQy9CYyxVQUFNQyxLQUFOO0FBQ0FsQixrQkFBY0EsWUFBWWEsSUFBWixDQUFpQkksS0FBakIsQ0FBZDtBQUNELEdBSEQ7O0FBS0EsU0FBT2pCLFdBQVA7QUFDRDs7QUFFRCxPQUFPLFNBQVNtQixnQkFBVCxDQUEwQkMsb0JBQTFCLEVBQWdEO0FBQ3JEOztBQUVBLE1BQUlDLElBQUksQ0FBUjtBQUNBLE1BQUlDLG9CQUFvQixDQUF4QjtBQUNBLE1BQUlDLE9BQU9ILHFCQUFxQkcsSUFBaEM7O0FBRUEsT0FBS0YsSUFBSSxDQUFULEVBQVlBLElBQUlFLElBQWhCLEVBQXNCRixHQUF0QixFQUEyQjtBQUFBLGdDQUVGRCxxQkFBcUJJLEdBQXJCLENBQXlCSCxDQUF6QixDQUZFO0FBQUEsUUFFaEJJLEVBRmdCLHlCQUVuQkMsQ0FGbUI7QUFBQSxRQUVUQyxFQUZTLHlCQUVaQyxDQUZZOztBQUFBLGlDQUdGUixxQkFBcUJJLEdBQXJCLENBQXlCLENBQUNILElBQUksQ0FBTCxJQUFVRSxJQUFuQyxDQUhFO0FBQUEsUUFHaEJNLEVBSGdCLDBCQUduQkgsQ0FIbUI7QUFBQSxRQUdUSSxFQUhTLDBCQUdaRixDQUhZOztBQUt6Qk4seUJBQXFCLENBQUNPLEtBQUtKLEVBQU4sS0FBYUssS0FBS0gsRUFBbEIsQ0FBckI7QUFDRDs7QUFFRCxTQUFPTCxvQkFBb0IsQ0FBM0I7QUFDRCIsImZpbGUiOiJncmFwaC1pbm5lci1jeWNsZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR3JhcGggZnJvbSAnLi9ncmFwaCc7XG5pbXBvcnQgZ2V0RWRnZXNPZlN1YmdyYXBocyBmcm9tICcuL2dldC1lZGdlcy1vZi1zdWJncmFwaHMnO1xuaW1wb3J0IGdyYXBoQ3ljbGVzIGZyb20gJy4vZ3JhcGgtY3ljbGVzJztcbmltcG9ydCB7TGlzdH0gZnJvbSAnaW1tdXRhYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY2FsY3VsYXRlSW5uZXJDeWNsZXModmVydGljZXNBcnJheSwgZWRnZXNBcnJheSkge1xuICBsZXQgaW5uZXJDeWNsZXMgPSBuZXcgTGlzdCgpO1xuXG4gIGxldCBncmFwaCA9IG5ldyBHcmFwaCh2ZXJ0aWNlc0FycmF5Lmxlbmd0aCk7XG4gIGVkZ2VzQXJyYXkuZm9yRWFjaChsaW5lID0+IHtcbiAgICBncmFwaC5hZGRFZGdlKGxpbmVbMF0sIGxpbmVbMV0pO1xuICAgIGdyYXBoLmFkZEVkZ2UobGluZVsxXSwgbGluZVswXSk7XG4gIH0pO1xuXG4gIGdyYXBoLkJDQygpO1xuXG4gIGxldCBzdWJncmFwaHMgPSBncmFwaC5zdWJncmFwaHMuZmlsdGVyKHN1YmdyYXBoID0+IHN1YmdyYXBoLmxlbmd0aCA+PSAzKTtcbiAgbGV0IGVkZ2VzT2ZTdWJncmFwaHNBcnJheSA9IGdldEVkZ2VzT2ZTdWJncmFwaHMoc3ViZ3JhcGhzLCBncmFwaCk7XG5cbiAgbGV0IGVkZ2VzID0gW107XG4gIGVkZ2VzT2ZTdWJncmFwaHNBcnJheS5mb3JFYWNoKGVzID0+IHtcbiAgICBlcy5mb3JFYWNoKGVkZ2UgPT4gZWRnZXMucHVzaChlZGdlKSlcbiAgfSk7XG5cbiAgbGV0IGN5Y2xlcyA9IGdyYXBoQ3ljbGVzKHZlcnRpY2VzQXJyYXksIGVkZ2VzKTtcbiAgY3ljbGVzLnZfY3ljbGVzLmZvckVhY2goY3ljbGUgPT4ge1xuICAgIGN5Y2xlLnNoaWZ0KCk7XG4gICAgaW5uZXJDeWNsZXMgPSBpbm5lckN5Y2xlcy5wdXNoKGN5Y2xlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGlubmVyQ3ljbGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDbG9ja1dpc2VPcmRlcihpbm5lckN5Y2xlV2l0aENvb3Jkcykge1xuICAvLyBTZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTY1OTQzIGFuZCBodHRwOi8vYmxvZy5lbGVtZW50ODQuY29tL3BvbHlnb24td2luZGluZy5odG1sXG5cbiAgbGV0IGkgPSAwO1xuICBsZXQgdHdpY2VFbmNsb3NlZEFyZWEgPSAwO1xuICBsZXQgc2l6ZSA9IGlubmVyQ3ljbGVXaXRoQ29vcmRzLnNpemU7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xuXG4gICAgbGV0IHsgeDogeDEsIHk6IHkxIH0gPSBpbm5lckN5Y2xlV2l0aENvb3Jkcy5nZXQoaSk7XG4gICAgbGV0IHsgeDogeDIsIHk6IHkyIH0gPSBpbm5lckN5Y2xlV2l0aENvb3Jkcy5nZXQoKGkgKyAxKSAlIHNpemUpO1xuXG4gICAgdHdpY2VFbmNsb3NlZEFyZWEgKz0gKHgyIC0geDEpICogKHkyICsgeTEpO1xuICB9XG5cbiAgcmV0dXJuIHR3aWNlRW5jbG9zZWRBcmVhID4gMDtcbn1cbiJdfQ==