UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) 1.09 kB
const x=100,b=-.01;export function optimizeWaypointOrder(e){const c=new Map(e),t=Array.from(c.keys());if(t.length<=2)return t;const r=M(t,c);return r.length<4?r:u(r,c)}export function reorderWaypoints(e){if(e.length<=3)return e;const c=e[0],t=e[e.length-1],r=e.slice(1,-1),i=r.map((o,a)=>[String(a),{cx:o.x,cy:o.y}]),n=optimizeWaypointOrder(i).map(o=>r[Number(o)]);return[c,...n,t]}function M(e,c){const t=[e[0]],r=new Set(e);let i=e[0];for(r.delete(e[0]);r.size>0;){const s=c.get(i);let n="",o=1/0;for(const a of r){const l=c.get(a),d=Math.abs(s.cx-l.cx)+Math.abs(s.cy-l.cy);d<o&&(o=d,n=a)}if(!n)break;t.push(n),r.delete(n),i=n}return t}function u(e,c){const t=[...e];let r=!0;for(let i=0;r&&i<100;i++){r=!1;t:for(let s=1;s<t.length-2;s++)for(let n=s+1;n<t.length-1;n++){const o=c.get(t[s-1]),a=c.get(t[s]),l=c.get(t[n]),d=c.get(t[n+1]);if(Math.abs(o.cx-l.cx)+Math.abs(o.cy-l.cy)+Math.abs(a.cx-d.cx)+Math.abs(a.cy-d.cy)-(Math.abs(o.cx-a.cx)+Math.abs(o.cy-a.cy))-(Math.abs(l.cx-d.cx)+Math.abs(l.cy-d.cy))<-.01){for(let f=s,h=n;f<h;f++,h--)[t[f],t[h]]=[t[h],t[f]];r=!0;break t}}}return t}