UNPKG

rabbit-ear

Version:
49 lines (45 loc) 1.43 kB
/* Rabbit Ear 0.9.4 alpha 2024-04-20 (c) Kraft, GNU GPLv3 License */ import { EPSILON } from '../../math/constant.js'; import { includeS, epsilonEqual } from '../../math/compare.js'; import { intersectLineLine } from '../../math/intersect.js'; import { edgesToLines2 } from '../edges/lines.js'; import { makeVerticesEdgesUnsorted } from '../make/verticesEdges.js'; const intersectAllEdges = ({ vertices_coords, vertices_edges, edges_vertices, }, epsilon = EPSILON) => { if (!vertices_edges) { vertices_edges = makeVerticesEdgesUnsorted({ edges_vertices }); } const edgesEdgesLookup = edges_vertices.map(() => ({})); edges_vertices.forEach((vertices, e) => vertices .flatMap(v => vertices_edges[v]) .forEach(edge => { edgesEdgesLookup[e][edge] = true; edgesEdgesLookup[edge][e] = true; })); const lines = edgesToLines2({ vertices_coords, edges_vertices }); const results = []; for (let i = 0; i < edges_vertices.length - 1; i += 1) { for (let j = i + 1; j < edges_vertices.length; j += 1) { if (edgesEdgesLookup[i][j]) { continue; } const { a, b, point } = intersectLineLine( lines[i], lines[j], includeS, includeS, epsilon, ); if (point) { if ((epsilonEqual(a, 0) || epsilonEqual(a, 1)) && (epsilonEqual(b, 0) || epsilonEqual(b, 1))) { continue; } results.push({ i, j, a, b, point }); } } } return results; }; export { intersectAllEdges };