@2gis/general
Advanced tools
Comparing version 0.1.0 to 0.2.0
@@ -1,2 +0,2 @@ | ||
!function(r,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.General=e():r.General=e()}(this,function(){return function(r){function e(t){if(n[t])return n[t].exports;var o=n[t]={i:t,l:!1,exports:{}};return r[t].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=r,e.c=n,e.d=function(r,n,t){e.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:t})},e.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return e.d(n,"a",n),n},e.o=function(r,e){return Object.prototype.hasOwnProperty.call(r,e)},e.p="/dist/",e(e.s=1)}([function(r,e,n){"use strict";n.d(e,"a",function(){return t}),n.d(e,"b",function(){return o});var t={pixelPositionX:0,pixelPositionY:1,groupIndex:2,iconIndex:3,prevGroupIndex:4},o=Object.keys(t).length},function(r,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var t=n(2);n.d(e,"General",function(){return t.a})},function(r,e,n){"use strict";n.d(e,"a",function(){return a});var t=n(0),o=n(3),i=n.n(o),a=function(){function r(){var r=this;this.worker=i()(4),this.queue=[],this.currentJob=void 0,this.markerArray=new Float32Array(1e3*t.b),this.worker.onmessage=function(e){if(void 0!==r.currentJob){var n=r.currentJob,t=n.markers,o=n.resolve;r.recordResult(t,e.data),r.markerArray=e.data,r.currentJob=void 0,r.dequeue(),o()}}}return r.prototype.generalize=function(r,e,n,t,o){var i=this,a={bounds:r,pixelRatio:e,priorityGroups:n,sprites:t};return new Promise(function(r){i.queue.push({message:a,markers:o,resolve:r}),i.dequeue()})},r.prototype.clear=function(){this.queue=[]},r.prototype.pack=function(r){r.length*t.b>this.markerArray.length&&(this.markerArray=new Float32Array(r.length*t.b));for(var e=this.markerArray,n=0,o=0;n<r.length;n++,o+=t.b){var i=r[n],a=i.iconIndex,u=i.prevGroupIndex;this.markerArray[o+t.a.pixelPositionX]=i.pixelPosition[0],this.markerArray[o+t.a.pixelPositionY]=i.pixelPosition[1],e[o+t.a.groupIndex]=i.groupIndex,e[o+t.a.iconIndex]=void 0!==a?a:NaN,e[o+t.a.prevGroupIndex]=void 0!==u?u:NaN}},r.prototype.dequeue=function(){if(void 0===this.currentJob){var r=this.queue.shift();if(void 0!==r){this.pack(r.markers);var e=r.message;e.markers=this.markerArray,e.markerCount=r.markers.length,this.worker.postMessage(e,[e.markers.buffer]),this.currentJob=r}}},r.prototype.recordResult=function(r,e){for(var n=0,o=0;n<r.length;n++,o+=t.b){var i=e[o+t.a.iconIndex],a=e[o+t.a.prevGroupIndex];r[n].iconIndex=i!==i?void 0:i,r[n].prevGroupIndex=a!==a?void 0:a}},r}()},function(r,e,n){function t(r){function e(t){if(n[t])return n[t].exports;var o=n[t]={i:t,l:!1,exports:{}};return r[t].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};e.m=r,e.c=n,e.i=function(r){return r},e.d=function(r,n,t){e.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:t})},e.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return e.d(n,"a",n),n},e.o=function(r,e){return Object.prototype.hasOwnProperty.call(r,e)},e.p="/",e.oe=function(r){throw console.error(r),r};var t=e(e.s=ENTRY_MODULE);return t.default||t}function o(r){return(r+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function i(r){var e=[],n=r.toString(),t=n.match(/^function\s?\(\w+,\s*\w+,\s*(\w+)\)/);if(!t)return e;for(var i,a=t[1],u=new RegExp("(\\\\n|\\W)"+o(a)+"\\((/\\*.*?\\*/)?s?.*?([\\.|\\-|\\w|/|@]+).*?\\)","g");i=u.exec(n);)e.push(i[3]);return e}function a(r,e){for(var n=[e],t=[],o={};n.length;){var a=n.pop();if(!o[a]&&r[a]){o[a]=!0,t.push(a);var u=i(r[a]);n=n.concat(u)}}return t}r.exports=function(r,e){e=e||{};var o=n.m,i=e.all?Object.keys(o):a(o,r),u="("+t.toString().replace("ENTRY_MODULE",JSON.stringify(r))+")({"+i.map(function(r){return JSON.stringify(r)+": "+o[r].toString()}).join(",")+"})(self);",s=new window.Blob([u],{type:"text/javascript"});if(e.bare)return s;var c=window.URL||window.webkitURL||window.mozURL||window.msURL,f=c.createObjectURL(s),p=new window.Worker(f);return p.objectURL=f,p}},function(r,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var t=n(5);e.default=function(r){r.onmessage=function(e){var n=e.data;Object(t.a)(n),r.postMessage(n.markers)}}},function(r,e,n){"use strict";function t(r){for(var e=r.bounds,n=r.pixelRatio,t=r.priorityGroups,l=r.sprites,m=r.markers,x=r.markerCount,v=1+(e.maxX-e.minX>>3)<<3,b=e.maxY-e.minY,h=v*b+8>>3,y=new Uint8Array(h),g=new Uint8Array(h),w=new Uint8Array(h),k=0;k<x;k++){var Y=m[k*c.b+c.a.prevGroupIndex],I=m[k*c.b+c.a.pixelPositionX],X=m[k*c.b+c.a.pixelPositionY];if(!a(Y)){var P=t[Y],j=P.iconIndex,O=P.margin,A=P.degradation,G=l[j];if(!G)continue;var R=G.size,U=G.anchor,_=G.pixelDensity;s(p,v,b,n,R,U,_,I,X,O),u(p)||i(y,v,p),s(d,v,b,n,R,U,_,I,X,A),u(d)||i(w,v,d)}}for(var k=0;k<t.length;k++){var J=t[k],L=J.safeZone,j=J.iconIndex,O=J.margin,A=J.degradation,G=l[j];if(G){var R=G.size,U=G.anchor,_=G.pixelDensity;g.set(w);for(var M=0;M<x;M++){var N=M*c.b,q=m[N+c.a.groupIndex],Y=m[N+c.a.prevGroupIndex],I=m[N+c.a.pixelPositionX],X=m[N+c.a.pixelPositionY];q>k||!a(Y)||(s(p,v,b,n,R,U,_,I,X,O),u(p)||q===k&&o(g,v,p)||(s(f,v,b,n,R,U,_,I,X,L),u(f)||o(y,v,f)||(s(d,v,b,n,R,U,_,I,X,A),i(y,v,p),i(w,v,d),m[N+c.a.iconIndex]=j,m[N+c.a.prevGroupIndex]=k)))}}}}function o(r,e,n){for(var t=n.minX,o=n.minY,i=n.maxX,a=n.maxY,u=o;u<a;u++){var s=u*e+t>>3,c=u*e+i>>3,f=0;if(s===c)f=r[s]&255>>(7&t)&255<<8-(7&i);else{f=r[s]&255>>(7&t);for(var p=s+1;p<c;p++)f=r[p]|f;f=r[c]&255<<8-(7&i)|f}if(0!==f)return!0}return!1}function i(r,e,n){for(var t=n.minX,o=n.minY,i=n.maxX,a=n.maxY,u=o;u<a;u++){var s=u*e+t>>3,c=u*e+i>>3;if(s===c)r[s]=r[s]|255>>(7&t)&255<<8-(7&i);else{r[s]=r[s]|255>>(7&t);for(var f=s+1;f<c;f++)r[f]=255;r[c]=r[c]|255<<8-(7&i)}}}function a(r){return r!==r}function u(r){return r.minX===r.maxX||r.minY===r.maxY}function s(r,e,n,t,o,i,a,u,s,c){var f=t/a,p=u*t-o[0]*f*i[0]-c|0,d=s*t-o[1]*f*i[1]-c|0,l=u*t+o[0]*f*(1-i[0])+c|0,m=s*t+o[1]*f*(1-i[1])+c|0;r.minX=p>0?p<e?p:e:0,r.minY=d>0?d<n?d:n:0,r.maxX=l>0?l<e?l:e:0,r.maxY=m>0?m<n?m:n:0}e.a=t;var c=n(0),f={minX:0,minY:0,maxX:0,maxY:0},p={minX:0,minY:0,maxX:0,maxY:0},d={minX:0,minY:0,maxX:0,maxY:0}}])}); | ||
!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define([],r):"object"==typeof exports?exports.General=r():e.General=r()}(this,function(){return function(e){function r(t){if(n[t])return n[t].exports;var o=n[t]={i:t,l:!1,exports:{}};return e[t].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n={};return r.m=e,r.c=n,r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="/dist/",r(r.s=1)}([function(e,r,n){"use strict";function t(e,r){for(var n=0,t=0;n<r.length;n++,t+=a){var o=r[n],u=o.iconIndex,c=o.prevGroupIndex;e[t+i.pixelPositionX]=o.pixelPosition[0],e[t+i.pixelPositionY]=o.pixelPosition[1],e[t+i.groupIndex]=o.groupIndex,e[t+i.iconIndex]=void 0!==u?u:NaN,e[t+i.prevGroupIndex]=void 0!==c?c:NaN}}function o(e,r){for(var n=0,t=0;n<e.length;n++,t+=a){var o=r[t+i.iconIndex],u=r[t+i.prevGroupIndex];e[n].iconIndex=o!==o?void 0:o,e[n].prevGroupIndex=u!==u?void 0:u}}n.d(r,"a",function(){return i}),n.d(r,"c",function(){return a}),r.b=t,r.d=o;var i={pixelPositionX:0,pixelPositionY:1,groupIndex:2,iconIndex:3,prevGroupIndex:4},a=Object.keys(i).length},function(e,r,n){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var t=n(2);n.d(r,"General",function(){return t.a})},function(e,r,n){"use strict";n.d(r,"a",function(){return a});var t=n(0),o=n(3),i=n.n(o),a=function(){function e(){var e=this;this.worker=i()(4),this.queue=[],this.currentJob=void 0,this.markerArray=new Float32Array(1e3*t.c),this.worker.onmessage=function(r){if(void 0!==e.currentJob){var n=e.currentJob,o=n.markers,i=n.resolve;Object(t.d)(o,r.data),e.markerArray=r.data,e.currentJob=void 0,e.dequeue(),i()}}}return e.prototype.generalize=function(e,r,n,t,o){var i=this,a={bounds:e,pixelRatio:r,priorityGroups:n,sprites:t};return new Promise(function(e){i.queue.push({message:a,markers:o,resolve:e}),i.dequeue()})},e.prototype.clear=function(){this.queue=[]},e.prototype.pack=function(e){e.length*t.c>this.markerArray.length&&(this.markerArray=new Float32Array(e.length*t.c)),Object(t.b)(this.markerArray,e)},e.prototype.dequeue=function(){if(void 0===this.currentJob){var e=this.queue.shift();if(void 0!==e){this.pack(e.markers);var r=e.message;r.markers=this.markerArray,r.markerCount=e.markers.length,this.worker.postMessage(r,[r.markers.buffer]),this.currentJob=e}}},e}()},function(e,r,n){function t(e){function r(t){if(n[t])return n[t].exports;var o=n[t]={i:t,l:!1,exports:{}};return e[t].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n={};r.m=e,r.c=n,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="/",r.oe=function(e){throw console.error(e),e};var t=r(r.s=ENTRY_MODULE);return t.default||t}function o(e){return(e+"").replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function i(e){var r=[],n=e.toString(),t=n.match(/^function\s?\(\w+,\s*\w+,\s*(\w+)\)/);if(!t)return r;for(var i,a=t[1],u=new RegExp("(\\\\n|\\W)"+o(a)+"\\((/\\*.*?\\*/)?s?.*?([\\.|\\-|\\w|/|@]+).*?\\)","g");i=u.exec(n);)r.push(i[3]);return r}function a(e,r){for(var n=[r],t=[],o={};n.length;){var a=n.pop();if(!o[a]&&e[a]){o[a]=!0,t.push(a);var u=i(e[a]);n=n.concat(u)}}return t}e.exports=function(e,r){r=r||{};var o=n.m,i=r.all?Object.keys(o):a(o,e),u="("+t.toString().replace("ENTRY_MODULE",JSON.stringify(e))+")({"+i.map(function(e){return JSON.stringify(e)+": "+o[e].toString()}).join(",")+"})(self);",c=new window.Blob([u],{type:"text/javascript"});if(r.bare)return c;var s=window.URL||window.webkitURL||window.mozURL||window.msURL,f=s.createObjectURL(c),p=new window.Worker(f);return p.objectURL=f,p}},function(e,r,n){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var t=n(5);r.default=function(e){e.onmessage=function(r){var n=r.data;Object(t.a)(n),e.postMessage(n.markers)}}},function(e,r,n){"use strict";function t(e){for(var r=e.bounds,n=e.pixelRatio,t=e.priorityGroups,l=e.sprites,m=e.markers,x=e.markerCount,v=1+(r.maxX-r.minX>>3)<<3,h=r.maxY-r.minY,g=v*h+8>>3,y=new Uint8Array(g),b=[],w=0;w<t.length;w++)b[w]=new Uint8Array(g);for(var w=0;w<x;w++){var k=w*s.c,Y=m[k+s.a.prevGroupIndex];if(!a(Y)){var I=m[k+s.a.pixelPositionX]-r.minX,X=m[k+s.a.pixelPositionY]-r.minY,j=t[Y],O=j.iconIndex,P=j.margin,G=j.degradation,R=l[O];if(!R)continue;var A=R.size,U=R.anchor,_=R.pixelDensity;c(f,v,h,n,A,U,_,I,X,0),u(f)?m[k+s.a.iconIndex]=-1:m[k+s.a.iconIndex]=O,c(p,v,h,n,A,U,_,I,X,P),u(p)||i(y,v,p),c(d,v,h,n,A,U,_,I,X,G),u(d)||i(b[Y],v,d)}}for(var w=0;w<t.length;w++){var J=t[w],L=J.safeZone,O=J.iconIndex,P=J.margin,G=J.degradation,R=l[O];if(R)for(var A=R.size,U=R.anchor,_=R.pixelDensity,M=0!==w?b[w-1]:void 0,N=w!==t.length-1?b[w]:void 0,q=0;q<x;q++){var k=q*s.c,E=m[k+s.a.groupIndex],Y=m[k+s.a.prevGroupIndex],I=m[k+s.a.pixelPositionX]-r.minX,X=m[k+s.a.pixelPositionY]-r.minY;E>w||!a(Y)||(c(p,v,h,n,A,U,_,I,X,P),u(p)||E===w&&M&&o(M,v,p)||(c(f,v,h,n,A,U,_,I,X,L),u(f)||o(y,v,f)||(c(d,v,h,n,A,U,_,I,X,G),i(y,v,p),N&&i(N,v,d),m[k+s.a.iconIndex]=O,m[k+s.a.prevGroupIndex]=w)))}}}function o(e,r,n){for(var t=n.minX,o=n.minY,i=n.maxX,a=n.maxY,u=o;u<a;u++){var c=u*r+t>>3,s=u*r+i>>3,f=0;if(c===s)f=e[c]&255>>(7&t)&255<<8-(7&i);else{f=e[c]&255>>(7&t);for(var p=c+1;p<s;p++)f=e[p]|f;f=e[s]&255<<8-(7&i)|f}if(0!==f)return!0}return!1}function i(e,r,n){for(var t=n.minX,o=n.minY,i=n.maxX,a=n.maxY,u=o;u<a;u++){var c=u*r+t>>3,s=u*r+i>>3;if(c===s)e[c]=e[c]|255>>(7&t)&255<<8-(7&i);else{e[c]=e[c]|255>>(7&t);for(var f=c+1;f<s;f++)e[f]=255;e[s]=e[s]|255<<8-(7&i)}}}function a(e){return e!==e}function u(e){return e.minX===e.maxX||e.minY===e.maxY}function c(e,r,n,t,o,i,a,u,c,s){var f=t/a,p=u*t-o[0]*f*i[0]-s|0,d=c*t-o[1]*f*i[1]-s|0,l=u*t+o[0]*f*(1-i[0])+s|0,m=c*t+o[1]*f*(1-i[1])+s|0;e.minX=p>0?p<r?p:r:0,e.minY=d>0?d<n?d:n:0,e.maxX=l>0?l<r?l:r:0,e.maxY=m>0?m<n?m:n:0}r.a=t;var s=n(0),f={minX:0,minY:0,maxX:0,maxY:0},p={minX:0,minY:0,maxX:0,maxY:0},d={minX:0,minY:0,maxX:0,maxY:0}}])}); | ||
//# sourceMappingURL=general.js.map |
@@ -10,11 +10,4 @@ import { BBox, PriorityGroup, Sprite, Marker } from './types'; | ||
clear(): void; | ||
/** | ||
* Запаковывает переданный массив маркеров в типизированный массив для быстрой передачи в воркер | ||
*/ | ||
private pack(markers); | ||
private dequeue(); | ||
/** | ||
* Вынимает значения из запакованного типизированного массива в массив маркеров | ||
*/ | ||
private recordResult(markers, workerMessage); | ||
} |
@@ -0,1 +1,2 @@ | ||
import { Marker } from './types'; | ||
export declare const offsets: { | ||
@@ -9,1 +10,9 @@ pixelPositionX: number; | ||
export declare const stride: number; | ||
/** | ||
* Запаковывает переданный массив маркеров в типизированный массив для быстрой передачи в воркер | ||
*/ | ||
export declare function pack(markerArray: Float32Array, markers: Marker[]): void; | ||
/** | ||
* Вынимает значения из запакованного типизированного массива в массив маркеров | ||
*/ | ||
export declare function unpack(markers: Marker[], markerArray: Float32Array): void; |
@@ -8,3 +8,4 @@ import { BBox, Vec2, WorkerMessage } from '../types'; | ||
bboxIsEmpty: (a: BBox) => boolean; | ||
createBBox: (dst: BBox, width: number, height: number, pixelRatio: number, size: Vec2, anchor: Vec2, pixelDensity: number, positionX: number, positionY: number, offset: number) => void; | ||
createBBox: (dst: BBox, planeWidth: number, planeHeight: number, pixelRatio: number, size: Vec2, anchor: Vec2, pixelDensity: number, positionX: number, positionY: number, offset: number) => void; | ||
generalize: (data: WorkerMessage) => void; | ||
}; |
{ | ||
"name": "@2gis/general", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"description": "Fast marker generalization algorithm", | ||
@@ -5,0 +5,0 @@ "contributors": [ |
@@ -118,2 +118,4 @@ # General [![Build Status](https://travis-ci.org/2gis/general.svg?branch=master)](https://travis-ci.org/2gis/general) | ||
Таким образом, если результаты предыдущей генерализации сохранять не надо, например, при изменении масштаба карты, то перед вызовом метода `generalize` нужно выставить параметр `prevGroupIndex` в `undefined` у каждого маркера. | ||
## Релиз ## | ||
@@ -120,0 +122,0 @@ 1. `npm version patch` – обновить версию в `package.json` |
@@ -1,2 +0,2 @@ | ||
import { stride, offsets } from './markerArray'; | ||
import { stride, pack, unpack } from './markerArray'; | ||
import { | ||
@@ -31,3 +31,3 @@ BBox, | ||
const { markers, resolve } = this.currentJob; | ||
this.recordResult(markers, event.data); | ||
unpack(markers, event.data); | ||
this.markerArray = event.data; | ||
@@ -65,5 +65,2 @@ this.currentJob = undefined; | ||
/** | ||
* Запаковывает переданный массив маркеров в типизированный массив для быстрой передачи в воркер | ||
*/ | ||
private pack(markers: Marker[]) { | ||
@@ -74,18 +71,3 @@ if (markers.length * stride > this.markerArray.length) { | ||
const markerArray = this.markerArray; | ||
for (let i = 0, markerOffset = 0; i < markers.length; i++, markerOffset = markerOffset + stride) { | ||
const marker = markers[i]; | ||
const iconIndex = marker.iconIndex; | ||
const prevGroupIndex = marker.prevGroupIndex; | ||
this.markerArray[markerOffset + offsets.pixelPositionX] = marker.pixelPosition[0]; | ||
this.markerArray[markerOffset + offsets.pixelPositionY] = marker.pixelPosition[1]; | ||
markerArray[markerOffset + offsets.groupIndex] = marker.groupIndex; | ||
markerArray[markerOffset + offsets.iconIndex] = | ||
iconIndex !== undefined ? iconIndex : NaN; | ||
markerArray[markerOffset + offsets.prevGroupIndex] = | ||
prevGroupIndex !== undefined ? prevGroupIndex : NaN; | ||
} | ||
pack(this.markerArray, markers); | ||
} | ||
@@ -114,17 +96,2 @@ | ||
} | ||
/** | ||
* Вынимает значения из запакованного типизированного массива в массив маркеров | ||
*/ | ||
private recordResult(markers: Marker[], workerMessage: Float32Array) { | ||
for (let i = 0, markerOffset = 0; i < markers.length; i++, markerOffset = markerOffset + stride) { | ||
const iconIndex = workerMessage[markerOffset + offsets.iconIndex]; | ||
const prevGroupIndex = workerMessage[markerOffset + offsets.prevGroupIndex]; | ||
markers[i].iconIndex = | ||
iconIndex !== iconIndex ? undefined : iconIndex; | ||
markers[i].prevGroupIndex = | ||
prevGroupIndex !== prevGroupIndex ? undefined : prevGroupIndex; | ||
} | ||
} | ||
} |
@@ -0,1 +1,3 @@ | ||
import { Marker } from './types'; | ||
// Оффсеты должны быть пронумерованы по порядку | ||
@@ -11,1 +13,36 @@ export const offsets = { | ||
export const stride = Object.keys(offsets).length; | ||
/** | ||
* Запаковывает переданный массив маркеров в типизированный массив для быстрой передачи в воркер | ||
*/ | ||
export function pack(markerArray: Float32Array, markers: Marker[]) { | ||
for (let i = 0, markerOffset = 0; i < markers.length; i++, markerOffset += stride) { | ||
const marker = markers[i]; | ||
const iconIndex = marker.iconIndex; | ||
const prevGroupIndex = marker.prevGroupIndex; | ||
markerArray[markerOffset + offsets.pixelPositionX] = marker.pixelPosition[0]; | ||
markerArray[markerOffset + offsets.pixelPositionY] = marker.pixelPosition[1]; | ||
markerArray[markerOffset + offsets.groupIndex] = marker.groupIndex; | ||
markerArray[markerOffset + offsets.iconIndex] = | ||
iconIndex !== undefined ? iconIndex : NaN; | ||
markerArray[markerOffset + offsets.prevGroupIndex] = | ||
prevGroupIndex !== undefined ? prevGroupIndex : NaN; | ||
} | ||
} | ||
/** | ||
* Вынимает значения из запакованного типизированного массива в массив маркеров | ||
*/ | ||
export function unpack(markers: Marker[], markerArray: Float32Array) { | ||
for (let i = 0, markerOffset = 0; i < markers.length; i++, markerOffset += stride) { | ||
const iconIndex = markerArray[markerOffset + offsets.iconIndex]; | ||
const prevGroupIndex = markerArray[markerOffset + offsets.prevGroupIndex]; | ||
markers[i].iconIndex = | ||
iconIndex !== iconIndex ? undefined : iconIndex; | ||
markers[i].prevGroupIndex = | ||
prevGroupIndex !== prevGroupIndex ? undefined : prevGroupIndex; | ||
} | ||
} |
@@ -11,6 +11,6 @@ import { BBox, Vec2, WorkerMessage } from '../types'; | ||
const width = (bounds.maxX - bounds.minX >> 3) + 1 << 3; // Ширина должна быть кратна 8 | ||
const height = bounds.maxY - bounds.minY; | ||
const planeWidth = (bounds.maxX - bounds.minX >> 3) + 1 << 3; // Ширина должна быть кратна 8 | ||
const planeHeight = bounds.maxY - bounds.minY; | ||
const planeLength = width * height + 8 >> 3; | ||
const planeLength = planeWidth * planeHeight + 8 >> 3; | ||
@@ -21,3 +21,3 @@ /** | ||
* Для ускорения процесса используется битовой массив, 1 бит – 1 пиксель. | ||
* Всего у нас есть три плоскости: | ||
* У нас есть несколько плоскостей. | ||
*/ | ||
@@ -29,12 +29,15 @@ | ||
/** | ||
* Следующие две используются для проверки на деградацию маркеров. | ||
* Следующие плоскости используются для проверки на деградацию маркеров. | ||
* | ||
* Область деградации маркера текущей группы действует только на маркера из следующей группы | ||
* и не влияет на другие маркера текущей группы. | ||
* Поэтому их две: | ||
* | ||
* Поэтому на каждую группу, кроме последней, нужно создавать свою плоскость, | ||
* которая будет использоваться с последующими группами. | ||
*/ | ||
// Одна – для проверки текущей группы с предыдущими | ||
const currentDegradationPlane = new Uint8Array(planeLength); | ||
// Вторая – для передачи в следующие группы | ||
const degradationPlane = new Uint8Array(planeLength); | ||
const degradationPlanes: Uint8Array[] = []; | ||
for (let i = 0; i < priorityGroups.length; i++) { | ||
degradationPlanes[i] = new Uint8Array(planeLength); | ||
} | ||
@@ -51,8 +54,10 @@ /** | ||
for (let i = 0; i < markerCount; i++) { | ||
const prevGroupIndex = markers[i * stride + offsets.prevGroupIndex]; | ||
const pixelPositionX = markers[i * stride + offsets.pixelPositionX]; | ||
const pixelPositionY = markers[i * stride + offsets.pixelPositionY]; | ||
const markerOffset = i * stride; | ||
const prevGroupIndex = markers[markerOffset + offsets.prevGroupIndex]; | ||
// prevGroupIndex не равен NaN, если маркер уже проходил генерализацию | ||
if (!isNaN(prevGroupIndex)) { | ||
const pixelPositionX = markers[markerOffset + offsets.pixelPositionX] - bounds.minX; | ||
const pixelPositionY = markers[markerOffset + offsets.pixelPositionY] - bounds.minY; | ||
const { iconIndex, margin, degradation } = priorityGroups[prevGroupIndex]; | ||
@@ -68,15 +73,25 @@ const sprite = sprites[iconIndex]; | ||
// Вставляем их на основную плоскость и плоскость деградции без всяких проверок | ||
createBBox(marginBBox, width, height, pixelRatio, size, anchor, pixelDensity, | ||
// Проверяем, попадает ли иконка маркера в новые границы | ||
createBBox(collideBBox, planeWidth, planeHeight, pixelRatio, size, anchor, pixelDensity, | ||
pixelPositionX, pixelPositionY, 0); | ||
if (bboxIsEmpty(collideBBox)) { | ||
markers[markerOffset + offsets.iconIndex] = -1; | ||
} else { | ||
markers[markerOffset + offsets.iconIndex] = iconIndex; | ||
} | ||
// Вставляем маркеры на основную плоскость и плоскость деградации без всяких проверок | ||
createBBox(marginBBox, planeWidth, planeHeight, pixelRatio, size, anchor, pixelDensity, | ||
pixelPositionX, pixelPositionY, margin); | ||
if (!bboxIsEmpty(marginBBox)) { | ||
putToArray(plane, width, marginBBox); | ||
putToArray(plane, planeWidth, marginBBox); | ||
} | ||
createBBox(degradationBBox, width, height, pixelRatio, size, anchor, pixelDensity, | ||
createBBox(degradationBBox, planeWidth, planeHeight, pixelRatio, size, anchor, pixelDensity, | ||
pixelPositionX, pixelPositionY, degradation); | ||
if (!bboxIsEmpty(degradationBBox)) { | ||
putToArray(degradationPlane, width, degradationBBox); | ||
putToArray(degradationPlanes[prevGroupIndex], planeWidth, degradationBBox); | ||
} | ||
@@ -99,7 +114,5 @@ } | ||
const { size, anchor, pixelDensity } = sprite; | ||
const prevDegradationPlane = i !== 0 ? degradationPlanes[i - 1] : undefined; | ||
const degradationPlane = i !== priorityGroups.length - 1 ? degradationPlanes[i] : undefined; | ||
// Копируем область деградации от предудщих групп, | ||
// чтобы маркера текущей группы не влияли друг на друга. | ||
currentDegradationPlane.set(degradationPlane); | ||
for (let j = 0; j < markerCount; j++) { | ||
@@ -110,4 +123,4 @@ const markerOffset = j * stride; | ||
const prevGroupIndex = markers[markerOffset + offsets.prevGroupIndex]; | ||
const pixelPositionX = markers[markerOffset + offsets.pixelPositionX]; | ||
const pixelPositionY = markers[markerOffset + offsets.pixelPositionY]; | ||
const pixelPositionX = markers[markerOffset + offsets.pixelPositionX] - bounds.minX; | ||
const pixelPositionY = markers[markerOffset + offsets.pixelPositionY] - bounds.minY; | ||
@@ -122,6 +135,6 @@ // Пропускаем маркера, чей изначальный groupIndex больше индекса текущей перебираемой группы. | ||
// Маркер первый раз попал в область деградации – пропускаем | ||
createBBox(marginBBox, width, height, pixelRatio, size, anchor, pixelDensity, | ||
createBBox(marginBBox, planeWidth, planeHeight, pixelRatio, size, anchor, pixelDensity, | ||
pixelPositionX, pixelPositionY, margin); | ||
if (bboxIsEmpty(marginBBox) || | ||
(groupIndex === i && collide(currentDegradationPlane, width, marginBBox)) | ||
if (bboxIsEmpty(marginBBox) || (groupIndex === i && | ||
prevDegradationPlane && collide(prevDegradationPlane, planeWidth, marginBBox)) | ||
) { | ||
@@ -132,3 +145,3 @@ continue; | ||
// Область маркера пересекает область уже вставшего маркера – пропускаем | ||
createBBox(collideBBox, width, height, pixelRatio, size, anchor, pixelDensity, | ||
createBBox(collideBBox, planeWidth, planeHeight, pixelRatio, size, anchor, pixelDensity, | ||
pixelPositionX, pixelPositionY, safeZone); | ||
@@ -139,10 +152,13 @@ if (bboxIsEmpty(collideBBox)) { | ||
if (!collide(plane, width, collideBBox)) { | ||
createBBox(degradationBBox, width, height, pixelRatio, size, anchor, pixelDensity, | ||
if (!collide(plane, planeWidth, collideBBox)) { | ||
createBBox(degradationBBox, planeWidth, planeHeight, pixelRatio, size, anchor, pixelDensity, | ||
pixelPositionX, pixelPositionY, degradation); | ||
// Если все хорошо и маркер выжил, закрашиваем его в двух плоскостях | ||
putToArray(plane, width, marginBBox); | ||
putToArray(degradationPlane, width, degradationBBox); | ||
putToArray(plane, planeWidth, marginBBox); | ||
if (degradationPlane) { | ||
putToArray(degradationPlane, planeWidth, degradationBBox); | ||
} | ||
markers[markerOffset + offsets.iconIndex] = iconIndex; | ||
@@ -239,4 +255,4 @@ markers[markerOffset + offsets.prevGroupIndex] = i; | ||
dst: BBox, | ||
width: number, | ||
height: number, | ||
planeWidth: number, | ||
planeHeight: number, | ||
pixelRatio: number, | ||
@@ -259,6 +275,6 @@ size: Vec2, | ||
// Обрезаем область по установленным границам плоскости | ||
dst.minX = x1 > 0 ? (x1 < width ? x1 : width) : 0; | ||
dst.minY = y1 > 0 ? (y1 < height ? y1 : height) : 0; | ||
dst.maxX = x2 > 0 ? (x2 < width ? x2 : width) : 0; | ||
dst.maxY = y2 > 0 ? (y2 < height ? y2 : height) : 0; | ||
dst.minX = x1 > 0 ? (x1 < planeWidth ? x1 : planeWidth) : 0; | ||
dst.minY = y1 > 0 ? (y1 < planeHeight ? y1 : planeHeight) : 0; | ||
dst.maxX = x2 > 0 ? (x2 < planeWidth ? x2 : planeWidth) : 0; | ||
dst.maxY = y2 > 0 ? (y2 < planeHeight ? y2 : planeHeight) : 0; | ||
} | ||
@@ -272,2 +288,3 @@ | ||
createBBox, | ||
generalize, | ||
}; |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
213069
686
125
1