@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 997 B
JavaScript
import{lineAngle as u,lineLength as a}from"simple-geometry";export const toNodeId=n=>`${n.layer}_${n.x}_${n.y}`;const f=1;export const arePointsClose=(n,e)=>n.layer===e.layer&&a(n,e)<=f,matchesLine=(n,e,t)=>arePointsClose(n.p0,e)&&arePointsClose(n.p1,t)||arePointsClose(n.p0,t)&&arePointsClose(n.p1,e);export function findLineByEndpoints(n,e,t){return n.find(o=>matchesLine(o,e,t))}const p=5;export function canMergeSegments(n,e){if(n.virtual!==e.virtual)return!1;const t=u(n.p0,n.p1),o=u(e.p0,e.p1);let i=Math.abs(o-t);return i>180&&(i=360-i),i<=p}export function buildRouteSegments(n,e){const t=[];for(let o=1;o<n.length;o++){const i=n[o-1],s=n[o],r=findLineByEndpoints(e,i,s);if(!r){console.warn(`WF: buildRouteSegments \u2014 no line found between ${toNodeId(i)} and ${toNodeId(s)}`);continue}const c={p0:i,p1:s,unaccessible:r.unaccessible,unidirection:r.unidirection,virtual:r.virtual,weight:r.weight},l=t[t.length-1];l&&canMergeSegments(l,c)?t[t.length-1]={...l,p1:c.p1}:t.push(c)}return t}