UNPKG

region2d

Version:

A JavaScript implementation of the Region abstract data type, which GUIs use to perform constructive solid geometry with 2-D rectangles.

2 lines 9.85 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.RegionError=exports.Region2D=exports.Region1D=void 0;var _region1d=require("./region1d"),Region2D=function(){function n(n,r){var e=r===q?n:"undefined"!=typeof n?b(n):R();this._opaque=o(e,q)}var r=void 0,e=void 0,t=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,u=_region1d.RegionError,o=function(n,r){return function(e){if(e===r)return n;throw new u("Illegal access")}},a=function(n){return Array.isArray?Array.isArray(n):n instanceof Array},l=function(n,r){var e=0,t=0,u=i,o=_region1d.Region1D.empty;return function(){if(e>=n.length){if(t>=r.length)return null;var i={row1:o,row2:r[t].region,minY:Math.max(r[t].minY,u),maxY:u=r[t].maxY};return t++,i}if(t>=r.length){var a={row1:n[e].region,row2:o,minY:Math.max(n[e].minY,u),maxY:u=n[e].maxY};return e++,a}var l=n[e],m=r[t],s=Math.max(l.minY,u),f=Math.max(m.minY,u),x=void 0,g=void 0,h=void 0,y=void 0;s===f?(h=s,x=l.region,g=m.region,m.maxY<l.maxY?(u=y=m.maxY,t++):m.maxY===l.maxY?(u=y=l.maxY,e++,t++):(u=y=l.maxY,e++)):f>s?(h=s,x=l.region,g=o,f>=l.maxY?(u=y=l.maxY,e++):u=y=f):(h=f,x=o,g=m.region,s>=m.maxY?(u=y=m.maxY,t++):u=y=s);var c={row1:x,row2:g,minY:h,maxY:y};return c}},m=function(n,r,e){for(var u,o=l(n,r),a=null,m=[],s=t,f=i,x=0,g=0;u=o();){var h=e(u.row1,u.row2);if(!h.isEmpty())if(a&&h.equals(a.region)&&a.maxY==u.minY)a.maxY=u.maxY;else{m.push(a={region:h,minY:u.minY,maxY:u.maxY}),g+=h.getCount();var y=h.getBounds();y.min<s&&(s=y.min),y.max>f&&(f=y.max),x*=23,x+=0|h.getHashCode(),x&=-1}}var c={array:m,count:g,minX:s,minY:m.length?m[0].minY:t,maxX:f,maxY:m.length?m[m.length-1].maxY:i,hash:x};return c},s=function(n,r){return m(n,r,function(n,r){return n.union(r)})},f=function(n,r){return m(n,r,function(n,r){return n.intersect(r)})},x=function(n,r){return m(n,r,function(n,r){return n.xor(r)})},g=function(n,r){return m(n,r,function(n,r){return n.subtract(r)})},h=function(n){var r=[];if(1===n.length){for(var e=n[0].region.getRawSpans(),t=n[0].minY,i=n[0].maxY,u=0;u<e.length;u+=2)r.push({x1:e[u],y1:t,x2:e[u+1],y2:t,kind:"top",key1:null,key2:null,next:null,prev:null,used:!1}),r.push({x1:e[u+1],y1:t,x2:e[u+1],y2:i,kind:"right",key1:null,key2:null,next:null,prev:null,used:!1}),r.push({x1:e[u+1],y1:i,x2:e[u],y2:i,kind:"bottom",key1:null,key2:null,next:null,prev:null,used:!1}),r.push({x1:e[u],y1:i,x2:e[u],y2:t,kind:"left",key1:null,key2:null,next:null,prev:null,used:!1});return r}for(var o=n[0].region.getRawSpans(),a=n[0].minY,l=n[0].maxY,m=0;m<o.length;m+=2)r.push({x1:o[m],y1:a,x2:o[m+1],y2:a,kind:"top",key1:null,key2:null,next:null,prev:null,used:!1}),r.push({x1:o[m+1],y1:a,x2:o[m+1],y2:l,kind:"right",key1:null,key2:null,next:null,prev:null,used:!1}),r.push({x1:o[m],y1:l,x2:o[m],y2:a,kind:"left",key1:null,key2:null,next:null,prev:null,used:!1});for(var s=1,f=n.length;f>s;s++){if(a=n[s].minY,l=n[s].maxY,a>n[s-1].maxY){for(var x=0;x<o.length;x+=2)r.push({x1:o[x+1],y1:n[s-1].maxY,x2:o[x],y2:n[s-1].maxY,kind:"bottom",key1:null,key2:null,next:null,prev:null,used:!1});o=n[s].region.getRawSpans();for(var g=0;g<o.length;g+=2)r.push({x1:o[g],y1:a,x2:o[g+1],y2:a,kind:"top",key1:null,key2:null,next:null,prev:null,used:!1})}else{var h=n[s-1].region.subtract(n[s].region);o=h.getRawSpans();for(var y=0;y<o.length;y+=2)r.push({x1:o[y+1],y1:a,x2:o[y],y2:a,kind:"bottom",key1:null,key2:null,next:null,prev:null,used:!1});h=n[s].region.subtract(n[s-1].region),o=h.getRawSpans();for(var c=0;c<o.length;c+=2)r.push({x1:o[c],y1:a,x2:o[c+1],y2:a,kind:"top",key1:null,key2:null,next:null,prev:null,used:!1})}o=n[s].region.getRawSpans();for(var Y=0;Y<o.length;Y+=2)r.push({x1:o[Y+1],y1:a,x2:o[Y+1],y2:l,kind:"right",key1:null,key2:null,next:null,prev:null,used:!1}),r.push({x1:o[Y],y1:l,x2:o[Y],y2:a,kind:"left",key1:null,key2:null,next:null,prev:null,used:!1})}for(var v=0;v<o.length;v+=2)r.push({x1:o[v+1],y1:l,x2:o[v],y2:l,kind:"bottom",key1:null,key2:null,next:null,prev:null,used:!1});return r},y=function(n){for(var r={},e=0,t=n.length;t>e;e++){var i=n[e];i.key1=i.x1+","+i.y1,i.key2=i.x2+","+i.y2,i.prev=e>0?n[e-1]:null,i.next=t-1>e?n[e+1]:null,i.key1 in r?r[i.key1].push(i):r[i.key1]=[i]}return r},c=function(n,r){for(var e=[],t=n[0],i=n[n.length-1],o=function(n){n.next?n.next.prev=n.prev:i=n.prev,n.prev?n.prev.next=n.next:t=n.next,n.used=!0},a=function(n,r){if(1===r.length&&!r.used)return r[0];for(var e=0,t=r.length;t>e;e++)if(!r[e].used)switch(n.kind){case"top":if("right"===r[e].kind)return r[e];break;case"right":if("bottom"===r[e].kind)return r[e];break;case"bottom":if("left"===r[e].kind)return r[e];break;case"left":if("top"===r[e].kind)return r[e]}for(var i=0,o=r.length;o>i;i++)if(!r[i].used)return r[i];throw new u("Edge generation failure.")};t;){for(var l=[],m=t;"top"!==m.kind;)m=m.next;o(m),l.push({x:m.x1,y:m.y1});for(var s=m,f=m.x1,x=null;s.key2!==m.key1;){var g=r[s.key2];s=a(s,g),o(s),s.x1===f&&f===x?l[l.length-1].y=s.y1:l.push({x:s.x1,y:s.y1}),x=f,f=s.x1}l[0].x===f&&f===x&&l.pop(),e.push(l)}return e},Y=function(n){if(!n.length)return[];var r=h(n),e=y(r),t=c(r,e);return t},v=function(n,r,e,o,a){if(o=Number(o),a=Number(a),!(o>i&&t>o&&a>i&&t>a))throw new u("Invalid translation delta");if(r=Number(r),e=Number(e),!(r>i&&t>r&&0!==r&&e>i&&t>e&&0!==e))throw new u("Invalid scale ratio");for(var l=[],m=0,s=n.length;s>m;m++){var f=n[m];l[m]={region:f.region.transform(r,o),minY:f.minY*e+a,maxY:f.maxY*e+a}}return l},d=function(n,r){return!(n.minX>r.maxX||n.maxX<r.minX||n.minY>r.maxY||n.maxY<r.minY)},p="Cannot construct a Region2D from ",w=p+"invalid rectangle data.",k=p+"a rectangle of zero or negative size.",b=function(n){var r=void 0,e=void 0,t=void 0,i=void 0;if("undefined"!=typeof HTMLElement&&n instanceof HTMLElement){var o=n.getBoundingClientRect();r=window.scrollX+o.left,t=window.scrollY+o.top,e=window.scrollX+o.right,i=window.scrollY+o.bottom}else if(a(n)){if(4!==n.length)throw new u(w);r=Number(n[0]),t=Number(n[1]),e=Number(n[2]),i=Number(n[3])}else if("left"in n)r=Number(n.left),t=Number(n.top),e=Number(n.right),i=Number(n.bottom);else{if(!("x"in n))throw new u(w);r=Number(n.x),t=Number(n.y),e=r+Number(n.width),i=t+Number(n.height)}if(r>=e||t>=i)throw new u(k);var l=new _region1d.Region1D([r,e]),m={array:[{region:l,minY:t,maxY:i}],count:1,minX:r,minY:t,maxX:e,maxY:i,hash:l.getHashCode()};return m},R=function(){return{array:[],count:0,minX:t,minY:t,maxX:i,maxY:i,hash:0}},N="Invalid row data for row ",X=function(n){for(var r=i,e=0,u=t,o=i,a=0,l=[],m=0,s=n.length;s>m;m++){var f=n[m];if(f.minY<r||f.minY>=f.maxY||!(f.region instanceof _region1d.Region1D))throw new _region1d.RegionError(N+m);l.push({region:f.region,minY:f.minY,maxY:f.maxY});var x=f.region.getCount();if(!x)throw new _region1d.RegionError(N+m);e+=x;var g=f.region.getBounds();g.min<u&&(u=g.min),g.max>o&&(o=g.max),a*=23,a+=0|f.region.getHashCode(),a&=-1,r=f.maxY}return{array:l,count:e,minX:u,minY:l.length?l[0].minY:t,maxX:o,maxY:l.length?l[l.length-1].maxY:i,hash:a}},I=function(n){return{x:n.minX,y:n.minY,width:n.maxX-n.minX,height:n.maxY-n.minY,left:n.minX,top:n.minY,right:n.maxX,bottom:n.maxY}},_=function(n){for(var r=[],e=0,t=n.length;t>e;e++){var i=n[e];r.push({minY:i.minY,maxY:i.maxY,region:i.region})}return r},E=function(n){for(var r=[],e=0,t=n.length;t>e;e++){var i=n[e];i.region.getAsRects(i.minY,i.maxY,r)}return r},D=function(n){return n.minX===i||n.minY===i||n.maxX===t||n.maxY===t},C=function(n,r){if(n.length!=r.length)return!1;for(var e=0,t=n.length;t>e;e++){if(n[e].minY!==r[e].minY||n[e].maxY!==r[e].maxY)return!1;if(!n[e].region.equals(r[e].region))return!1}return!0},A=function(n,r){return!!f(n.array,r.array).array.length},M=function(n,r,e){var t=n.array;if(!t.length)return!1;if(e<n.minY||e>n.maxY||r<n.minX||r>n.maxX)return!1;if(t.length<=5){for(var i=0,u=t.length;u>i;i++)if(e>=t[i].minY&&e<t[i].maxY)return t[i].region.isPointIn(r);return!1}for(var o=0,a=t.length;a>o;){var l=(o+a)/2&-1,m=t[l];if(e>=m.minY&&e<m.maxY)return m.region.isPointIn(r);e<m.minY?a=l:o=l+1}return!1},S=function(r){if(!(r instanceof n))throw new u("Object must be a Region2D instance.")},q={},H=function(n){return n._opaque(q)};return n.prototype={union:function(r){S(r);var e=H(this),t=H(r);return new n(s(e.array,t.array),q)},intersect:function(r){S(r);var t=H(this),i=H(r);return d(t,i)?new n(f(t.array,i.array),q):e},subtract:function(r){S(r);var e=H(this),t=H(r);return d(e,t)?new n(g(e.array,t.array),q):this},xor:function(r){S(r);var e=H(this),t=H(r);return new n(x(e.array,t.array),q)},not:function(){var e=H(this),t=H(r);return new n(x(e.array,t.array),q)},transform:function(r,e,t,i){var u=H(this);return new n(X(v(u.array,r,e,t,i)),q)},translate:function(r,e){var t=H(this);return new n(X(v(t.array,1,1,r,e)),q)},scale:function(r,e){var t=H(this);return new n(X(v(t.array,r,e,0,0)),q)},isEmpty:function(){return!H(this).array.length},isInfinite:function(){return D(H(this))},isFinite:function(){return!D(H(this))},isRectangular:function(){return 1===H(this).count},doesIntersect:function(n){return S(n),A(H(this),H(n))},isPointIn:function(n,r){return M(H(this),Number(n),Number(r))},equals:function(n){S(n);var r=H(this),e=H(n);return r===e?!0:r.hash!==e.hash||r.count!==e.count?!1:C(r.array,e.array)},getCount:function(){return H(this).count},getRects:function(){return E(H(this).array)},getRawRows:function(){return _(H(this).array)},getBounds:function(){return I(H(this))},getPath:function(){return Y(H(this).array)},getHashCode:function(){return H(this).hash}},n.infinite=r=new n([i,i,t,t]),n.empty=e=new n,n.fromRects=function(r){if(!r.length)return e;for(var t=new n(r[0]),i=1,u=r.length;u>i;i++)t=t.union(new n(r[i]));return t},n.fromRawRows=function(r){return new n(X(r),q)},n}();exports["default"]=Region2D,exports.Region1D=_region1d.Region1D,exports.Region2D=Region2D,exports.RegionError=_region1d.RegionError; //# sourceMappingURL=lib/region2d.min.js.map