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
JavaScript
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==