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 4.88 kB
"use strict";function RegionError(r){this.message=(this.name="RegionError")+": "+r;var n=String((new Error).stack).split("\n");n.shift(),n.shift(),this.stack=n.join("\n")}Object.defineProperty(exports,"__esModule",{value:!0}),RegionError.prototype=Object.create?Object.create(Error.prototype):new Error;var Region1D=function(){function r(r,a,u){if(a===I)"number"!=typeof u&&(u=m(r));else{if("undefined"!=typeof a||"undefined"!=typeof u)throw new e("Illegal access");x(r),u=m(r)}this._opaque=i({array:r,min:r.length?r[0]:n,max:r.length?r[r.length-1]:t,hash:u},I)}var n=Number.POSITIVE_INFINITY,t=Number.NEGATIVE_INFINITY,e=RegionError,i=function(r,n){return function(t){if(t===n)return r;throw new e("Illegal access")}},a=function(r){return Array.isArray?Array.isArray(r):r instanceof Array},u=function(r,n){var t=0,e=0;return function(){return t>=r.length&&e>=n.length?null:t>=r.length?{x:n[e],kind:1&e++?-1:1,src:2}:e>=n.length||r[t]<n[e]?{x:r[t],kind:1&t++?-1:1,src:1}:{x:n[e],kind:1&e++?-1:1,src:2}}},o=function(r,n,t){if(!r.length&&!n.length)return[];var e=u(r,n),i=0,a=0,o=0,s=0,f=e(),h=[];do{1===f.src?i+=f.kind:a+=f.kind;for(var c=void 0;(c=e())&&c.x===f.x;)1===c.src?i+=c.kind:a+=c.kind;s=o,o=t(i,a),o!==s&&h.push(f.x),f=c}while(f);return h},s=function(r,n){return o(r,n,function(r,n){return r|n})},f=function(r,n){return o(r,n,function(r,n){return r&n})},h=function(r,n){return o(r,n,function(r,n){return r^n})},c=function(r,n){return o(r,n,function(r,n){return r&~n})},l=function(r,n,t){if(!r.length||!n.length)return"";if(r[r.length-1]<n[0]||n[n.length-1]<r[0])return"";var e=0,i=0,a=u(r,n),o=a(),s=3;do{1===o.src?e+=o.kind:i+=o.kind;for(var f=void 0;(f=a())&&f.x===o.x;)1===f.src?e+=f.kind:i+=f.kind;if(e&i){if(s|=4,t)return"intersect"}else i&~e?s&=-2:e&~i&&(s&=-3);o=f}while(o);switch(s){case 4:return"intersect";case 5:return"a-contain-b";case 6:return"b-contain-a";case 7:return"equal";default:return""}},g=function(r,n){if(!r.length)return!1;if(n<r[0]||n>r[r.length-1])return!1;if(r.length<=8){for(var t=0,e=r.length;e>t;t+=2)if(n>=r[t]&&n<r[t+1])return!0;return!1}for(var i=0,a=r.length,u=0;a>i;){var o=(i+a)/2&-1,s=r[o];if(n===s){u=o;break}s>n?a=o:(u=o,i=o+1)}return!(1&u)},y=function(r){var e=[],i=0;if(!r.length)return e.push(t),e.push(n),e;for(r[i]!=t?e.push(t):i++;i<r.length-1;)e.push(r[i++]);return r[i]!=n&&(e.push(r[i++]),e.push(n)),e},v=function(r,i,a){if(a=Number(a),!(a>t&&n>a))throw new e("Invalid translation delta");if(i=Number(i),!(i>t&&n>i)||0===i)throw new e("Invalid scale ratio");for(var u=[],o=0,s=r.length;s>o;o++)u[o]=r[o]*i+a;return u},d=function(r,n){if(r.length!==n.length)return!1;for(var t=0,e=r.length;e>t;t++)if(r[t]!==n[t])return!1;return!0},p=function(r,n,t,e){for(var i=t-n,a=0,u=r.length;u>a;a+=2){var o=r[a],s=r[a+1];e.push({x:o,y:n,width:s-o,height:i,left:o,top:n,right:s,bottom:t})}return e},w=function(r){for(var n=[],t=0,e=r.length;e>t;t+=2)n.push(r[t]),n.push(r[t+1]);return n},m=function(r){for(var n=0,t=0,e=r.length;e>t;t++)n*=23,n+=0|r[t],n&=-1;return n},b=function(n){if(!(n instanceof r))throw new e("Object must be a Region1D instance.")},x=function(r){var n="Expected an ordered array of numeric start/end pairs.",t="Array start/end pairs are not in strictly ascending order.";if(!a(r)||1&r.length)throw new e(n);if(0!=r.length){var i=r[0];if("number"!=typeof i)throw new e(n);for(var u=1,o=r.length;o>u;u++){var s=r[u];if("number"!=typeof s)throw new e(n);if(i>=s)throw new e(t);i=s}}},I={},k=function(r){return r._opaque(I)};return r.prototype={union:function(n){b(n);var t=k(this),e=k(n);return new r(s(t.array,e.array),I)},intersect:function(n){b(n);var t=k(this),e=k(n);return new r(f(t.array,e.array),I)},subtract:function(n){b(n);var t=k(this),e=k(n);return new r(c(t.array,e.array),I)},xor:function(n){b(n);var t=k(this),e=k(n);return new r(h(t.array,e.array),I)},not:function(){var n=k(this);return new r(y(n.array),I)},transform:function(n,t){var e=k(this);return new r(v(e.array,n,t))},translate:function(n){var t=k(this);return new r(v(t.array,1,n))},scale:function(n){var t=k(this);return new r(v(t.array,n,0))},isEmpty:function(){return!k(this).array.length},getCount:function(){return k(this).array.length>>1},doesIntersect:function(r){return b(r),!!l(k(this).array,k(r).array,!0)},relate:function(r){return b(r),l(k(this).array,k(r).array,!1)},isPointIn:function(r){return g(k(this).array,Number(r))},equals:function(r){b(r);var n=k(this),t=k(r);return n===t?!0:n.hash!==t.hash?!1:d(n.array,t.array)},getRawSpans:function(){var r=k(this);return w(r.array)},getAsRects:function(r,n,t){var e=k(this);return p(e.array,r,n,t||[])},getBounds:function(){var r=k(this);return{min:r.min,max:r.max}},getHashCode:function(){return k(this).hash}},r.empty=new r([],I,0),r}();exports["default"]=Region1D,exports.RegionError=RegionError,exports.Region1D=Region1D; //# sourceMappingURL=lib/region1d.min.js.map