UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

2 lines 2.35 kB
import{Point as e}from"./Point.min.mjs";import{createVector as t}from"./util/misc/vectors.min.mjs";var n=class n{constructor(e){this.status=e,this.points=[]}includes(e){return this.points.some(t=>t.eq(e))}append(...e){return this.points=this.points.concat(e.filter(e=>!this.includes(e))),this}static isPointContained(e,n,r,i=!1){if(n.eq(r))return e.eq(n);if(n.x===r.x)return e.x===n.x&&(i||e.y>=Math.min(n.y,r.y)&&e.y<=Math.max(n.y,r.y));if(n.y===r.y)return e.y===n.y&&(i||e.x>=Math.min(n.x,r.x)&&e.x<=Math.max(n.x,r.x));{let a=t(n,r),o=t(n,e).divide(a);return i?Math.abs(o.x)===Math.abs(o.y):o.x===o.y&&o.x>=0&&o.x<=1}}static isPointInPolygon(t,n){let r=new e(t).setX(Math.min(t.x-1,...n.map(e=>e.x))),i=0;for(let e=0;e<n.length;e++){let a=this.intersectSegmentSegment(n[e],n[(e+1)%n.length],t,r);if(a.includes(t))return!0;i+=Number(a.status===`Intersection`)}return i%2==1}static intersectLineLine(t,r,i,a,o=!0,s=!0){let c=r.x-t.x,l=r.y-t.y,u=a.x-i.x,d=a.y-i.y,f=t.x-i.x,p=t.y-i.y,m=u*p-d*f,h=c*p-l*f,g=d*c-u*l;if(g!==0){let r=m/g,i=h/g;return(o||0<=r&&r<=1)&&(s||0<=i&&i<=1)?new n(`Intersection`).append(new e(t.x+r*c,t.y+r*l)):new n}return new n(m===0||h===0?o||s||n.isPointContained(t,i,a)||n.isPointContained(r,i,a)||n.isPointContained(i,t,r)||n.isPointContained(a,t,r)?`Coincident`:void 0:`Parallel`)}static intersectSegmentLine(e,t,r,i){return n.intersectLineLine(e,t,r,i,!1,!0)}static intersectSegmentSegment(e,t,r,i){return n.intersectLineLine(e,t,r,i,!1,!1)}static intersectLinePolygon(e,t,r,i=!0){let a=new n,o=r.length;for(let s,c,l,u=0;u<o;u++){if(s=r[u],c=r[(u+1)%o],l=n.intersectLineLine(e,t,s,c,i,!1),l.status===`Coincident`)return l;a.append(...l.points)}return a.points.length>0&&(a.status=`Intersection`),a}static intersectSegmentPolygon(e,t,r){return n.intersectLinePolygon(e,t,r,!1)}static intersectPolygonPolygon(e,t){let r=new n,i=e.length,a=[];for(let o=0;o<i;o++){let s=e[o],c=e[(o+1)%i],l=n.intersectSegmentPolygon(s,c,t);l.status===`Coincident`?(a.push(l),r.append(s,c)):r.append(...l.points)}return a.length>0&&a.length===e.length?new n(`Coincident`):(r.points.length>0&&(r.status=`Intersection`),r)}static intersectPolygonRectangle(t,r,i){let a=r.min(i),o=r.max(i),s=new e(o.x,a.y),c=new e(a.x,o.y);return n.intersectPolygonPolygon(t,[a,s,o,c])}};export{n as Intersection}; //# sourceMappingURL=Intersection.min.mjs.map