@soonspacejs/plugin-heat-map 2.13.6 → 2.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/index.esm.js +601 -1
- package/dist/index.esm.js.map +1 -0
- package/package.json +3 -3
- package/dist/CreateDrawing.d.ts +0 -39
- package/dist/index.d.ts +0 -109
- package/dist/tools.d.ts +0 -35
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
# @soonspacejs/plugin-heat-map
|
|
2
|
-
|
|
3
|
-
> Haet-map plugin for SoonSpace.js
|
|
4
|
-
|
|
1
|
+
# @soonspacejs/plugin-heat-map
|
|
2
|
+
|
|
3
|
+
> Haet-map plugin for SoonSpace.js
|
|
4
|
+
|
|
5
5
|
Document: [http://www.xwbuilders.com:8800/plugin/heat-map.html](http://www.xwbuilders.com:8800/plugin/heat-map.html)
|
package/dist/index.esm.js
CHANGED
|
@@ -1 +1,601 @@
|
|
|
1
|
-
import{Matrix4 as t,Vector2 as e,Shape as i,ShapeGeometry as a,Box2 as n,Plane as s,Vector3 as r,Matrix3 as o,PlaneGeometry as h,CanvasTexture as d,MeshStandardMaterial as l,Mesh as c,Box3 as u,DoubleSide as p}from"three";"function"==typeof SuppressedError&&SuppressedError;var m={defaultRadius:40,defaultGradient:{.25:"rgb(0,0,255)",.55:"rgb(0,255,0)",.85:"yellow",1:"rgb(255,0,0)"},defaultMaxOpacity:1,defaultMinOpacity:0,defaultBlur:.85,defaultXField:"x",defaultYField:"y",defaultValueField:"value",plugins:{}},g=function(){function t(){this.eStore={}}return t.prototype.on=function(t,e,i){this.eStore[t]||(this.eStore[t]=[]),this.eStore[t].push((function(t){return e.call(i,t)}))},t.prototype.emit=function(t,e){this.eStore[t]&&this.eStore[t].forEach((function(t){return t(e)}))},t}(),v=function(){function t(t){this.coordinator=new g,this.data=[],this.radi=[],this.min=10,this.max=1,this.xField=t.xField||m.defaultXField,this.yField=t.yField||m.defaultYField,this.valueField=t.valueField||m.defaultValueField,this.radius=t.radius||m.defaultRadius}return t.prototype._organiseData=function(t,e){var i=t[this.xField],a=t[this.yField],n=this.radi,s=this.data,r=this.max,o=this.min,h=t[this.valueField]||1,d=t.radius||this.radius;n[i]||(s[i]=[],n[i]=[]),n[i][a]?s[i][a]+=h:(s[i][a]=h,n[i][a]=d);var l=s[i][a];return l?l>r?(e?this.setDataMax(l):this.max=l,!1):l<o?(e?this.setDataMin(l):this.min=l,!1):void 0:{x:i,y:a,value:h,radius:d,min:o,max:r}},t.prototype._unOrganizeData=function(){for(var t=[],e=0;e<this.radi.length;e++)for(var i=0;i<this.radi[e].length;i++)t.push({x:e,y:i,radius:this.radi[e][i],value:this.radi[e][i]});return{min:this.min,max:this.max,data:t}},t.prototype._onExtremaChange=function(){this.coordinator.emit("extremachange",{min:this.min,max:this.max})},t.prototype.addData=function(t){var e=this._organiseData(t,!0);e&&(0===this.data.length&&(this.min=e.value,this.max=e.value),this.coordinator.emit("renderpartial",{min:this.min,max:this.max,data:[e]}))},t.prototype.setData=function(t){var e=t.data;this.data=[],this.radi=[];for(var i=0;i<e.length;i++)this._organiseData(e[i],!1);return this.min=t.min||0,this.max=t.max||100,this._onExtremaChange(),this.coordinator.emit("renderall",this._getInternalData()),this},t.prototype.setDataMax=function(t){return this.max=t,this._onExtremaChange(),this.coordinator.emit("renderall",this._getInternalData()),this},t.prototype.setDataMin=function(t){return this.min=t,this._onExtremaChange(),this.coordinator.emit("renderall",this._getInternalData()),this},t.prototype._getInternalData=function(){return{max:this.max,min:this.min,data:this.data,radi:this.radi}},t.prototype.getData=function(){return this._unOrganizeData()},t}(),y=function(){function t(t){this.canvas=t.canvas||document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.shadowCanvas=t.shadowCanvas||document.createElement("canvas"),this.shadowCtx=this.shadowCanvas.getContext("2d"),this.width=t.width||512,this.height=t.height||512,this.max=100,this.min=1,this.blur=1,this.opacity=1,this.maxOpacity=1,this.minOpacity=0,this.useGradientOpacity=!1,this.canvas.style.cssText=this.shadowCanvas.style.cssText="position:absolute;left:0;top:0;",t.container&&(t.container.style.position="relative",t.container.appendChild(this.canvas)),this.renderBoundaries=[1e4,1e4,0,0],this.palette=this._getColorPalette(t),this.templates=[],this._setStyles(t)}return t.prototype.renderPartial=function(t){t.data.length>0&&(this._drawAlpha(t),this._colorize())},t.prototype.renderAll=function(t){this._clear(),t.data.length>0&&(this._drawAlpha(this._prepareData(t)),this._colorize())},t.prototype.updateConfig=function(t){t.gradient&&this._updateGradient(t),this._setStyles(t)},t.prototype.setDimensions=function(t,e){this.width=this.canvas.width=this.shadowCanvas.width=t,this.height=this.canvas.height=this.shadowCanvas.height=e},t.prototype.getValueAt=function(t){if(!this.shadowCtx)return 0;var e=this.shadowCtx.getImageData(t.x,t.y,1,1);return Math.abs(this.max-this.min)*(e.data[3]/255)>>0},t.prototype.getDataURL=function(){return this.canvas.toDataURL()},t.prototype._getColorPalette=function(t){var e=t.gradient||m.defaultGradient,i=document.createElement("canvas"),a=i.getContext("2d");if(i.width=256,i.height=1,!a)return new Uint8ClampedArray(1024);var n=a.createLinearGradient(0,0,256,1);for(var s in e)n.addColorStop(Number(s),e[s]);return a.fillStyle=n,a.fillRect(0,0,256,1),a.getImageData(0,0,256,1).data},t.prototype._getPointTemplate=function(t,e){var i=document.createElement("canvas"),a=i.getContext("2d");if(!a)return i;var n=t,s=t;if(i.width=i.height=2*t,1===e)a.beginPath(),a.arc(n,s,t,0,2*Math.PI,!1),a.fillStyle="rgba(0,0,0,1)",a.fill();else{var r=a.createRadialGradient(n,s,t*e,n,s,t);r.addColorStop(0,"rgba(0,0,0,1)"),r.addColorStop(1,"rgba(0,0,0,0)"),a.fillStyle=r,a.fillRect(0,0,2*t,2*t)}return i},t.prototype._prepareData=function(t){for(var e=[],i=t.min,a=t.max,n=t.radi,s=t.data,r=Object.keys(s),o=r.length;o--;)for(var h=r[o],d=Object.keys(s[h]),l=d.length;l--;){var c=d[l],u=s[h][c],p=n[h][c];e.push({x:Number(h),y:Number(c),value:u,radius:p})}return{min:i,max:a,data:e}},t.prototype._setStyles=function(t){this.blur=0===t.blur?0:t.blur||m.defaultBlur,t.backgroundColor&&(this.canvas.style.backgroundColor=t.backgroundColor),this.width=this.canvas.width=this.shadowCanvas.width=t.width||this.width,this.height=this.canvas.height=this.shadowCanvas.height=t.height||this.height,this.opacity=255*(t.opacity||0),this.maxOpacity=255*(t.maxOpacity||m.defaultMaxOpacity),this.minOpacity=255*(t.minOpacity||m.defaultMinOpacity),this.useGradientOpacity=!!t.useGradientOpacity},t.prototype._updateGradient=function(t){this.palette=this._getColorPalette(t)},t.prototype._drawAlpha=function(t){for(var e=this.min=t.min||0,i=this.max=t.max||100,a=t.data||[],n=a.length,s=1-this.blur;n--;){var r=a[n],o=r.x,h=r.y,d=r.radius,l=Math.min(r.value,i),c=o-d,u=h-d;if(!this.shadowCtx)return;var p=void 0;this.templates[d]?p=this.templates[d]:this.templates[d]=p=this._getPointTemplate(d,s);var m=(l-e)/(i-e);this.shadowCtx.globalAlpha=m<.01?.01:m,this.shadowCtx.drawImage(p,c,u),c<this.renderBoundaries[0]&&(this.renderBoundaries[0]=c),u<this.renderBoundaries[1]&&(this.renderBoundaries[1]=u),c+2*d>this.renderBoundaries[2]&&(this.renderBoundaries[2]=c+2*d),u+2*d>this.renderBoundaries[3]&&(this.renderBoundaries[3]=u+2*d)}},t.prototype._colorize=function(){var t=this.renderBoundaries[0],e=this.renderBoundaries[1],i=this.renderBoundaries[2]-t,a=this.renderBoundaries[3]-e,n=this.width,s=this.height;if(t<0&&(t=0),e<0&&(e=0),t+i>n&&(i=n-t),e+a>s&&(a=s-e),this.ctx&&this.shadowCtx){for(var r=this.shadowCtx.getImageData(t,e,i,a),o=3;o<r.data.length;o+=4){var h,d=r.data[o],l=4*d;l&&(h=this.opacity>0?this.opacity:d<this.maxOpacity?d<this.minOpacity?this.minOpacity:d:this.maxOpacity,r.data[o-3]=this.palette[l],r.data[o-2]=this.palette[l+1],r.data[o-1]=this.palette[l+2],r.data[o]=this.useGradientOpacity?this.palette[l+3]:h)}this.ctx.putImageData(r,t,e),this.renderBoundaries=[1e3,1e3,0,0]}},t.prototype._clear=function(){this.ctx&&this.shadowCtx&&(this.ctx.clearRect(0,0,this.width,this.height),this.shadowCtx.clearRect(0,0,this.width,this.height))},t}(),f=function(){function t(t){this.config=t,this.renderer=new y(this.config),this.store=new v(this.config),this._init()}return t.prototype._init=function(){var t=this;this.store.coordinator.on("renderpartial",this.renderer.renderPartial,this.renderer),this.store.coordinator.on("renderall",this.renderer.renderAll,this.renderer),this.store.coordinator.on("extremachange",(function(e){t.config.onExtremaChange&&t.config.onExtremaChange({min:e.min,max:e.max,gradient:t.config.gradient||m.defaultGradient})}))},t.prototype.addData=function(t){return this.store.addData(t),this},t.prototype.setData=function(t){return this.store.setData(t),this},t.prototype.setDataMaxx=function(t){return this.store.setDataMax(t),this},t.prototype.setDataMin=function(t){return this.store.setDataMin(t),this},t.prototype.repaint=function(){return this.store.coordinator.emit("renderall",this.store._getInternalData()),this},t.prototype.getData=function(){return this.store.getData()},t.prototype.getDataURL=function(){return this.renderer.getDataURL()},t.prototype.getValueAt=function(t){return this.renderer.getValueAt(t)},t}();function x(h){const d=function(t){const[e,i,a]=t,n=new s;n.setFromCoplanarPoints(i,e,a);const h=n.normal,d=h.clone().cross(new r(0,0,1));d.equals(new r)&&d.set(1,0,0);const l=h.clone().cross(d);d.normalize(),l.normalize(),h.normalize();const c=new o;return c.elements=[d.x,d.y,d.z,l.x,l.y,l.z,h.x,h.y,h.z],c}(h),l=new t;l.setFromMatrix3(d);const c=h[0],u=l.clone();u.setPosition(c);const p=u.clone().invert(),m=h.map((t=>{const i=t.clone().applyMatrix4(p);return new e(i.x,i.y)})),g=new i(m),v=new a(g),y=new n;y.setFromPoints(m);const f=function(t){const i=t.min,a=t.getSize(new e),n=new o;return n.elements=[a.x,0,0,0,a.y,0,i.x,i.y,1],n.invert()}(y);return v.getAttribute("uv").applyMatrix3(f),v.applyMatrix4(l),{geometry:v,polygonBox:y,modelMatrix:l,planeMatrix:u,projectionMatrix:p,position:c}}function w(t,e,i,a,n,s){const{min:o,max:h,radius:d,beforePointUpdate:l,value:c,distanceInterval:u}=i,p=n.object,m=s.viewport.getIntersects(t,[p]);if(!((null==m?void 0:m.length)>0))return null;const g=m[0].point.clone();if(a.length>0&&u){const{x:t,y:e,z:i}=a[a.length-1];if(u>new r(t,e,i).distanceTo(g))return null}const v=Array.isArray(c)?function(t,e){if(t>=e)throw new Error("Min value must be less than max value.");return Math.floor(Math.random()*(e-t+1))+t}(c[0],c[1]):c,y=Object.assign(Object.assign({},g),{radius:d,value:v}),f=null==l?void 0:l(e,y,a);return!1===f?null:"object"==typeof f?f:y}class P{constructor(t,e){this.heatMapPlugin=t,this.store=new Map,this.intervalId=null,this.currentMouseEvent=null,this.events={},this.isDragging=!1,this.isStarting=!1,this.dataPoints=[],this.start=()=>{const{addTriggerType:t,doneTriggerType:e,undoTriggerType:i}=this.createDrawingParam;return new Promise(((a,n)=>{this.startResolve=a,this.startReject=n,this.isStarting?console.warn("请先取消绘制再调用start方法"):(this.isStarting=!0,this.handleEventListeners("add",t,this.handleAddPoint),this.handleEventListeners("add",e,this.done),this.handleEventListeners("add",i,this.popPoint))}))},this.cancel=()=>{var t;const{id:e}=this.createDrawingParam,i=[...this.dataPoints];this.heatMapPlugin.setDataPolygon(e,[]),this.remove(),null===(t=this.startReject)||void 0===t||t.call(this,i)},this.dispose=()=>{const{id:t}=this.createDrawingParam;this.remove(),this.heatMapPlugin.removeById(t)},this.done=()=>{var t;const e=[...this.dataPoints];this.remove(),null===(t=this.startResolve)||void 0===t||t.call(this,e)},this.remove=()=>{const{addTriggerType:t,doneTriggerType:e,undoTriggerType:i}=this.createDrawingParam;this.dataPoints=[],this.lastTime=void 0,this.setMouseEvent(null),this.handleEventListeners("remove",t,this.handleAddPoint),this.handleEventListeners("remove",e,this.done),this.handleEventListeners("remove",i,this.popPoint),this.events={},this.isDragging=!1,this.ssp.controls.enabled=!0,this.isStarting=!1},this.pushPoint=t=>{if(!t)return;const{id:e,onAdd:i}=this.createDrawingParam,a=t;this.dataPoints.push(a),this.heatMapPlugin.setDataPolygon(e,this.dataPoints),null==i||i(a,this.dataPoints)},this.popPoint=()=>{var t;const e=null===(t=this.dataPoints)||void 0===t?void 0:t.length;if(!(e>0))return;const{id:i,beforePointUpdate:a,onUndo:n}=this.createDrawingParam,s=null==a?void 0:a("undo",this.dataPoints[e-1],this.dataPoints);if(!1===s)return;"object"==typeof s&&(this.dataPoints[e-1]=s);const r=this.dataPoints.pop();r&&(this.heatMapPlugin.setDataPolygon(i,this.dataPoints),null==n||n(r,this.dataPoints))},this.handleAddPoint=t=>{if(!(null==t?void 0:t.clientX))throw new Error("addTriggerType仅支持:time、drag、click、dblClick、rightClick、mouseDown、mouseMove、mouseUp、mouseWheel");this.setMouseEvent(t);const e=this.getPoint(t,"add");this.pushPoint(e)},this.setMouseEvent=t=>{this.currentMouseEvent=t},this.handleEventListeners=(t,e,i)=>{(null==e?void 0:e.length)>0&&(e.forEach((e=>{var a,n,s,r;if("object"!=typeof e)if("time"!==e)if("drag"!==e)null===(r=null===(s=this.ssp.signals[e])||void 0===s?void 0:s[t])||void 0===r||r.call(s,i);else{const a=this.ssp.viewport.container,n=e;"add"===t?(this.events[n]=t=>{this.onPointerMove(i,t)},a.addEventListener("pointerdown",this.onPointerdown),a.addEventListener("pointermove",this.events[n]),a.addEventListener("pointerup",this.onPointerUp)):(a.removeEventListener("pointerdown",this.onPointerdown),a.removeEventListener("pointermove",this.events[n]),a.removeEventListener("pointerup",this.onPointerUp))}else if("add"===t){const{timeInterval:t}=this.createDrawingParam||{};this.ssp.signals.mouseMove.add(this.setMouseEvent),this.intervalId=setInterval((()=>{this.currentMouseEvent&&i(this.currentMouseEvent)}),t)}else this.ssp.signals.mouseMove.remove(this.setMouseEvent);else for(const[s,r]of Object.entries(e)){const e=`${s}_${r.join("_")}`;"add"===t&&(this.events[e]=t=>{this.keyEvents(r,i,t)}),null===(n=null===(a=this.ssp.signals[s])||void 0===a?void 0:a[t])||void 0===n||n.call(a,this.events[e])}})),"remove"===t&&this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null))},this.onPointerdown=t=>{this.ssp.controls.enabled=!1,this.isDragging=!0},this.onPointerMove=(t,e)=>{e.preventDefault(),this.isDragging&&t(e)},this.onPointerUp=t=>{this.isDragging=!1,this.ssp.controls.enabled=!0};const{data:i=[]}=e;this.ssp=t.ssp,this.store=t.store,this.createDrawingParam=e,this.dataPoints=[...i],this.object=t.createPolygon(e)}keyEvents(t,e,i){(null==t?void 0:t.includes(i.code))&&e()}getPoint(t,e){const{id:i,timeInterval:a=100}=this.createDrawingParam;if(this.lastTime&&a&&a>(new Date).getTime()-this.lastTime.getTime())return null;this.lastTime=new Date;const n=this.store.get(i);return w(t,e,this.createDrawingParam,this.dataPoints,n,this.ssp)}}class D{constructor(t){this.ssp=t,this.store=new Map,this.maxCanvasSize=512,this.hmInstance=null}create(t){const{id:e,name:i,yAxisHeight:a,minPosition:n,maxPosition:s,data:o,min:u=0,max:p=100,radius:m=100,canvasScalar:g=1}=t,v=new r((s.x+n.x)/2,a,(s.z+n.z)/2),y=s.x-n.x,f=s.z-n.z,x=this._formatCanvasSize(y*g,f*g),{canvas:w,hmInstance:P}=this.createInitData(Object.assign(Object.assign({},x),{radius:m}));P.setData({max:p,min:u,data:this._formatData(o,n,{width:y,height:f},x)});const D=new h(y,f),b=new d(w),C=new l({map:b,depthWrite:!1,transparent:!0}),M=new c(D,C),O=this.ssp.createPluginObject({id:e,name:i,position:v.clone(),rotation:{x:-Math.PI/2,y:0,z:0}},M);return this.store.set(e,{object:O,canvas:w,param:Object.assign(Object.assign({},t),{min:u,max:p}),width:y,height:f}),O}createPolygon(t){const{id:i,name:a,points:n,data:s,min:o=0,max:h=100,radius:c=100}=t,m=n.map((t=>new r(t.x,t.y,t.z))),{geometry:g,projectionMatrix:v,polygonBox:y,position:f}=x(m);(new u).setFromPoints(m);const{x:w,y:P}=y.getSize(new e),D=this._formatCanvasSize(w,P),{canvas:b,hmInstance:C}=this.createInitData(Object.assign(Object.assign({},D),{radius:c}));s&&s.length>0&&C.setData({max:h,min:o,data:this._formatData_Polygon(s,v,y,D)});const M=new d(b),O=new l({map:M,depthWrite:!1,transparent:!0,side:p}),_=new this.ssp.library.BaseMesh({id:`${i}_mesh`,name:a},g,O);_.renderOrder=0;const I=this.ssp.createPluginObject({id:i,name:a,position:f},_);return this.store.set(i,{object:I,canvas:b,param:Object.assign(Object.assign({},t),{min:o,max:h}),width:w,height:P,projectionMatrix:v,polygonBox:y,position:f.clone()}),I}createDrawing(t){const{data:e=[],addTriggerType:i=["click","mouseMove"],doneTriggerType:a=["dblClick",{keyDown:["Enter"]}],undoTriggerType:n=["rightClick",{keyDown:["Backspace"]}],timeInterval:s=100,min:r=0,max:o=100,radius:h=100,value:d=[r,o],distanceInterval:l=5}=t,c=function(t,e){var i={};for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&e.indexOf(a)<0&&(i[a]=t[a]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(a=Object.getOwnPropertySymbols(t);n<a.length;n++)e.indexOf(a[n])<0&&Object.prototype.propertyIsEnumerable.call(t,a[n])&&(i[a[n]]=t[a[n]])}return i}(t,["data","addTriggerType","doneTriggerType","undoTriggerType","timeInterval","min","max","radius","value","distanceInterval"]),u=Object.assign({data:e,addTriggerType:i,doneTriggerType:a,undoTriggerType:n,timeInterval:s,min:r,max:o,radius:h,value:d,distanceInterval:l},c);return new P(this,u)}setData(t,e){const i=this.store.get(t);if(i){const{object:t,canvas:a,param:{minPosition:n,min:s,max:r},width:o,height:h}=i,l=this.createInitData(),{canvas:c,hmInstance:u}=l;u.renderer.updateConfig({width:a.width,height:a.height}),u.setData({max:r,min:s,data:this._formatData(e,n,{width:o,height:h},this._formatCanvasSize(o,h))});const p=t.children[0].material;return this.ssp.render((()=>{const t=new d(c);p.map&&p.map.dispose(),p.map=t})),t}return console.warn(`In soonspacejs: 插件(plugin-heat-map)未找到 id 为 '"${t}"' 的热力图对象!`)}setDataPolygon(t,i){const a=this.store.get(t);if(a){const{object:n,canvas:s,param:{min:o,max:h},projectionMatrix:l,polygonBox:c,position:u}=a;if(!l)throw new Error(`${t} 不是多边形热力图类型`);const p=this.getById(t),m=null==p?void 0:p.getWorldPosition(new r),g=this.createInitData(),{canvas:v,hmInstance:y}=g;y.renderer.updateConfig({width:s.width,height:s.height});const f=c.getSize(new e);y.setData({max:h,min:o,data:this._formatData_Polygon(i,l,c,this._formatCanvasSize(f.x,f.y),u,m)});const x=n.children[0].material;return this.ssp.render((()=>{const t=new d(v);x.map&&x.map.dispose(),x.map=t})),n}return console.warn(`In soonspacejs: 插件(plugin-heat-map)未找到 id 为 '"${t}"' 的热力图对象!`)}getById(t){return this.ssp.getObjectById(t)}getByName(t){return this.ssp.getObjectByName(t)}removeById(t){return!!this.store.has(t)&&(this.ssp.removeObjectById(t),this.store.delete(t),!0)}createInitData(t){const e=this.hmInstance=new f(t||{});return{hmInstance:e,canvas:e.renderer.canvas}}_formatCanvasSize(t,e){const i=t/e;return t>this.maxCanvasSize&&(e=(t=this.maxCanvasSize)/i),e>this.maxCanvasSize&&(t=i*(e=this.maxCanvasSize)),{width:t,height:e}}_formatData(t,e,i,a){return t.map((t=>Object.assign(Object.assign({},t),{x:Math.trunc((t.x-e.x)/i.width*a.width),y:Math.trunc((t.z-e.z)/i.height*a.height)})))}_formatData_Polygon(t,i,a,n,s,o){const h=s&&o?o.clone().sub(s):new r(0,0,0);return t.map((t=>{const s=new r(t.x,t.y,t.z);s.sub(h),s.applyMatrix4(i);const{x:o,y:d}=a.getParameter(new e(s.x,s.y),new e);return Object.assign(Object.assign({},t),{x:Math.trunc(o*n.width),y:Math.trunc((1-d)*n.height)})}))}}export{D as default};
|
|
1
|
+
import { Matrix4, Vector2, Shape, ShapeGeometry, Box2, Plane, Vector3, Matrix3, PlaneGeometry, CanvasTexture, MeshStandardMaterial, Mesh, Box3, DoubleSide } from 'three';
|
|
2
|
+
|
|
3
|
+
/******************************************************************************
|
|
4
|
+
Copyright (c) Microsoft Corporation.
|
|
5
|
+
|
|
6
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
7
|
+
purpose with or without fee is hereby granted.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
16
|
+
***************************************************************************** */
|
|
17
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
function __rest(s, e) {
|
|
21
|
+
var t = {};
|
|
22
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
23
|
+
t[p] = s[p];
|
|
24
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
25
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
26
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
27
|
+
t[p[i]] = s[p[i]];
|
|
28
|
+
}
|
|
29
|
+
return t;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
33
|
+
var e = new Error(message);
|
|
34
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
var t={defaultRadius:40,defaultGradient:{.25:"rgb(0,0,255)",.55:"rgb(0,255,0)",.85:"yellow",1:"rgb(255,0,0)"},defaultMaxOpacity:1,defaultMinOpacity:0,defaultBlur:.85,defaultXField:"x",defaultYField:"y",defaultValueField:"value",plugins:{}},i=function(){function t(){this.eStore={};}return t.prototype.on=function(t,i,a){this.eStore[t]||(this.eStore[t]=[]),this.eStore[t].push((function(t){return i.call(a,t)}));},t.prototype.emit=function(t,i){this.eStore[t]&&this.eStore[t].forEach((function(t){return t(i)}));},t}(),a=function(){function a(a){this.coordinator=new i,this.data=[],this.radi=[],this.min=10,this.max=1,this.xField=a.xField||t.defaultXField,this.yField=a.yField||t.defaultYField,this.valueField=a.valueField||t.defaultValueField,this.radius=a.radius||t.defaultRadius;}return a.prototype._organiseData=function(t,i){var a=t[this.xField],e=t[this.yField],r=this.radi,n=this.data,s=this.max,h=this.min,o=t[this.valueField]||1,d=t.radius||this.radius;r[a]||(n[a]=[],r[a]=[]),r[a][e]?n[a][e]+=o:(n[a][e]=o,r[a][e]=d);var u=n[a][e];return u?u>s?(i?this.setDataMax(u):this.max=u,!1):u<h?(i?this.setDataMin(u):this.min=u,!1):void 0:{x:a,y:e,value:o,radius:d,min:h,max:s}},a.prototype._unOrganizeData=function(){for(var t=[],i=0;i<this.radi.length;i++)for(var a=0;a<this.radi[i].length;a++)t.push({x:i,y:a,radius:this.radi[i][a],value:this.radi[i][a]});return {min:this.min,max:this.max,data:t}},a.prototype._onExtremaChange=function(){this.coordinator.emit("extremachange",{min:this.min,max:this.max});},a.prototype.addData=function(t){var i=this._organiseData(t,!0);i&&(0===this.data.length&&(this.min=i.value,this.max=i.value),this.coordinator.emit("renderpartial",{min:this.min,max:this.max,data:[i]}));},a.prototype.setData=function(t){var i=t.data;this.data=[],this.radi=[];for(var a=0;a<i.length;a++)this._organiseData(i[a],!1);return this.min=t.min||0,this.max=t.max||100,this._onExtremaChange(),this.coordinator.emit("renderall",this._getInternalData()),this},a.prototype.setDataMax=function(t){return this.max=t,this._onExtremaChange(),this.coordinator.emit("renderall",this._getInternalData()),this},a.prototype.setDataMin=function(t){return this.min=t,this._onExtremaChange(),this.coordinator.emit("renderall",this._getInternalData()),this},a.prototype._getInternalData=function(){return {max:this.max,min:this.min,data:this.data,radi:this.radi}},a.prototype.getData=function(){return this._unOrganizeData()},a}(),e=function(){function i(t){this.canvas=t.canvas||document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.shadowCanvas=t.shadowCanvas||document.createElement("canvas"),this.shadowCtx=this.shadowCanvas.getContext("2d"),this.width=t.width||512,this.height=t.height||512,this.max=100,this.min=1,this.blur=1,this.opacity=1,this.maxOpacity=1,this.minOpacity=0,this.useGradientOpacity=!1,this.canvas.style.cssText=this.shadowCanvas.style.cssText="position:absolute;left:0;top:0;",t.container&&(t.container.style.position="relative",t.container.appendChild(this.canvas)),this.renderBoundaries=[1e4,1e4,0,0],this.palette=this._getColorPalette(t),this.templates=[],this._setStyles(t);}return i.prototype.renderPartial=function(t){t.data.length>0&&(this._drawAlpha(t),this._colorize());},i.prototype.renderAll=function(t){this._clear(),t.data.length>0&&(this._drawAlpha(this._prepareData(t)),this._colorize());},i.prototype.updateConfig=function(t){t.gradient&&this._updateGradient(t),this._setStyles(t);},i.prototype.setDimensions=function(t,i){this.width=this.canvas.width=this.shadowCanvas.width=t,this.height=this.canvas.height=this.shadowCanvas.height=i;},i.prototype.getValueAt=function(t){if(!this.shadowCtx)return 0;var i=this.shadowCtx.getImageData(t.x,t.y,1,1);return Math.abs(this.max-this.min)*(i.data[3]/255)>>0},i.prototype.getDataURL=function(){return this.canvas.toDataURL()},i.prototype._getColorPalette=function(i){var a=i.gradient||t.defaultGradient,e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=256,e.height=1,!r)return new Uint8ClampedArray(1024);var n=r.createLinearGradient(0,0,256,1);for(var s in a)n.addColorStop(Number(s),a[s]);return r.fillStyle=n,r.fillRect(0,0,256,1),r.getImageData(0,0,256,1).data},i.prototype._getPointTemplate=function(t,i){var a=document.createElement("canvas"),e=a.getContext("2d");if(!e)return a;var r=t,n=t;if(a.width=a.height=2*t,1===i)e.beginPath(),e.arc(r,n,t,0,2*Math.PI,!1),e.fillStyle="rgba(0,0,0,1)",e.fill();else {var s=e.createRadialGradient(r,n,t*i,r,n,t);s.addColorStop(0,"rgba(0,0,0,1)"),s.addColorStop(1,"rgba(0,0,0,0)"),e.fillStyle=s,e.fillRect(0,0,2*t,2*t);}return a},i.prototype._prepareData=function(t){for(var i=[],a=t.min,e=t.max,r=t.radi,n=t.data,s=Object.keys(n),h=s.length;h--;)for(var o=s[h],d=Object.keys(n[o]),u=d.length;u--;){var l=d[u],c=n[o][l],p=r[o][l];i.push({x:Number(o),y:Number(l),value:c,radius:p});}return {min:a,max:e,data:i}},i.prototype._setStyles=function(i){this.blur=0===i.blur?0:i.blur||t.defaultBlur,i.backgroundColor&&(this.canvas.style.backgroundColor=i.backgroundColor),this.width=this.canvas.width=this.shadowCanvas.width=i.width||this.width,this.height=this.canvas.height=this.shadowCanvas.height=i.height||this.height,this.opacity=255*(i.opacity||0),this.maxOpacity=255*(i.maxOpacity||t.defaultMaxOpacity),this.minOpacity=255*(i.minOpacity||t.defaultMinOpacity),this.useGradientOpacity=!!i.useGradientOpacity;},i.prototype._updateGradient=function(t){this.palette=this._getColorPalette(t);},i.prototype._drawAlpha=function(t){for(var i=this.min=t.min||0,a=this.max=t.max||100,e=t.data||[],r=e.length,n=1-this.blur;r--;){var s=e[r],h=s.x,o=s.y,d=s.radius,u=Math.min(s.value,a),l=h-d,c=o-d;if(!this.shadowCtx)return;var p=void 0;this.templates[d]?p=this.templates[d]:this.templates[d]=p=this._getPointTemplate(d,n);var m=(u-i)/(a-i);this.shadowCtx.globalAlpha=m<.01?.01:m,this.shadowCtx.drawImage(p,l,c),l<this.renderBoundaries[0]&&(this.renderBoundaries[0]=l),c<this.renderBoundaries[1]&&(this.renderBoundaries[1]=c),l+2*d>this.renderBoundaries[2]&&(this.renderBoundaries[2]=l+2*d),c+2*d>this.renderBoundaries[3]&&(this.renderBoundaries[3]=c+2*d);}},i.prototype._colorize=function(){var t=this.renderBoundaries[0],i=this.renderBoundaries[1],a=this.renderBoundaries[2]-t,e=this.renderBoundaries[3]-i,r=this.width,n=this.height;if(t<0&&(t=0),i<0&&(i=0),t+a>r&&(a=r-t),i+e>n&&(e=n-i),this.ctx&&this.shadowCtx){for(var s=this.shadowCtx.getImageData(t,i,a,e),h=3;h<s.data.length;h+=4){var o,d=s.data[h],u=4*d;if(u)o=this.opacity>0?this.opacity:d<this.maxOpacity?d<this.minOpacity?this.minOpacity:d:this.maxOpacity,s.data[h-3]=this.palette[u],s.data[h-2]=this.palette[u+1],s.data[h-1]=this.palette[u+2],s.data[h]=this.useGradientOpacity?this.palette[u+3]:o;}this.ctx.putImageData(s,t,i),this.renderBoundaries=[1e3,1e3,0,0];}},i.prototype._clear=function(){this.ctx&&this.shadowCtx&&(this.ctx.clearRect(0,0,this.width,this.height),this.shadowCtx.clearRect(0,0,this.width,this.height));},i}(),r=function(){function i(t){this.config=t,this.renderer=new e(this.config),this.store=new a(this.config),this._init();}return i.prototype._init=function(){var i=this;this.store.coordinator.on("renderpartial",this.renderer.renderPartial,this.renderer),this.store.coordinator.on("renderall",this.renderer.renderAll,this.renderer),this.store.coordinator.on("extremachange",(function(a){i.config.onExtremaChange&&i.config.onExtremaChange({min:a.min,max:a.max,gradient:i.config.gradient||t.defaultGradient});}));},i.prototype.addData=function(t){return this.store.addData(t),this},i.prototype.setData=function(t){return this.store.setData(t),this},i.prototype.setDataMaxx=function(t){return this.store.setDataMax(t),this},i.prototype.setDataMin=function(t){return this.store.setDataMin(t),this},i.prototype.repaint=function(){return this.store.coordinator.emit("renderall",this.store._getInternalData()),this},i.prototype.getData=function(){return this.store.getData()},i.prototype.getDataURL=function(){return this.renderer.getDataURL()},i.prototype.getValueAt=function(t){return this.renderer.getValueAt(t)},i}();
|
|
38
|
+
|
|
39
|
+
function getPolygonGeometryInfo(points) {
|
|
40
|
+
const matrix3 = createPlaneMatrix(points);
|
|
41
|
+
const modelMatrix = new Matrix4();
|
|
42
|
+
modelMatrix.setFromMatrix3(matrix3);
|
|
43
|
+
const position = points[0];
|
|
44
|
+
const planeMatrix = modelMatrix.clone();
|
|
45
|
+
planeMatrix.setPosition(position);
|
|
46
|
+
const projectionMatrix = planeMatrix.clone().invert();
|
|
47
|
+
const planePoints = points.map(p => {
|
|
48
|
+
const p3 = p.clone().applyMatrix4(projectionMatrix);
|
|
49
|
+
return new Vector2(p3.x, p3.y);
|
|
50
|
+
});
|
|
51
|
+
const shape = new Shape(planePoints);
|
|
52
|
+
const geometry = new ShapeGeometry(shape);
|
|
53
|
+
const polygonBox = new Box2();
|
|
54
|
+
polygonBox.setFromPoints(planePoints);
|
|
55
|
+
const uvMatrix = createUVMatrix(polygonBox);
|
|
56
|
+
const uvAttr = geometry.getAttribute('uv');
|
|
57
|
+
uvAttr.applyMatrix3(uvMatrix);
|
|
58
|
+
geometry.applyMatrix4(modelMatrix);
|
|
59
|
+
return { geometry, polygonBox, modelMatrix, planeMatrix, projectionMatrix, position, };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 创建平面投影矩阵
|
|
63
|
+
* @param points
|
|
64
|
+
*/
|
|
65
|
+
function createPlaneMatrix(points) {
|
|
66
|
+
const [p1, p2, p3] = points;
|
|
67
|
+
const plane = new Plane();
|
|
68
|
+
plane.setFromCoplanarPoints(p2, p1, p3);
|
|
69
|
+
const zAxis = plane.normal;
|
|
70
|
+
const xAxis = zAxis.clone().cross(new Vector3(0, 0, 1));
|
|
71
|
+
if (xAxis.equals(new Vector3())) {
|
|
72
|
+
xAxis.set(1, 0, 0);
|
|
73
|
+
}
|
|
74
|
+
const yAxis = zAxis.clone().cross(xAxis);
|
|
75
|
+
xAxis.normalize();
|
|
76
|
+
yAxis.normalize();
|
|
77
|
+
zAxis.normalize();
|
|
78
|
+
const matrix = new Matrix3();
|
|
79
|
+
matrix.elements = [
|
|
80
|
+
xAxis.x, xAxis.y, xAxis.z,
|
|
81
|
+
yAxis.x, yAxis.y, yAxis.z,
|
|
82
|
+
zAxis.x, zAxis.y, zAxis.z
|
|
83
|
+
];
|
|
84
|
+
return matrix;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 创建 uv 变换矩阵
|
|
88
|
+
* @remarks
|
|
89
|
+
* 需要对热力图数据进行y值翻转
|
|
90
|
+
* @param points
|
|
91
|
+
* @returns
|
|
92
|
+
*/
|
|
93
|
+
function createUVMatrix(box) {
|
|
94
|
+
const min = box.min;
|
|
95
|
+
const scale = box.getSize(new Vector2());
|
|
96
|
+
const uvMatrix = new Matrix3();
|
|
97
|
+
uvMatrix.elements = [
|
|
98
|
+
scale.x, 0, 0,
|
|
99
|
+
0, scale.y, 0,
|
|
100
|
+
min.x, min.y, 1
|
|
101
|
+
];
|
|
102
|
+
return uvMatrix.invert();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 不需要对热力图数据进行y值翻转
|
|
106
|
+
*/
|
|
107
|
+
// export function createUVMatrix ( box: Box2 ): Matrix3 {
|
|
108
|
+
// const min = box.min
|
|
109
|
+
// const scale = box.getSize( new Vector2() )
|
|
110
|
+
// const translate1 = new Matrix3()
|
|
111
|
+
// translate1.elements[ 7 ] = -1
|
|
112
|
+
// const turnY = new Matrix3()
|
|
113
|
+
// turnY.elements[ 4 ] = -1
|
|
114
|
+
// const zoom = new Matrix3()
|
|
115
|
+
// zoom.elements[ 0 ] = scale.x
|
|
116
|
+
// zoom.elements[ 4 ] = scale.y
|
|
117
|
+
// const translate2 = new Matrix3()
|
|
118
|
+
// translate2.elements[ 6 ] = min.x
|
|
119
|
+
// translate2.elements[ 7 ] = min.y
|
|
120
|
+
// const uvMatrix = translate2.clone()
|
|
121
|
+
// uvMatrix.multiply( zoom ).multiply( turnY ).multiply( translate1 )
|
|
122
|
+
// return uvMatrix.invert()
|
|
123
|
+
// }
|
|
124
|
+
/**
|
|
125
|
+
* 生成区间内随机数
|
|
126
|
+
* @param min
|
|
127
|
+
* @param max
|
|
128
|
+
* @returns
|
|
129
|
+
*/
|
|
130
|
+
function generateRandomNumber(min, max) {
|
|
131
|
+
if (min >= max) {
|
|
132
|
+
throw new Error('Min value must be less than max value.');
|
|
133
|
+
}
|
|
134
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
135
|
+
}
|
|
136
|
+
function getHeatPoint(event, type, param, dataPoints, store, ssp) {
|
|
137
|
+
const { min, max, radius, beforePointUpdate, value, distanceInterval, } = param;
|
|
138
|
+
const hmObject = store.object;
|
|
139
|
+
const intersects = ssp.viewport.getIntersects(event, [hmObject]);
|
|
140
|
+
if (!((intersects === null || intersects === void 0 ? void 0 : intersects.length) > 0)) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const position = intersects[0].point.clone();
|
|
144
|
+
// 距离小于 distanceInterval 不绘制
|
|
145
|
+
if (dataPoints.length > 0 && distanceInterval) {
|
|
146
|
+
const { x, y, z, } = dataPoints[dataPoints.length - 1];
|
|
147
|
+
const prevPoint = new Vector3(x, y, z);
|
|
148
|
+
if (distanceInterval > prevPoint.distanceTo(position)) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const pointValue = Array.isArray(value) ? generateRandomNumber(value[0], value[1]) : value;
|
|
153
|
+
// 热力点
|
|
154
|
+
const point = Object.assign(Object.assign({}, position), { radius: radius, value: pointValue });
|
|
155
|
+
const newPoint = beforePointUpdate === null || beforePointUpdate === void 0 ? void 0 : beforePointUpdate(type, point, dataPoints);
|
|
156
|
+
if (newPoint === false) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
return typeof newPoint === 'object' ? newPoint : point;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
class CreateDrawing {
|
|
163
|
+
constructor(heatMapPlugin, param) {
|
|
164
|
+
this.heatMapPlugin = heatMapPlugin;
|
|
165
|
+
this.store = new Map();
|
|
166
|
+
// 用时间形式加热力点
|
|
167
|
+
this.intervalId = null;
|
|
168
|
+
// 存储鼠标当前所在点事件
|
|
169
|
+
this.currentMouseEvent = null;
|
|
170
|
+
// 绑定事件
|
|
171
|
+
this.events = {};
|
|
172
|
+
// 拖拽
|
|
173
|
+
this.isDragging = false;
|
|
174
|
+
// 开始绘制
|
|
175
|
+
this.isStarting = false;
|
|
176
|
+
// 所有热力点
|
|
177
|
+
this.dataPoints = [];
|
|
178
|
+
// 开始绘制热力点 绑定事件
|
|
179
|
+
this.start = () => {
|
|
180
|
+
const { addTriggerType, doneTriggerType, undoTriggerType, } = this.createDrawingParam;
|
|
181
|
+
return new Promise((resolve, reject) => {
|
|
182
|
+
this.startResolve = resolve;
|
|
183
|
+
this.startReject = reject;
|
|
184
|
+
// 已经开始则不执行
|
|
185
|
+
if (this.isStarting) {
|
|
186
|
+
console.warn('请先取消绘制再调用start方法');
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
this.isStarting = true;
|
|
190
|
+
// 添加点
|
|
191
|
+
this.handleEventListeners('add', addTriggerType, this.handleAddPoint);
|
|
192
|
+
// 完成
|
|
193
|
+
this.handleEventListeners('add', doneTriggerType, this.done);
|
|
194
|
+
// 删除点
|
|
195
|
+
this.handleEventListeners('add', undoTriggerType, this.popPoint);
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
// 取消
|
|
199
|
+
this.cancel = () => {
|
|
200
|
+
var _a;
|
|
201
|
+
const { id, } = this.createDrawingParam;
|
|
202
|
+
const newDataPoints = [...this.dataPoints];
|
|
203
|
+
this.heatMapPlugin.setDataPolygon(id, []);
|
|
204
|
+
this.remove();
|
|
205
|
+
(_a = this.startReject) === null || _a === void 0 ? void 0 : _a.call(this, newDataPoints);
|
|
206
|
+
};
|
|
207
|
+
// 销毁
|
|
208
|
+
this.dispose = () => {
|
|
209
|
+
const { id, } = this.createDrawingParam;
|
|
210
|
+
this.remove();
|
|
211
|
+
this.heatMapPlugin.removeById(id);
|
|
212
|
+
};
|
|
213
|
+
// 完成
|
|
214
|
+
this.done = () => {
|
|
215
|
+
var _a;
|
|
216
|
+
const newDataPoints = [...this.dataPoints];
|
|
217
|
+
this.remove();
|
|
218
|
+
(_a = this.startResolve) === null || _a === void 0 ? void 0 : _a.call(this, newDataPoints);
|
|
219
|
+
};
|
|
220
|
+
// 移除监听
|
|
221
|
+
this.remove = () => {
|
|
222
|
+
const { addTriggerType, doneTriggerType, undoTriggerType, } = this.createDrawingParam;
|
|
223
|
+
this.dataPoints = [];
|
|
224
|
+
this.lastTime = undefined;
|
|
225
|
+
this.setMouseEvent(null);
|
|
226
|
+
// 添加点
|
|
227
|
+
this.handleEventListeners('remove', addTriggerType, this.handleAddPoint);
|
|
228
|
+
// 完成
|
|
229
|
+
this.handleEventListeners('remove', doneTriggerType, this.done);
|
|
230
|
+
// 删除点
|
|
231
|
+
this.handleEventListeners('remove', undoTriggerType, this.popPoint);
|
|
232
|
+
this.events = {};
|
|
233
|
+
this.isDragging = false;
|
|
234
|
+
this.ssp.controls.enabled = true;
|
|
235
|
+
this.isStarting = false;
|
|
236
|
+
};
|
|
237
|
+
// 增加热力点
|
|
238
|
+
this.pushPoint = (point) => {
|
|
239
|
+
if (!point) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const { id, onAdd, } = this.createDrawingParam;
|
|
243
|
+
const newPoint = point;
|
|
244
|
+
this.dataPoints.push(newPoint);
|
|
245
|
+
this.heatMapPlugin.setDataPolygon(id, this.dataPoints);
|
|
246
|
+
onAdd === null || onAdd === void 0 ? void 0 : onAdd(newPoint, this.dataPoints);
|
|
247
|
+
};
|
|
248
|
+
// 删除上一个热力点
|
|
249
|
+
this.popPoint = () => {
|
|
250
|
+
var _a;
|
|
251
|
+
const len = (_a = this.dataPoints) === null || _a === void 0 ? void 0 : _a.length;
|
|
252
|
+
if (!(len > 0)) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const { id, beforePointUpdate, onUndo, } = this.createDrawingParam;
|
|
256
|
+
const newPoint = beforePointUpdate === null || beforePointUpdate === void 0 ? void 0 : beforePointUpdate("undo" /* StartEventType.undo */, this.dataPoints[len - 1], this.dataPoints);
|
|
257
|
+
if (newPoint === false) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
typeof newPoint === 'object' && (this.dataPoints[len - 1] = newPoint);
|
|
261
|
+
const poppedPoint = this.dataPoints.pop();
|
|
262
|
+
if (poppedPoint) {
|
|
263
|
+
this.heatMapPlugin.setDataPolygon(id, this.dataPoints);
|
|
264
|
+
onUndo === null || onUndo === void 0 ? void 0 : onUndo(poppedPoint, this.dataPoints);
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
this.handleAddPoint = (event) => {
|
|
268
|
+
if (!(event === null || event === void 0 ? void 0 : event.clientX)) {
|
|
269
|
+
throw new Error('addTriggerType仅支持:time、drag、click、dblClick、rightClick、mouseDown、mouseMove、mouseUp、mouseWheel');
|
|
270
|
+
}
|
|
271
|
+
this.setMouseEvent(event);
|
|
272
|
+
const point = this.getPoint(event, "add" /* StartEventType.add */);
|
|
273
|
+
this.pushPoint(point);
|
|
274
|
+
};
|
|
275
|
+
// 设置鼠标事件
|
|
276
|
+
this.setMouseEvent = (event) => {
|
|
277
|
+
this.currentMouseEvent = event;
|
|
278
|
+
};
|
|
279
|
+
this.handleEventListeners = (type, modes, fn) => {
|
|
280
|
+
if (!((modes === null || modes === void 0 ? void 0 : modes.length) > 0)) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
modes.forEach((mode) => {
|
|
284
|
+
var _a, _b, _c, _d;
|
|
285
|
+
if (typeof mode === 'object') {
|
|
286
|
+
for (const [key, value] of Object.entries(mode)) {
|
|
287
|
+
const eventKey = `${key}_${value.join('_')}`;
|
|
288
|
+
if (type === 'add') {
|
|
289
|
+
this.events[eventKey] = (event) => {
|
|
290
|
+
this.keyEvents(value, fn, event);
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
(_b = (_a = this.ssp.signals[key]) === null || _a === void 0 ? void 0 : _a[type]) === null || _b === void 0 ? void 0 : _b.call(_a, this.events[eventKey]);
|
|
294
|
+
}
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
// 间隔一定时间加点
|
|
298
|
+
if (mode === 'time') {
|
|
299
|
+
if (type === 'add') {
|
|
300
|
+
const { timeInterval, } = this.createDrawingParam || {};
|
|
301
|
+
this.ssp.signals.mouseMove.add(this.setMouseEvent);
|
|
302
|
+
this.intervalId = setInterval(() => {
|
|
303
|
+
if (!this.currentMouseEvent) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
fn(this.currentMouseEvent);
|
|
307
|
+
}, timeInterval);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
this.ssp.signals.mouseMove.remove(this.setMouseEvent);
|
|
311
|
+
}
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
// 拖拽加点
|
|
315
|
+
if (mode === 'drag') {
|
|
316
|
+
const container = this.ssp.viewport.container;
|
|
317
|
+
const eventKey = mode;
|
|
318
|
+
if (type === 'add') {
|
|
319
|
+
this.events[eventKey] = (event) => {
|
|
320
|
+
this.onPointerMove(fn, event);
|
|
321
|
+
};
|
|
322
|
+
container.addEventListener('pointerdown', this.onPointerdown);
|
|
323
|
+
container.addEventListener('pointermove', this.events[eventKey]);
|
|
324
|
+
container.addEventListener('pointerup', this.onPointerUp);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
container.removeEventListener('pointerdown', this.onPointerdown);
|
|
328
|
+
container.removeEventListener('pointermove', this.events[eventKey]);
|
|
329
|
+
container.removeEventListener('pointerup', this.onPointerUp);
|
|
330
|
+
}
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
(_d = (_c = this.ssp.signals[mode]) === null || _c === void 0 ? void 0 : _c[type]) === null || _d === void 0 ? void 0 : _d.call(_c, fn);
|
|
334
|
+
});
|
|
335
|
+
if (type === 'remove' && this.intervalId) {
|
|
336
|
+
clearInterval(this.intervalId);
|
|
337
|
+
this.intervalId = null;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
this.onPointerdown = (event) => {
|
|
341
|
+
this.ssp.controls.enabled = false;
|
|
342
|
+
this.isDragging = true;
|
|
343
|
+
};
|
|
344
|
+
this.onPointerMove = (fn, event) => {
|
|
345
|
+
event.preventDefault();
|
|
346
|
+
if (this.isDragging) {
|
|
347
|
+
fn(event);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
this.onPointerUp = (event) => {
|
|
351
|
+
this.isDragging = false;
|
|
352
|
+
this.ssp.controls.enabled = true;
|
|
353
|
+
};
|
|
354
|
+
const { data = [], } = param;
|
|
355
|
+
this.ssp = heatMapPlugin.ssp;
|
|
356
|
+
this.store = heatMapPlugin.store;
|
|
357
|
+
this.createDrawingParam = param;
|
|
358
|
+
this.dataPoints = [...data];
|
|
359
|
+
// 创建热力图
|
|
360
|
+
this.object = heatMapPlugin.createPolygon(param);
|
|
361
|
+
// this.result = new Promise( ( resolve, reject ) => {
|
|
362
|
+
// this.start().then( ( res ) => {
|
|
363
|
+
// resolve( res )
|
|
364
|
+
// } ).catch( ( error ) => {
|
|
365
|
+
// reject( error )
|
|
366
|
+
// } )
|
|
367
|
+
// } )
|
|
368
|
+
}
|
|
369
|
+
keyEvents(value, fn, event) {
|
|
370
|
+
if (value === null || value === void 0 ? void 0 : value.includes(event.code)) {
|
|
371
|
+
fn();
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// 通过鼠标事件获取热力点
|
|
375
|
+
getPoint(event, type) {
|
|
376
|
+
const { id, timeInterval = 100, } = this.createDrawingParam;
|
|
377
|
+
// 小于间隔时间不绘制
|
|
378
|
+
if (this.lastTime && timeInterval && timeInterval > new Date().getTime() - this.lastTime.getTime()) {
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
this.lastTime = new Date();
|
|
382
|
+
const store = this.store.get(id);
|
|
383
|
+
return getHeatPoint(event, type, this.createDrawingParam, this.dataPoints, store, this.ssp);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
class HeatMapPlugin {
|
|
388
|
+
constructor(ssp) {
|
|
389
|
+
this.ssp = ssp;
|
|
390
|
+
this.store = new Map();
|
|
391
|
+
this.maxCanvasSize = 512;
|
|
392
|
+
this.hmInstance = null;
|
|
393
|
+
}
|
|
394
|
+
create(param) {
|
|
395
|
+
const { id, name, yAxisHeight, minPosition, maxPosition, data, min = 0, max = 100, radius = 100, canvasScalar = 1, } = param;
|
|
396
|
+
// 计算中心点
|
|
397
|
+
const centerPosition = new Vector3((maxPosition.x + minPosition.x) / 2, yAxisHeight, (maxPosition.z + minPosition.z) / 2);
|
|
398
|
+
// 空间平面宽高
|
|
399
|
+
const width = maxPosition.x - minPosition.x;
|
|
400
|
+
const height = maxPosition.z - minPosition.z;
|
|
401
|
+
const canvasSize = this._formatCanvasSize(width * canvasScalar, height * canvasScalar);
|
|
402
|
+
const { canvas, hmInstance, } = this.createInitData(Object.assign(Object.assign({}, canvasSize), { radius }));
|
|
403
|
+
hmInstance.setData({
|
|
404
|
+
max,
|
|
405
|
+
min,
|
|
406
|
+
data: this._formatData(data, minPosition, { width, height, }, canvasSize),
|
|
407
|
+
});
|
|
408
|
+
const geometry = new PlaneGeometry(width, height);
|
|
409
|
+
const texture = new CanvasTexture(canvas);
|
|
410
|
+
const material = new MeshStandardMaterial({
|
|
411
|
+
map: texture,
|
|
412
|
+
depthWrite: false,
|
|
413
|
+
transparent: true,
|
|
414
|
+
});
|
|
415
|
+
const heatMapPlane = new Mesh(geometry, material);
|
|
416
|
+
const hmObject = this.ssp.createPluginObject({
|
|
417
|
+
id,
|
|
418
|
+
name,
|
|
419
|
+
position: centerPosition.clone(),
|
|
420
|
+
rotation: {
|
|
421
|
+
x: -Math.PI / 2,
|
|
422
|
+
y: 0,
|
|
423
|
+
z: 0,
|
|
424
|
+
},
|
|
425
|
+
}, heatMapPlane);
|
|
426
|
+
this.store.set(id, {
|
|
427
|
+
object: hmObject,
|
|
428
|
+
canvas,
|
|
429
|
+
param: Object.assign(Object.assign({}, param), { min, max }),
|
|
430
|
+
width,
|
|
431
|
+
height,
|
|
432
|
+
});
|
|
433
|
+
return hmObject;
|
|
434
|
+
}
|
|
435
|
+
createPolygon(param) {
|
|
436
|
+
const { id, name, points, data, min = 0, max = 100, radius = 100, } = param;
|
|
437
|
+
const pos = points.map(p => new Vector3(p.x, p.y, p.z));
|
|
438
|
+
const { geometry, projectionMatrix, polygonBox, position, } = getPolygonGeometryInfo(pos);
|
|
439
|
+
// 计算中心点
|
|
440
|
+
const pointBox = new Box3();
|
|
441
|
+
pointBox.setFromPoints(pos);
|
|
442
|
+
// 空间平面宽高
|
|
443
|
+
const { x: width, y: height, } = polygonBox.getSize(new Vector2());
|
|
444
|
+
const canvasSize = this._formatCanvasSize(width, height);
|
|
445
|
+
const { canvas, hmInstance, } = this.createInitData(Object.assign(Object.assign({}, canvasSize), { radius }));
|
|
446
|
+
if (data && data.length > 0) {
|
|
447
|
+
hmInstance.setData({
|
|
448
|
+
max,
|
|
449
|
+
min,
|
|
450
|
+
data: this._formatData_Polygon(data, projectionMatrix, polygonBox, canvasSize),
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
const texture = new CanvasTexture(canvas);
|
|
454
|
+
const material = new MeshStandardMaterial({
|
|
455
|
+
map: texture,
|
|
456
|
+
depthWrite: false,
|
|
457
|
+
transparent: true,
|
|
458
|
+
side: DoubleSide,
|
|
459
|
+
});
|
|
460
|
+
const heatMapPlane = new this.ssp.library.BaseMesh({ id: `${id}_mesh`, name, }, geometry, material);
|
|
461
|
+
heatMapPlane.renderOrder = 0;
|
|
462
|
+
const hmObject = this.ssp.createPluginObject({
|
|
463
|
+
id,
|
|
464
|
+
name,
|
|
465
|
+
position: position,
|
|
466
|
+
}, heatMapPlane);
|
|
467
|
+
this.store.set(id, {
|
|
468
|
+
object: hmObject,
|
|
469
|
+
canvas,
|
|
470
|
+
param: Object.assign(Object.assign({}, param), { min, max }),
|
|
471
|
+
width,
|
|
472
|
+
height,
|
|
473
|
+
projectionMatrix,
|
|
474
|
+
polygonBox,
|
|
475
|
+
position: position.clone(),
|
|
476
|
+
});
|
|
477
|
+
return hmObject;
|
|
478
|
+
}
|
|
479
|
+
createDrawing(param) {
|
|
480
|
+
const { data = [], addTriggerType = ['click', 'mouseMove'], doneTriggerType = ['dblClick', { keyDown: ['Enter'], }], undoTriggerType = ['rightClick', { keyDown: ['Backspace'], }], timeInterval = 100, min = 0, max = 100, radius = 100, value = [min, max], distanceInterval = 5 } = param, reset = __rest(param, ["data", "addTriggerType", "doneTriggerType", "undoTriggerType", "timeInterval", "min", "max", "radius", "value", "distanceInterval"]);
|
|
481
|
+
const defaultParam = Object.assign({ data, addTriggerType,
|
|
482
|
+
doneTriggerType, undoTriggerType, timeInterval,
|
|
483
|
+
min, max, radius, value, distanceInterval }, reset);
|
|
484
|
+
// const draw = new CreateDrawing( this.ssp, defaultParam, this.store, this.setDataPolygon.bind( this ) )
|
|
485
|
+
const draw = new CreateDrawing(this, defaultParam);
|
|
486
|
+
return draw;
|
|
487
|
+
}
|
|
488
|
+
setData(id, data) {
|
|
489
|
+
const store = this.store.get(id);
|
|
490
|
+
if (store) {
|
|
491
|
+
const { object, canvas, param: { minPosition, min, max, }, width, height, } = store;
|
|
492
|
+
const initData = this.createInitData();
|
|
493
|
+
const { canvas: newCanvas, hmInstance, } = initData;
|
|
494
|
+
hmInstance.renderer.updateConfig({
|
|
495
|
+
width: canvas.width,
|
|
496
|
+
height: canvas.height,
|
|
497
|
+
});
|
|
498
|
+
hmInstance.setData({
|
|
499
|
+
max,
|
|
500
|
+
min,
|
|
501
|
+
data: this._formatData(data, minPosition, { width, height, }, this._formatCanvasSize(width, height)),
|
|
502
|
+
});
|
|
503
|
+
const material = object.children[0].material;
|
|
504
|
+
this.ssp.render(() => {
|
|
505
|
+
const texture = new CanvasTexture(newCanvas);
|
|
506
|
+
if (material.map)
|
|
507
|
+
material.map.dispose();
|
|
508
|
+
material.map = texture;
|
|
509
|
+
});
|
|
510
|
+
return object;
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
return console.warn(`In soonspacejs: 插件(plugin-heat-map)未找到 id 为 '"${id}"' 的热力图对象!`);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
setDataPolygon(id, data) {
|
|
517
|
+
const store = this.store.get(id);
|
|
518
|
+
if (store) {
|
|
519
|
+
const { object, canvas, param: { min, max, }, projectionMatrix, polygonBox, position, } = store;
|
|
520
|
+
if (!projectionMatrix)
|
|
521
|
+
throw new Error(`${id} 不是多边形热力图类型`);
|
|
522
|
+
const heatObj = this.getById(id);
|
|
523
|
+
const currPosition = heatObj === null || heatObj === void 0 ? void 0 : heatObj.getWorldPosition(new Vector3());
|
|
524
|
+
const initData = this.createInitData();
|
|
525
|
+
const { canvas: newCanvas, hmInstance, } = initData;
|
|
526
|
+
hmInstance.renderer.updateConfig({
|
|
527
|
+
width: canvas.width,
|
|
528
|
+
height: canvas.height,
|
|
529
|
+
});
|
|
530
|
+
const polygonSize = polygonBox.getSize(new Vector2());
|
|
531
|
+
hmInstance.setData({
|
|
532
|
+
max,
|
|
533
|
+
min,
|
|
534
|
+
data: this._formatData_Polygon(data, projectionMatrix, polygonBox, this._formatCanvasSize(polygonSize.x, polygonSize.y), position, currPosition),
|
|
535
|
+
});
|
|
536
|
+
const material = object.children[0].material;
|
|
537
|
+
this.ssp.render(() => {
|
|
538
|
+
const texture = new CanvasTexture(newCanvas);
|
|
539
|
+
if (material.map)
|
|
540
|
+
material.map.dispose();
|
|
541
|
+
material.map = texture;
|
|
542
|
+
});
|
|
543
|
+
return object;
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
return console.warn(`In soonspacejs: 插件(plugin-heat-map)未找到 id 为 '"${id}"' 的热力图对象!`);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
getById(id) {
|
|
550
|
+
return this.ssp.getObjectById(id);
|
|
551
|
+
}
|
|
552
|
+
getByName(name) {
|
|
553
|
+
return this.ssp.getObjectByName(name);
|
|
554
|
+
}
|
|
555
|
+
removeById(id) {
|
|
556
|
+
if (this.store.has(id)) {
|
|
557
|
+
this.ssp.removeObjectById(id);
|
|
558
|
+
this.store.delete(id);
|
|
559
|
+
return true;
|
|
560
|
+
}
|
|
561
|
+
return false;
|
|
562
|
+
}
|
|
563
|
+
createInitData(param) {
|
|
564
|
+
const hmInstance = this.hmInstance = new r(param || {});
|
|
565
|
+
return { hmInstance, canvas: hmInstance.renderer.canvas, };
|
|
566
|
+
}
|
|
567
|
+
_formatCanvasSize(width, height) {
|
|
568
|
+
const ratio = width / height;
|
|
569
|
+
if (width > this.maxCanvasSize) {
|
|
570
|
+
width = this.maxCanvasSize;
|
|
571
|
+
height = width / ratio;
|
|
572
|
+
}
|
|
573
|
+
if (height > this.maxCanvasSize) {
|
|
574
|
+
height = this.maxCanvasSize;
|
|
575
|
+
width = ratio * height;
|
|
576
|
+
}
|
|
577
|
+
return { width, height, };
|
|
578
|
+
}
|
|
579
|
+
_formatData(data, minPosition, scenePlaneSize, canvasSize) {
|
|
580
|
+
return data.map(item => (Object.assign(Object.assign({}, item), {
|
|
581
|
+
// 取整,否则不生效
|
|
582
|
+
x: Math.trunc((item.x - minPosition.x) / scenePlaneSize.width * canvasSize.width), y: Math.trunc((item.z - minPosition.z) / scenePlaneSize.height * canvasSize.height) })));
|
|
583
|
+
}
|
|
584
|
+
_formatData_Polygon(data, projectionMatrix, polygonBox, canvasSize, oriPosition, currPosition) {
|
|
585
|
+
const offset = oriPosition && currPosition ? currPosition.clone().sub(oriPosition) : new Vector3(0, 0, 0);
|
|
586
|
+
return data.map(item => {
|
|
587
|
+
const point = new Vector3(item.x, item.y, item.z);
|
|
588
|
+
point.sub(offset);
|
|
589
|
+
point.applyMatrix4(projectionMatrix);
|
|
590
|
+
const { x, y, } = polygonBox.getParameter(new Vector2(point.x, point.y), new Vector2());
|
|
591
|
+
return Object.assign(Object.assign({}, item), {
|
|
592
|
+
// 取整,否则不生效
|
|
593
|
+
x: Math.trunc(x * canvasSize.width),
|
|
594
|
+
// 热力图图片的 y 轴的正方向是 从 图片上方 到 图片 下方
|
|
595
|
+
y: Math.trunc((1 - y) * canvasSize.height) });
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export { HeatMapPlugin as default };
|
|
601
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../../node_modules/heatmap-ts/dist/index.esm.js","../src/tools.ts","../src/CreateDrawing.ts","../src/index.ts"],"sourcesContent":["var t={defaultRadius:40,defaultGradient:{.25:\"rgb(0,0,255)\",.55:\"rgb(0,255,0)\",.85:\"yellow\",1:\"rgb(255,0,0)\"},defaultMaxOpacity:1,defaultMinOpacity:0,defaultBlur:.85,defaultXField:\"x\",defaultYField:\"y\",defaultValueField:\"value\",plugins:{}},i=function(){function t(){this.eStore={}}return t.prototype.on=function(t,i,a){this.eStore[t]||(this.eStore[t]=[]),this.eStore[t].push((function(t){return i.call(a,t)}))},t.prototype.emit=function(t,i){this.eStore[t]&&this.eStore[t].forEach((function(t){return t(i)}))},t}(),a=function(){function a(a){this.coordinator=new i,this.data=[],this.radi=[],this.min=10,this.max=1,this.xField=a.xField||t.defaultXField,this.yField=a.yField||t.defaultYField,this.valueField=a.valueField||t.defaultValueField,this.radius=a.radius||t.defaultRadius}return a.prototype._organiseData=function(t,i){var a=t[this.xField],e=t[this.yField],r=this.radi,n=this.data,s=this.max,h=this.min,o=t[this.valueField]||1,d=t.radius||this.radius;r[a]||(n[a]=[],r[a]=[]),r[a][e]?n[a][e]+=o:(n[a][e]=o,r[a][e]=d);var u=n[a][e];return u?u>s?(i?this.setDataMax(u):this.max=u,!1):u<h?(i?this.setDataMin(u):this.min=u,!1):void 0:{x:a,y:e,value:o,radius:d,min:h,max:s}},a.prototype._unOrganizeData=function(){for(var t=[],i=0;i<this.radi.length;i++)for(var a=0;a<this.radi[i].length;a++)t.push({x:i,y:a,radius:this.radi[i][a],value:this.radi[i][a]});return{min:this.min,max:this.max,data:t}},a.prototype._onExtremaChange=function(){this.coordinator.emit(\"extremachange\",{min:this.min,max:this.max})},a.prototype.addData=function(t){var i=this._organiseData(t,!0);i&&(0===this.data.length&&(this.min=i.value,this.max=i.value),this.coordinator.emit(\"renderpartial\",{min:this.min,max:this.max,data:[i]}))},a.prototype.setData=function(t){var i=t.data;this.data=[],this.radi=[];for(var a=0;a<i.length;a++)this._organiseData(i[a],!1);return this.min=t.min||0,this.max=t.max||100,this._onExtremaChange(),this.coordinator.emit(\"renderall\",this._getInternalData()),this},a.prototype.setDataMax=function(t){return this.max=t,this._onExtremaChange(),this.coordinator.emit(\"renderall\",this._getInternalData()),this},a.prototype.setDataMin=function(t){return this.min=t,this._onExtremaChange(),this.coordinator.emit(\"renderall\",this._getInternalData()),this},a.prototype._getInternalData=function(){return{max:this.max,min:this.min,data:this.data,radi:this.radi}},a.prototype.getData=function(){return this._unOrganizeData()},a}(),e=function(){function i(t){this.canvas=t.canvas||document.createElement(\"canvas\"),this.ctx=this.canvas.getContext(\"2d\"),this.shadowCanvas=t.shadowCanvas||document.createElement(\"canvas\"),this.shadowCtx=this.shadowCanvas.getContext(\"2d\"),this.width=t.width||512,this.height=t.height||512,this.max=100,this.min=1,this.blur=1,this.opacity=1,this.maxOpacity=1,this.minOpacity=0,this.useGradientOpacity=!1,this.canvas.style.cssText=this.shadowCanvas.style.cssText=\"position:absolute;left:0;top:0;\",t.container&&(t.container.style.position=\"relative\",t.container.appendChild(this.canvas)),this.renderBoundaries=[1e4,1e4,0,0],this.palette=this._getColorPalette(t),this.templates=[],this._setStyles(t)}return i.prototype.renderPartial=function(t){t.data.length>0&&(this._drawAlpha(t),this._colorize())},i.prototype.renderAll=function(t){this._clear(),t.data.length>0&&(this._drawAlpha(this._prepareData(t)),this._colorize())},i.prototype.updateConfig=function(t){t.gradient&&this._updateGradient(t),this._setStyles(t)},i.prototype.setDimensions=function(t,i){this.width=this.canvas.width=this.shadowCanvas.width=t,this.height=this.canvas.height=this.shadowCanvas.height=i},i.prototype.getValueAt=function(t){if(!this.shadowCtx)return 0;var i=this.shadowCtx.getImageData(t.x,t.y,1,1);return Math.abs(this.max-this.min)*(i.data[3]/255)>>0},i.prototype.getDataURL=function(){return this.canvas.toDataURL()},i.prototype._getColorPalette=function(i){var a=i.gradient||t.defaultGradient,e=document.createElement(\"canvas\"),r=e.getContext(\"2d\");if(e.width=256,e.height=1,!r)return new Uint8ClampedArray(1024);var n=r.createLinearGradient(0,0,256,1);for(var s in a)n.addColorStop(Number(s),a[s]);return r.fillStyle=n,r.fillRect(0,0,256,1),r.getImageData(0,0,256,1).data},i.prototype._getPointTemplate=function(t,i){var a=document.createElement(\"canvas\"),e=a.getContext(\"2d\");if(!e)return a;var r=t,n=t;if(a.width=a.height=2*t,1===i)e.beginPath(),e.arc(r,n,t,0,2*Math.PI,!1),e.fillStyle=\"rgba(0,0,0,1)\",e.fill();else{var s=e.createRadialGradient(r,n,t*i,r,n,t);s.addColorStop(0,\"rgba(0,0,0,1)\"),s.addColorStop(1,\"rgba(0,0,0,0)\"),e.fillStyle=s,e.fillRect(0,0,2*t,2*t)}return a},i.prototype._prepareData=function(t){for(var i=[],a=t.min,e=t.max,r=t.radi,n=t.data,s=Object.keys(n),h=s.length;h--;)for(var o=s[h],d=Object.keys(n[o]),u=d.length;u--;){var l=d[u],c=n[o][l],p=r[o][l];i.push({x:Number(o),y:Number(l),value:c,radius:p})}return{min:a,max:e,data:i}},i.prototype._setStyles=function(i){this.blur=0===i.blur?0:i.blur||t.defaultBlur,i.backgroundColor&&(this.canvas.style.backgroundColor=i.backgroundColor),this.width=this.canvas.width=this.shadowCanvas.width=i.width||this.width,this.height=this.canvas.height=this.shadowCanvas.height=i.height||this.height,this.opacity=255*(i.opacity||0),this.maxOpacity=255*(i.maxOpacity||t.defaultMaxOpacity),this.minOpacity=255*(i.minOpacity||t.defaultMinOpacity),this.useGradientOpacity=!!i.useGradientOpacity},i.prototype._updateGradient=function(t){this.palette=this._getColorPalette(t)},i.prototype._drawAlpha=function(t){for(var i=this.min=t.min||0,a=this.max=t.max||100,e=t.data||[],r=e.length,n=1-this.blur;r--;){var s=e[r],h=s.x,o=s.y,d=s.radius,u=Math.min(s.value,a),l=h-d,c=o-d;if(!this.shadowCtx)return;var p=void 0;this.templates[d]?p=this.templates[d]:this.templates[d]=p=this._getPointTemplate(d,n);var m=(u-i)/(a-i);this.shadowCtx.globalAlpha=m<.01?.01:m,this.shadowCtx.drawImage(p,l,c),l<this.renderBoundaries[0]&&(this.renderBoundaries[0]=l),c<this.renderBoundaries[1]&&(this.renderBoundaries[1]=c),l+2*d>this.renderBoundaries[2]&&(this.renderBoundaries[2]=l+2*d),c+2*d>this.renderBoundaries[3]&&(this.renderBoundaries[3]=c+2*d)}},i.prototype._colorize=function(){var t=this.renderBoundaries[0],i=this.renderBoundaries[1],a=this.renderBoundaries[2]-t,e=this.renderBoundaries[3]-i,r=this.width,n=this.height;if(t<0&&(t=0),i<0&&(i=0),t+a>r&&(a=r-t),i+e>n&&(e=n-i),this.ctx&&this.shadowCtx){for(var s=this.shadowCtx.getImageData(t,i,a,e),h=3;h<s.data.length;h+=4){var o,d=s.data[h],u=4*d;if(u)o=this.opacity>0?this.opacity:d<this.maxOpacity?d<this.minOpacity?this.minOpacity:d:this.maxOpacity,s.data[h-3]=this.palette[u],s.data[h-2]=this.palette[u+1],s.data[h-1]=this.palette[u+2],s.data[h]=this.useGradientOpacity?this.palette[u+3]:o}this.ctx.putImageData(s,t,i),this.renderBoundaries=[1e3,1e3,0,0]}},i.prototype._clear=function(){this.ctx&&this.shadowCtx&&(this.ctx.clearRect(0,0,this.width,this.height),this.shadowCtx.clearRect(0,0,this.width,this.height))},i}(),r=function(){function i(t){this.config=t,this.renderer=new e(this.config),this.store=new a(this.config),this._init()}return i.prototype._init=function(){var i=this;this.store.coordinator.on(\"renderpartial\",this.renderer.renderPartial,this.renderer),this.store.coordinator.on(\"renderall\",this.renderer.renderAll,this.renderer),this.store.coordinator.on(\"extremachange\",(function(a){i.config.onExtremaChange&&i.config.onExtremaChange({min:a.min,max:a.max,gradient:i.config.gradient||t.defaultGradient})}))},i.prototype.addData=function(t){return this.store.addData(t),this},i.prototype.setData=function(t){return this.store.setData(t),this},i.prototype.setDataMaxx=function(t){return this.store.setDataMax(t),this},i.prototype.setDataMin=function(t){return this.store.setDataMin(t),this},i.prototype.repaint=function(){return this.store.coordinator.emit(\"renderall\",this.store._getInternalData()),this},i.prototype.getData=function(){return this.store.getData()},i.prototype.getDataURL=function(){return this.renderer.getDataURL()},i.prototype.getValueAt=function(t){return this.renderer.getValueAt(t)},i}();export default r;\n","import SoonSpace from 'soonspacejs'\r\nimport { Matrix3, Vector3, Box2, BufferAttribute, Matrix4, Plane, Shape, ShapeGeometry, Vector2, } from 'three'\r\nimport { DrawingParam, ScenePolygonDataPoint, StartEventType, StoreValuePolygon, } from '.'\r\n\r\n\r\nexport function getPolygonGeometryInfo ( points: Vector3[] ) {\r\n\r\n const matrix3 = createPlaneMatrix( points )\r\n\r\n const modelMatrix = new Matrix4()\r\n\r\n modelMatrix.setFromMatrix3( matrix3 )\r\n const position = points[ 0 ]\r\n\r\n const planeMatrix = modelMatrix.clone()\r\n\r\n planeMatrix.setPosition( position )\r\n\r\n const projectionMatrix = planeMatrix.clone().invert()\r\n \r\n\r\n const planePoints = points.map( p => {\r\n\r\n const p3 = p.clone().applyMatrix4( projectionMatrix )\r\n\r\n return new Vector2( p3.x, p3.y )\r\n \r\n } )\r\n \r\n\r\n const shape = new Shape( planePoints )\r\n const geometry = new ShapeGeometry( shape )\r\n\r\n const polygonBox = new Box2()\r\n\r\n polygonBox.setFromPoints( planePoints )\r\n const uvMatrix = createUVMatrix( polygonBox )\r\n\r\n const uvAttr = geometry.getAttribute( 'uv' ) as BufferAttribute\r\n\r\n uvAttr.applyMatrix3( uvMatrix )\r\n geometry.applyMatrix4( modelMatrix )\r\n\r\n return { geometry, polygonBox, modelMatrix, planeMatrix, projectionMatrix, position, }\r\n\r\n}\r\n\r\n\r\n/**\r\n * 创建平面投影矩阵\r\n * @param points \r\n */\r\nexport function createPlaneMatrix ( points: Vector3[] ) {\r\n\r\n const [ p1, p2, p3 ] = points\r\n const plane = new Plane()\r\n\r\n plane.setFromCoplanarPoints ( p2, p1, p3 )\r\n const zAxis = plane.normal\r\n const xAxis = zAxis.clone().cross( new Vector3( 0, 0, 1 ) )\r\n\r\n if ( xAxis.equals ( new Vector3() ) ) {\r\n\r\n xAxis.set( 1, 0, 0 )\r\n \r\n }\r\n const yAxis = zAxis.clone().cross( xAxis )\r\n \r\n xAxis.normalize()\r\n yAxis.normalize()\r\n zAxis.normalize()\r\n\r\n const matrix = new Matrix3()\r\n\r\n matrix.elements = [\r\n xAxis.x, xAxis.y, xAxis.z, \r\n yAxis.x, yAxis.y, yAxis.z, \r\n zAxis.x, zAxis.y, zAxis.z \r\n ]\r\n \r\n return matrix\r\n\r\n}\r\n\r\n\r\n/**\r\n * 创建 uv 变换矩阵\r\n * @remarks\r\n * 需要对热力图数据进行y值翻转\r\n * @param points \r\n * @returns \r\n */\r\nexport function createUVMatrix ( box: Box2 ): Matrix3 {\r\n\r\n const min = box.min\r\n const scale = box.getSize( new Vector2() )\r\n\r\n const uvMatrix = new Matrix3()\r\n\r\n uvMatrix.elements = [\r\n scale.x, 0, 0, \r\n 0, scale.y, 0, \r\n min.x, min.y, 1\r\n ]\r\n return uvMatrix.invert()\r\n\r\n}\r\n\r\n/**\r\n * 不需要对热力图数据进行y值翻转\r\n */\r\n// export function createUVMatrix ( box: Box2 ): Matrix3 {\r\n\r\n// const min = box.min\r\n// const scale = box.getSize( new Vector2() )\r\n\r\n// const translate1 = new Matrix3()\r\n\r\n// translate1.elements[ 7 ] = -1\r\n\r\n// const turnY = new Matrix3()\r\n\r\n// turnY.elements[ 4 ] = -1\r\n\r\n// const zoom = new Matrix3()\r\n\r\n// zoom.elements[ 0 ] = scale.x\r\n// zoom.elements[ 4 ] = scale.y\r\n\r\n\r\n// const translate2 = new Matrix3()\r\n\r\n// translate2.elements[ 6 ] = min.x\r\n// translate2.elements[ 7 ] = min.y\r\n\r\n// const uvMatrix = translate2.clone()\r\n\r\n// uvMatrix.multiply( zoom ).multiply( turnY ).multiply( translate1 )\r\n\r\n// return uvMatrix.invert()\r\n\r\n// }\r\n\r\n/**\r\n * 生成区间内随机数\r\n * @param min \r\n * @param max \r\n * @returns \r\n */\r\nexport function generateRandomNumber ( min: number, max: number ): number {\r\n\r\n if ( min >= max ) {\r\n\r\n throw new Error( 'Min value must be less than max value.' )\r\n \r\n }\r\n\r\n return Math.floor( Math.random() * ( max - min + 1 ) ) + min\r\n\r\n}\r\n\r\n\r\nexport function getHeatPoint ( event: MouseEvent, type: StartEventType, param: DrawingParam, dataPoints: DrawingParam['data'], store: StoreValuePolygon, ssp: SoonSpace ): ScenePolygonDataPoint | null {\r\n \r\n const { \r\n min, max, radius, beforePointUpdate, value, distanceInterval, \r\n } = param\r\n\r\n\r\n const hmObject = store.object\r\n const intersects = ssp.viewport.getIntersects( event, [ hmObject ] )\r\n\r\n if ( !( intersects?.length > 0 ) ) {\r\n\r\n return null\r\n \r\n }\r\n const position = intersects[ 0 ].point.clone()\r\n\r\n // 距离小于 distanceInterval 不绘制\r\n if ( dataPoints.length > 0 && distanceInterval ) {\r\n\r\n const { x, y, z, } = dataPoints[ dataPoints.length - 1 ]\r\n const prevPoint = new Vector3( x, y, z )\r\n\r\n if ( distanceInterval > prevPoint.distanceTo( position ) ) {\r\n\r\n return null\r\n \r\n }\r\n\r\n }\r\n const pointValue = Array.isArray( value ) ? generateRandomNumber( value[ 0 ], value[ 1 ] ) : value\r\n\r\n // 热力点\r\n const point: ScenePolygonDataPoint = { ...position, radius: radius as number, value: pointValue as number, }\r\n const newPoint = beforePointUpdate?.( type, point, dataPoints )\r\n\r\n if ( newPoint === false ) {\r\n\r\n return null\r\n \r\n }\r\n\r\n return typeof newPoint === 'object' ? newPoint : point\r\n\r\n}","import SoonSpace from 'soonspacejs'\r\nimport type { PluginObject, } from 'soonspacejs'\r\nimport { getHeatPoint, } from './tools'\r\nimport HeatMapPlugin, { DrawingModeType, DrawingParam, ScenePolygonDataPoint, StartEventType, StoreValue, StoreValuePolygon, } from '.'\r\n\r\nclass CreateDrawing {\r\n\r\n readonly store = new Map<string | number, StoreValue | StoreValuePolygon>()\r\n\r\n ssp: SoonSpace\r\n\r\n // 用时间形式加热力点\r\n intervalId: NodeJS.Timeout | null = null\r\n // 存储鼠标当前所在点事件\r\n currentMouseEvent: MouseEvent | null = null\r\n // 最后一次获取热力点的时间,用于节流\r\n lastTime: Date | undefined\r\n // 绑定事件\r\n events: { [key in string]: ( ( event: KeyboardEvent ) => void ) | ( ( event: PointerEvent ) => void ) } = {}\r\n\r\n // 拖拽\r\n isDragging = false\r\n\r\n // 开始绘制\r\n isStarting = false\r\n\r\n createDrawingParam: DrawingParam\r\n\r\n // 所有热力点\r\n dataPoints: DrawingParam['data'] = []\r\n\r\n // 热力图实例\r\n object: PluginObject\r\n\r\n startResolve: ( ( value: ScenePolygonDataPoint[] | PromiseLike<ScenePolygonDataPoint[]> ) => void ) | undefined\r\n startReject: ( ( value: ScenePolygonDataPoint[] | PromiseLike<ScenePolygonDataPoint[]> ) => void ) | undefined\r\n\r\n constructor ( readonly heatMapPlugin: HeatMapPlugin, param: DrawingParam ) {\r\n\r\n const { data = [], } = param\r\n\r\n this.ssp = heatMapPlugin.ssp\r\n\r\n this.store = heatMapPlugin.store\r\n this.createDrawingParam = param\r\n this.dataPoints = [ ...data ]\r\n\r\n // 创建热力图\r\n this.object = heatMapPlugin.createPolygon( param )\r\n\r\n // this.result = new Promise( ( resolve, reject ) => {\r\n\r\n // this.start().then( ( res ) => {\r\n\r\n // resolve( res )\r\n \r\n // } ).catch( ( error ) => {\r\n\r\n // reject( error )\r\n \r\n // } )\r\n \r\n // } )\r\n \r\n }\r\n\r\n // 开始绘制热力点 绑定事件\r\n start = () => {\r\n\r\n const { addTriggerType, doneTriggerType, undoTriggerType, } = this.createDrawingParam\r\n \r\n\r\n return new Promise<DrawingParam['data']>( ( resolve, reject ) => {\r\n\r\n this.startResolve = resolve\r\n this.startReject = reject\r\n\r\n // 已经开始则不执行\r\n if ( this.isStarting ) {\r\n\r\n console.warn( '请先取消绘制再调用start方法' )\r\n return\r\n \r\n }\r\n\r\n this.isStarting = true\r\n\r\n // 添加点\r\n this.handleEventListeners( 'add', addTriggerType as DrawingModeType, this.handleAddPoint )\r\n // 完成\r\n this.handleEventListeners( 'add', doneTriggerType as DrawingModeType, this.done )\r\n // 删除点\r\n this.handleEventListeners( 'add', undoTriggerType as DrawingModeType, this.popPoint )\r\n \r\n } )\r\n \r\n }\r\n // 取消\r\n cancel = () => {\r\n\r\n const { id, } = this.createDrawingParam\r\n\r\n const newDataPoints = [ ...this.dataPoints ]\r\n\r\n this.heatMapPlugin.setDataPolygon( id, [] )\r\n\r\n this.remove()\r\n this.startReject?.( newDataPoints )\r\n \r\n }\r\n // 销毁\r\n dispose = () => {\r\n\r\n const { id, } = this.createDrawingParam\r\n\r\n this.remove()\r\n this.heatMapPlugin.removeById( id )\r\n \r\n }\r\n // 完成\r\n done = () => {\r\n\r\n const newDataPoints = [ ...this.dataPoints ]\r\n\r\n this.remove()\r\n this.startResolve?.( newDataPoints )\r\n \r\n }\r\n \r\n // 移除监听\r\n remove = () => {\r\n\r\n const { addTriggerType, doneTriggerType, undoTriggerType, } = this.createDrawingParam\r\n\r\n this.dataPoints = []\r\n this.lastTime = undefined\r\n\r\n this.setMouseEvent( null )\r\n // 添加点\r\n this.handleEventListeners( 'remove', addTriggerType as DrawingModeType, this.handleAddPoint )\r\n // 完成\r\n this.handleEventListeners( 'remove', doneTriggerType as DrawingModeType, this.done )\r\n // 删除点\r\n this.handleEventListeners( 'remove', undoTriggerType as DrawingModeType, this.popPoint )\r\n\r\n this.events = {}\r\n this.isDragging = false\r\n this.ssp.controls.enabled = true\r\n this.isStarting = false\r\n \r\n }\r\n\r\n // 增加热力点\r\n private pushPoint = ( point: ScenePolygonDataPoint | null ) => {\r\n\r\n if ( !point ) {\r\n\r\n return\r\n \r\n }\r\n const { id, onAdd, } = this.createDrawingParam\r\n\r\n const newPoint = point\r\n\r\n this.dataPoints.push( newPoint )\r\n this.heatMapPlugin.setDataPolygon( id, this.dataPoints )\r\n\r\n onAdd?.( newPoint, this.dataPoints )\r\n \r\n }\r\n\r\n // 删除上一个热力点\r\n private popPoint = () => {\r\n\r\n const len = this.dataPoints?.length\r\n\r\n if ( !( len > 0 ) ) {\r\n\r\n return\r\n \r\n }\r\n const { id, beforePointUpdate, onUndo, } = this.createDrawingParam\r\n\r\n const newPoint = beforePointUpdate?.( StartEventType.undo, this.dataPoints[ len - 1 ], this.dataPoints )\r\n\r\n if ( newPoint === false ) {\r\n\r\n return\r\n \r\n }\r\n\r\n typeof newPoint === 'object' && ( this.dataPoints[ len - 1 ] = newPoint )\r\n\r\n const poppedPoint = this.dataPoints.pop()\r\n\r\n if ( poppedPoint ) {\r\n\r\n this.heatMapPlugin.setDataPolygon( id, this.dataPoints )\r\n onUndo?.( poppedPoint, this.dataPoints )\r\n \r\n }\r\n \r\n }\r\n\r\n private handleAddPoint = ( event: MouseEvent ) => {\r\n\r\n if ( !event?.clientX ) {\r\n\r\n throw new Error( 'addTriggerType仅支持:time、drag、click、dblClick、rightClick、mouseDown、mouseMove、mouseUp、mouseWheel' )\r\n \r\n }\r\n\r\n this.setMouseEvent( event )\r\n\r\n const point = this.getPoint( event, StartEventType.add )\r\n\r\n this.pushPoint( point )\r\n \r\n }\r\n\r\n // 设置鼠标事件\r\n private setMouseEvent = ( event: MouseEvent | null ) => {\r\n\r\n this.currentMouseEvent = event\r\n \r\n }\r\n\r\n private handleEventListeners = ( type: 'add' | 'remove', modes: DrawingModeType, fn: any ) => {\r\n\r\n if ( !( modes?.length > 0 ) ) {\r\n\r\n return\r\n \r\n }\r\n\r\n modes.forEach( ( mode ) => {\r\n\r\n if ( typeof mode === 'object' ) {\r\n\r\n for ( const [ key, value ] of Object.entries( mode ) ) {\r\n\r\n const eventKey = `${key}_${value.join( '_' )}`\r\n\r\n if ( type === 'add' ) {\r\n \r\n this.events[ eventKey ] = ( event: KeyboardEvent ) => {\r\n \r\n this.keyEvents( value, fn, event )\r\n \r\n }\r\n\r\n }\r\n\r\n this.ssp.signals[ key ]?.[ type ]?.( this.events[ eventKey ] )\r\n \r\n }\r\n\r\n return\r\n \r\n }\r\n\r\n // 间隔一定时间加点\r\n if ( mode === 'time' ) {\r\n\r\n if ( type === 'add' ) {\r\n\r\n const { timeInterval, } = this.createDrawingParam || {}\r\n\r\n this.ssp.signals.mouseMove.add( this.setMouseEvent )\r\n\r\n this.intervalId = setInterval( () => {\r\n\r\n if ( !this.currentMouseEvent ) {\r\n\r\n return\r\n \r\n }\r\n\r\n fn( this.currentMouseEvent )\r\n \r\n }, timeInterval )\r\n \r\n } else {\r\n\r\n this.ssp.signals.mouseMove.remove( this.setMouseEvent )\r\n \r\n }\r\n return\r\n \r\n }\r\n\r\n // 拖拽加点\r\n if ( mode === 'drag' ) {\r\n\r\n const container = this.ssp.viewport.container\r\n\r\n const eventKey = mode\r\n\r\n if ( type === 'add' ) {\r\n \r\n this.events[ eventKey ] = ( event: PointerEvent ) => {\r\n \r\n this.onPointerMove( fn, event )\r\n \r\n }\r\n\r\n container.addEventListener( 'pointerdown', this.onPointerdown )\r\n container.addEventListener( 'pointermove', this.events[ eventKey ] )\r\n container.addEventListener( 'pointerup', this.onPointerUp )\r\n \r\n } else {\r\n\r\n container.removeEventListener( 'pointerdown', this.onPointerdown )\r\n container.removeEventListener( 'pointermove', this.events[ eventKey ] as ( ( event: PointerEvent ) => void ) )\r\n container.removeEventListener( 'pointerup', this.onPointerUp )\r\n \r\n }\r\n\r\n return\r\n \r\n }\r\n\r\n this.ssp.signals[ mode ]?.[ type ]?.( fn )\r\n \r\n } )\r\n\r\n if ( type === 'remove' && this.intervalId ) {\r\n\r\n clearInterval( this.intervalId )\r\n this.intervalId = null\r\n \r\n }\r\n \r\n }\r\n\r\n private keyEvents ( value: string[], fn: any, event: KeyboardEvent ) {\r\n\r\n if ( value?.includes( event.code ) ) {\r\n\r\n fn()\r\n \r\n }\r\n \r\n }\r\n // 通过鼠标事件获取热力点\r\n private getPoint ( event: MouseEvent, type: StartEventType ): ScenePolygonDataPoint | null {\r\n\r\n const { id, timeInterval = 100, } = this.createDrawingParam\r\n\r\n // 小于间隔时间不绘制\r\n if ( this.lastTime && timeInterval && timeInterval > new Date().getTime() - this.lastTime.getTime() ) {\r\n\r\n return null\r\n \r\n }\r\n this.lastTime = new Date()\r\n\r\n const store = this.store.get( id ) as StoreValuePolygon\r\n\r\n return getHeatPoint( event, type, this.createDrawingParam, this.dataPoints, store, this.ssp )\r\n \r\n }\r\n\r\n private onPointerdown = ( event: MouseEvent ) => {\r\n\r\n this.ssp.controls.enabled = false\r\n this.isDragging = true\r\n \r\n }\r\n private onPointerMove = ( fn: any, event: MouseEvent ) => {\r\n\r\n event.preventDefault()\r\n\r\n if ( this.isDragging ) {\r\n\r\n fn( event )\r\n \r\n }\r\n \r\n }\r\n private onPointerUp = ( event: MouseEvent ) => {\r\n\r\n this.isDragging = false\r\n this.ssp.controls.enabled = true\r\n \r\n }\r\n\r\n}\r\n\r\nexport default CreateDrawing\r\n","import { Box2, Matrix4, MeshStandardMaterial, Vector3, Box3, CanvasTexture, DoubleSide, Mesh, Vector2, PlaneGeometry, } from 'three'\r\nimport SoonSpace, { IVector3, PlaneIVector2, SignalsState, } from 'soonspacejs'\r\nimport type { PluginObject, BaseMesh, } from 'soonspacejs'\r\nimport HeatMap, { DataPoint, } from 'heatmap-ts'\r\nimport { RendererConfig, } from 'heatmap-ts/dist/renderer'\r\nimport { getPolygonGeometryInfo, } from './tools'\r\nimport CreateDrawing from './CreateDrawing'\r\n\r\nexport interface SceneDataPoint extends Omit<DataPoint, 'y'> {\r\n z: number;\r\n}\r\n\r\nexport interface ScenePolygonDataPoint extends DataPoint {\r\n z: number;\r\n}\r\n\r\nexport interface CanvasSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface CreateParam {\r\n // base\r\n id: string;\r\n name?: PluginObject['name'];\r\n data: SceneDataPoint[];\r\n // position\r\n yAxisHeight: number;\r\n minPosition: PlaneIVector2;\r\n maxPosition: PlaneIVector2;\r\n // value\r\n min?: number;\r\n max?: number;\r\n radius?: number;\r\n canvasScalar?: number;\r\n}\r\nexport interface CreatePolygonParam {\r\n // base\r\n id: string;\r\n name?: PluginObject['name'];\r\n data?: ScenePolygonDataPoint[];\r\n // position\r\n points: IVector3[];\r\n // value\r\n min?: number;\r\n max?: number;\r\n radius?: number;\r\n}\r\n\r\nexport interface StartParam {\r\n // base\r\n id: string;\r\n name?: PluginObject['name'];\r\n data: ScenePolygonDataPoint[];\r\n // position\r\n points: IVector3[];\r\n // value\r\n min?: number;\r\n max?: number;\r\n radius?: number;\r\n value?: number | number[];\r\n}\r\n\r\ntype DrawingModeKeyType = {\r\n [keyType in 'keyDown' | 'keyUp']?: string[];\r\n\r\n}\r\nexport type DrawingModeType = ( keyof SignalsState | DrawingModeKeyType | 'time' )[]\r\nexport interface DrawingParam {\r\n // base\r\n id: string;\r\n name?: PluginObject['name'];\r\n data: ScenePolygonDataPoint[];\r\n // position\r\n points: IVector3[];\r\n // value\r\n min?: number;\r\n max?: number;\r\n radius?: number;\r\n value?: number | number[];\r\n\r\n // 节流间隔\r\n timeInterval?: number;\r\n distanceInterval?: number;\r\n\r\n addTriggerType?: DrawingModeType;\r\n doneTriggerType?: DrawingModeType;\r\n undoTriggerType?: DrawingModeType;\r\n // callback\r\n onAdd?: ( point: ScenePolygonDataPoint, data: ScenePolygonDataPoint[] ) => void;\r\n onUndo?: ( point: ScenePolygonDataPoint, data: ScenePolygonDataPoint[] ) => void;\r\n beforePointUpdate?: ( type: StartEventType, point: ScenePolygonDataPoint, data: ScenePolygonDataPoint[] ) => boolean | ScenePolygonDataPoint;\r\n}\r\n\r\nexport const enum StartEventType {\r\n 'add' = 'add',\r\n 'undo' = 'undo'\r\n}\r\n\r\ninterface DrawingRes {\r\n object: PluginObject;\r\n start: () => void;\r\n stop: () => void;\r\n cancel: () => void;\r\n}\r\n\r\nexport interface StoreValue {\r\n object: PluginObject;\r\n canvas: HTMLCanvasElement;\r\n param: CreateParam;\r\n width: number;\r\n height: number;\r\n projectionMatrix?: Matrix4;\r\n polygonBox?: Box2;\r\n}\r\nexport interface StoreValuePolygon {\r\n object: PluginObject;\r\n canvas: HTMLCanvasElement;\r\n param: CreatePolygonParam;\r\n projectionMatrix: Matrix4;\r\n polygonBox: Box2;\r\n position: Vector3;\r\n}\r\n\r\nexport default class HeatMapPlugin {\r\n\r\n hmInstance: HeatMap | null\r\n readonly store = new Map<string | number, StoreValue | StoreValuePolygon>()\r\n\r\n constructor ( readonly ssp: SoonSpace ) {\r\n\r\n this.hmInstance = null\r\n\r\n }\r\n\r\n maxCanvasSize = 512\r\n\r\n create ( param: CreateParam ): PluginObject {\r\n\r\n const {\r\n id,\r\n name,\r\n yAxisHeight,\r\n minPosition,\r\n maxPosition,\r\n data,\r\n min = 0,\r\n max = 100,\r\n radius = 100,\r\n canvasScalar = 1,\r\n } = param\r\n \r\n // 计算中心点\r\n const centerPosition = new Vector3( ( maxPosition.x + minPosition.x ) / 2, yAxisHeight, ( maxPosition.z + minPosition.z ) / 2 )\r\n\r\n // 空间平面宽高\r\n const width = maxPosition.x - minPosition.x\r\n const height = maxPosition.z - minPosition.z\r\n\r\n const canvasSize = this._formatCanvasSize( width * canvasScalar, height * canvasScalar )\r\n const { canvas, hmInstance, } = this.createInitData( { ...canvasSize, radius, } )\r\n\r\n hmInstance.setData( {\r\n max,\r\n min,\r\n data: this._formatData( data, minPosition, { width, height, }, canvasSize ),\r\n } )\r\n\r\n const geometry = new PlaneGeometry( width, height )\r\n\r\n const texture = new CanvasTexture( canvas )\r\n\r\n const material = new MeshStandardMaterial( {\r\n map: texture,\r\n depthWrite: false,\r\n transparent: true,\r\n } )\r\n\r\n const heatMapPlane = new Mesh( geometry, material )\r\n\r\n const hmObject = this.ssp.createPluginObject( {\r\n id,\r\n name,\r\n position: centerPosition.clone(),\r\n rotation: {\r\n x: -Math.PI / 2,\r\n y: 0,\r\n z: 0,\r\n },\r\n }, heatMapPlane )\r\n\r\n this.store.set( id, {\r\n object: hmObject,\r\n canvas,\r\n param: { ...param, min, max, },\r\n width,\r\n height,\r\n } )\r\n\r\n return hmObject\r\n\r\n }\r\n\r\n createPolygon ( param: CreatePolygonParam ): PluginObject {\r\n\r\n const {\r\n id,\r\n name,\r\n points,\r\n data,\r\n min = 0,\r\n max = 100,\r\n radius = 100,\r\n } = param\r\n\r\n const pos = points.map( p => new Vector3( p.x, p.y, p.z ) )\r\n\r\n const { geometry, projectionMatrix, polygonBox, position, } = getPolygonGeometryInfo( pos )\r\n\r\n // 计算中心点\r\n const pointBox = new Box3()\r\n\r\n pointBox.setFromPoints( pos )\r\n\r\n // 空间平面宽高\r\n const { x: width, y: height, } = polygonBox.getSize( new Vector2() )\r\n\r\n\r\n const canvasSize = this._formatCanvasSize( width, height )\r\n const { canvas, hmInstance, } = this.createInitData( { ...canvasSize, radius, } )\r\n\r\n if ( data && data.length > 0 ) {\r\n\r\n hmInstance.setData( {\r\n max,\r\n min,\r\n data: this._formatData_Polygon( data, projectionMatrix, polygonBox, canvasSize ),\r\n } )\r\n \r\n }\r\n \r\n\r\n const texture = new CanvasTexture( canvas )\r\n\r\n const material = new MeshStandardMaterial( {\r\n map: texture,\r\n depthWrite: false,\r\n transparent: true,\r\n side: DoubleSide,\r\n } )\r\n\r\n const heatMapPlane = new this.ssp.library.BaseMesh( { id: `${id}_mesh`, name, }, geometry, material )\r\n\r\n heatMapPlane.renderOrder = 0\r\n const hmObject = this.ssp.createPluginObject( {\r\n id,\r\n name,\r\n position: position,\r\n }, heatMapPlane )\r\n\r\n this.store.set( id, {\r\n object: hmObject,\r\n canvas,\r\n param: { ...param, min, max, },\r\n width,\r\n height,\r\n projectionMatrix,\r\n polygonBox,\r\n position: position.clone(),\r\n } )\r\n\r\n return hmObject\r\n\r\n }\r\n createDrawing ( param: DrawingParam ): CreateDrawing {\r\n\r\n const { \r\n data = [], addTriggerType = [ 'click', 'mouseMove' ],\r\n doneTriggerType = [ 'dblClick', { keyDown: [ 'Enter' ], } ], undoTriggerType = [ 'rightClick', { keyDown: [ 'Backspace' ], } ], timeInterval = 100, \r\n min = 0, max = 100, radius = 100, value = [ min, max ], distanceInterval = 5, ...reset\r\n } = param\r\n\r\n const defaultParam = { data, addTriggerType,\r\n doneTriggerType, undoTriggerType, timeInterval, \r\n min, max, radius, value, distanceInterval, ...reset, }\r\n\r\n \r\n // const draw = new CreateDrawing( this.ssp, defaultParam, this.store, this.setDataPolygon.bind( this ) )\r\n const draw = new CreateDrawing( this, defaultParam )\r\n\r\n return draw\r\n\r\n }\r\n\r\n setData ( id: CreateParam['id'], data: CreateParam['data'] ): PluginObject | void {\r\n\r\n const store = this.store.get( id ) as StoreValue\r\n\r\n if ( store ) {\r\n\r\n const { object, canvas, param: { minPosition, min, max, }, width, height, } = store\r\n const initData = this.createInitData()\r\n const { canvas: newCanvas, hmInstance, } = initData\r\n\r\n hmInstance.renderer.updateConfig( {\r\n width: canvas.width,\r\n height: canvas.height,\r\n } )\r\n\r\n hmInstance.setData( {\r\n max,\r\n min,\r\n data: this._formatData( data, minPosition, { width, height, }, this._formatCanvasSize( width, height ) ),\r\n } )\r\n\r\n const material = ( object.children[ 0 ] as BaseMesh ).material as MeshStandardMaterial\r\n\r\n this.ssp.render( () => {\r\n\r\n const texture = new CanvasTexture( newCanvas )\r\n\r\n if ( material.map ) material.map.dispose()\r\n material.map = texture\r\n\r\n } )\r\n\r\n return object\r\n\r\n } else {\r\n\r\n return console.warn( `In soonspacejs: 插件(plugin-heat-map)未找到 id 为 '\"${id}\"' 的热力图对象!` )\r\n\r\n }\r\n\r\n }\r\n setDataPolygon ( id: CreateParam['id'], data: Exclude<CreatePolygonParam['data'], undefined> ): PluginObject | void {\r\n\r\n const store = this.store.get( id ) as StoreValuePolygon\r\n\r\n if ( store ) {\r\n\r\n const { object, canvas, param: { min, max, }, projectionMatrix, polygonBox, position, } = store\r\n\r\n if ( !projectionMatrix ) throw new Error( `${id} 不是多边形热力图类型` )\r\n const heatObj = this.getById( id )\r\n\r\n const currPosition = heatObj?.getWorldPosition( new Vector3() )\r\n\r\n const initData = this.createInitData()\r\n\r\n const { canvas: newCanvas, hmInstance, } = initData\r\n \r\n hmInstance.renderer.updateConfig( {\r\n width: canvas.width,\r\n height: canvas.height,\r\n } )\r\n const polygonSize = polygonBox.getSize( new Vector2() )\r\n \r\n hmInstance.setData( {\r\n max,\r\n min,\r\n data: this._formatData_Polygon( data, projectionMatrix, polygonBox, this._formatCanvasSize( polygonSize.x, polygonSize.y ), position, currPosition ),\r\n } )\r\n\r\n const material = ( object.children[ 0 ] as BaseMesh ).material as MeshStandardMaterial\r\n\r\n this.ssp.render( () => {\r\n\r\n const texture = new CanvasTexture( newCanvas )\r\n\r\n if ( material.map ) material.map.dispose()\r\n material.map = texture\r\n\r\n } )\r\n\r\n return object\r\n\r\n } else {\r\n\r\n return console.warn( `In soonspacejs: 插件(plugin-heat-map)未找到 id 为 '\"${id}\"' 的热力图对象!` )\r\n\r\n }\r\n\r\n }\r\n\r\n getById ( id: PluginObject['sid'] ): PluginObject | null {\r\n\r\n return this.ssp.getObjectById( id )\r\n\r\n }\r\n\r\n getByName ( name: string ): PluginObject[] {\r\n\r\n return this.ssp.getObjectByName( name )\r\n\r\n }\r\n\r\n removeById ( id: PluginObject['sid'] ): boolean {\r\n\r\n if ( this.store.has( id ) ) {\r\n\r\n this.ssp.removeObjectById( id )\r\n\r\n this.store.delete( id )\r\n\r\n return true\r\n\r\n }\r\n\r\n return false\r\n\r\n }\r\n\r\n private createInitData ( param?: RendererConfig ): { hmInstance: HeatMap; canvas: HTMLCanvasElement } {\r\n\r\n const hmInstance = this.hmInstance = new HeatMap( param || {} )\r\n\r\n return { hmInstance, canvas: hmInstance.renderer.canvas, }\r\n\r\n }\r\n\r\n private _formatCanvasSize ( width: number, height: number ): CanvasSize {\r\n \r\n const ratio = width / height\r\n \r\n if ( width > this.maxCanvasSize ) {\r\n\r\n width = this.maxCanvasSize\r\n height = width / ratio\r\n \r\n }\r\n\r\n if ( height > this.maxCanvasSize ) {\r\n\r\n height = this.maxCanvasSize\r\n width = ratio * height\r\n \r\n }\r\n\r\n\r\n return { width, height, }\r\n\r\n }\r\n\r\n\r\n private _formatData ( data: SceneDataPoint[], minPosition: PlaneIVector2, scenePlaneSize: CanvasSize, canvasSize: CanvasSize ) {\r\n\r\n return data.map( item => ( {\r\n ...item,\r\n // 取整,否则不生效\r\n x: Math.trunc( ( item.x - minPosition.x ) / scenePlaneSize.width * canvasSize.width ),\r\n y: Math.trunc( ( item.z - minPosition.z ) / scenePlaneSize.height * canvasSize.height ),\r\n } ) )\r\n\r\n }\r\n\r\n private _formatData_Polygon ( data: ScenePolygonDataPoint[], projectionMatrix: Matrix4, polygonBox: Box2, canvasSize: CanvasSize, oriPosition?: Vector3, currPosition?: Vector3 ) {\r\n\r\n const offset = oriPosition && currPosition ? currPosition.clone().sub( oriPosition ) : new Vector3( 0, 0, 0 )\r\n\r\n return data.map( item => {\r\n\r\n const point = new Vector3( item.x, item.y, item.z )\r\n\r\n point.sub( offset )\r\n\r\n point.applyMatrix4( projectionMatrix )\r\n const { x, y, } = polygonBox.getParameter( new Vector2( point.x, point.y ), new Vector2() )\r\n\r\n return {\r\n ...item,\r\n // 取整,否则不生效\r\n x: Math.trunc( x * canvasSize.width ),\r\n // 热力图图片的 y 轴的正方向是 从 图片上方 到 图片 下方\r\n y: Math.trunc( ( 1 - y ) * canvasSize.height ),\r\n }\r\n\r\n } )\r\n\r\n }\r\n\r\n}\r\n"],"names":["HeatMap"],"mappings":"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","x_google_ignoreList":[0]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soonspacejs/plugin-heat-map",
|
|
3
3
|
"pluginName": "HeatMapPlugin",
|
|
4
|
-
"version": "2.13.
|
|
4
|
+
"version": "2.13.7",
|
|
5
5
|
"description": "Haet-map plugin for SoonSpace.js",
|
|
6
6
|
"main": "dist/index.esm.js",
|
|
7
7
|
"module": "dist/index.esm.js",
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"heatmap-ts": "^0.0.4"
|
|
18
18
|
},
|
|
19
|
-
"gitHead": "
|
|
19
|
+
"gitHead": "550040550bf20ec0015982ff1159d0cfe9b35ed3",
|
|
20
20
|
"peerDependencies": {
|
|
21
|
-
"soonspacejs": "2.13.
|
|
21
|
+
"soonspacejs": "2.13.7"
|
|
22
22
|
}
|
|
23
23
|
}
|
package/dist/CreateDrawing.d.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import SoonSpace from 'soonspacejs';
|
|
3
|
-
import type { PluginObject } from 'soonspacejs';
|
|
4
|
-
import HeatMapPlugin, { DrawingParam, ScenePolygonDataPoint, StoreValue, StoreValuePolygon } from '.';
|
|
5
|
-
declare class CreateDrawing {
|
|
6
|
-
readonly heatMapPlugin: HeatMapPlugin;
|
|
7
|
-
readonly store: Map<string | number, StoreValue | StoreValuePolygon>;
|
|
8
|
-
ssp: SoonSpace;
|
|
9
|
-
intervalId: NodeJS.Timeout | null;
|
|
10
|
-
currentMouseEvent: MouseEvent | null;
|
|
11
|
-
lastTime: Date | undefined;
|
|
12
|
-
events: {
|
|
13
|
-
[key in string]: ((event: KeyboardEvent) => void) | ((event: PointerEvent) => void);
|
|
14
|
-
};
|
|
15
|
-
isDragging: boolean;
|
|
16
|
-
isStarting: boolean;
|
|
17
|
-
createDrawingParam: DrawingParam;
|
|
18
|
-
dataPoints: DrawingParam['data'];
|
|
19
|
-
object: PluginObject;
|
|
20
|
-
startResolve: ((value: ScenePolygonDataPoint[] | PromiseLike<ScenePolygonDataPoint[]>) => void) | undefined;
|
|
21
|
-
startReject: ((value: ScenePolygonDataPoint[] | PromiseLike<ScenePolygonDataPoint[]>) => void) | undefined;
|
|
22
|
-
constructor(heatMapPlugin: HeatMapPlugin, param: DrawingParam);
|
|
23
|
-
start: () => Promise<ScenePolygonDataPoint[]>;
|
|
24
|
-
cancel: () => void;
|
|
25
|
-
dispose: () => void;
|
|
26
|
-
done: () => void;
|
|
27
|
-
remove: () => void;
|
|
28
|
-
private pushPoint;
|
|
29
|
-
private popPoint;
|
|
30
|
-
private handleAddPoint;
|
|
31
|
-
private setMouseEvent;
|
|
32
|
-
private handleEventListeners;
|
|
33
|
-
private keyEvents;
|
|
34
|
-
private getPoint;
|
|
35
|
-
private onPointerdown;
|
|
36
|
-
private onPointerMove;
|
|
37
|
-
private onPointerUp;
|
|
38
|
-
}
|
|
39
|
-
export default CreateDrawing;
|
package/dist/index.d.ts
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { Box2, Matrix4, Vector3 } from 'three';
|
|
2
|
-
import SoonSpace, { IVector3, PlaneIVector2, SignalsState } from 'soonspacejs';
|
|
3
|
-
import type { PluginObject } from 'soonspacejs';
|
|
4
|
-
import HeatMap, { DataPoint } from 'heatmap-ts';
|
|
5
|
-
import CreateDrawing from './CreateDrawing';
|
|
6
|
-
export interface SceneDataPoint extends Omit<DataPoint, 'y'> {
|
|
7
|
-
z: number;
|
|
8
|
-
}
|
|
9
|
-
export interface ScenePolygonDataPoint extends DataPoint {
|
|
10
|
-
z: number;
|
|
11
|
-
}
|
|
12
|
-
export interface CanvasSize {
|
|
13
|
-
width: number;
|
|
14
|
-
height: number;
|
|
15
|
-
}
|
|
16
|
-
export interface CreateParam {
|
|
17
|
-
id: string;
|
|
18
|
-
name?: PluginObject['name'];
|
|
19
|
-
data: SceneDataPoint[];
|
|
20
|
-
yAxisHeight: number;
|
|
21
|
-
minPosition: PlaneIVector2;
|
|
22
|
-
maxPosition: PlaneIVector2;
|
|
23
|
-
min?: number;
|
|
24
|
-
max?: number;
|
|
25
|
-
radius?: number;
|
|
26
|
-
canvasScalar?: number;
|
|
27
|
-
}
|
|
28
|
-
export interface CreatePolygonParam {
|
|
29
|
-
id: string;
|
|
30
|
-
name?: PluginObject['name'];
|
|
31
|
-
data?: ScenePolygonDataPoint[];
|
|
32
|
-
points: IVector3[];
|
|
33
|
-
min?: number;
|
|
34
|
-
max?: number;
|
|
35
|
-
radius?: number;
|
|
36
|
-
}
|
|
37
|
-
export interface StartParam {
|
|
38
|
-
id: string;
|
|
39
|
-
name?: PluginObject['name'];
|
|
40
|
-
data: ScenePolygonDataPoint[];
|
|
41
|
-
points: IVector3[];
|
|
42
|
-
min?: number;
|
|
43
|
-
max?: number;
|
|
44
|
-
radius?: number;
|
|
45
|
-
value?: number | number[];
|
|
46
|
-
}
|
|
47
|
-
type DrawingModeKeyType = {
|
|
48
|
-
[keyType in 'keyDown' | 'keyUp']?: string[];
|
|
49
|
-
};
|
|
50
|
-
export type DrawingModeType = (keyof SignalsState | DrawingModeKeyType | 'time')[];
|
|
51
|
-
export interface DrawingParam {
|
|
52
|
-
id: string;
|
|
53
|
-
name?: PluginObject['name'];
|
|
54
|
-
data: ScenePolygonDataPoint[];
|
|
55
|
-
points: IVector3[];
|
|
56
|
-
min?: number;
|
|
57
|
-
max?: number;
|
|
58
|
-
radius?: number;
|
|
59
|
-
value?: number | number[];
|
|
60
|
-
timeInterval?: number;
|
|
61
|
-
distanceInterval?: number;
|
|
62
|
-
addTriggerType?: DrawingModeType;
|
|
63
|
-
doneTriggerType?: DrawingModeType;
|
|
64
|
-
undoTriggerType?: DrawingModeType;
|
|
65
|
-
onAdd?: (point: ScenePolygonDataPoint, data: ScenePolygonDataPoint[]) => void;
|
|
66
|
-
onUndo?: (point: ScenePolygonDataPoint, data: ScenePolygonDataPoint[]) => void;
|
|
67
|
-
beforePointUpdate?: (type: StartEventType, point: ScenePolygonDataPoint, data: ScenePolygonDataPoint[]) => boolean | ScenePolygonDataPoint;
|
|
68
|
-
}
|
|
69
|
-
export declare const enum StartEventType {
|
|
70
|
-
'add' = "add",
|
|
71
|
-
'undo' = "undo"
|
|
72
|
-
}
|
|
73
|
-
export interface StoreValue {
|
|
74
|
-
object: PluginObject;
|
|
75
|
-
canvas: HTMLCanvasElement;
|
|
76
|
-
param: CreateParam;
|
|
77
|
-
width: number;
|
|
78
|
-
height: number;
|
|
79
|
-
projectionMatrix?: Matrix4;
|
|
80
|
-
polygonBox?: Box2;
|
|
81
|
-
}
|
|
82
|
-
export interface StoreValuePolygon {
|
|
83
|
-
object: PluginObject;
|
|
84
|
-
canvas: HTMLCanvasElement;
|
|
85
|
-
param: CreatePolygonParam;
|
|
86
|
-
projectionMatrix: Matrix4;
|
|
87
|
-
polygonBox: Box2;
|
|
88
|
-
position: Vector3;
|
|
89
|
-
}
|
|
90
|
-
export default class HeatMapPlugin {
|
|
91
|
-
readonly ssp: SoonSpace;
|
|
92
|
-
hmInstance: HeatMap | null;
|
|
93
|
-
readonly store: Map<string | number, StoreValue | StoreValuePolygon>;
|
|
94
|
-
constructor(ssp: SoonSpace);
|
|
95
|
-
maxCanvasSize: number;
|
|
96
|
-
create(param: CreateParam): PluginObject;
|
|
97
|
-
createPolygon(param: CreatePolygonParam): PluginObject;
|
|
98
|
-
createDrawing(param: DrawingParam): CreateDrawing;
|
|
99
|
-
setData(id: CreateParam['id'], data: CreateParam['data']): PluginObject | void;
|
|
100
|
-
setDataPolygon(id: CreateParam['id'], data: Exclude<CreatePolygonParam['data'], undefined>): PluginObject | void;
|
|
101
|
-
getById(id: PluginObject['sid']): PluginObject | null;
|
|
102
|
-
getByName(name: string): PluginObject[];
|
|
103
|
-
removeById(id: PluginObject['sid']): boolean;
|
|
104
|
-
private createInitData;
|
|
105
|
-
private _formatCanvasSize;
|
|
106
|
-
private _formatData;
|
|
107
|
-
private _formatData_Polygon;
|
|
108
|
-
}
|
|
109
|
-
export {};
|
package/dist/tools.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import SoonSpace from 'soonspacejs';
|
|
2
|
-
import { Matrix3, Vector3, Box2, Matrix4, ShapeGeometry } from 'three';
|
|
3
|
-
import { DrawingParam, ScenePolygonDataPoint, StartEventType, StoreValuePolygon } from '.';
|
|
4
|
-
export declare function getPolygonGeometryInfo(points: Vector3[]): {
|
|
5
|
-
geometry: ShapeGeometry;
|
|
6
|
-
polygonBox: Box2;
|
|
7
|
-
modelMatrix: Matrix4;
|
|
8
|
-
planeMatrix: Matrix4;
|
|
9
|
-
projectionMatrix: Matrix4;
|
|
10
|
-
position: Vector3;
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* 创建平面投影矩阵
|
|
14
|
-
* @param points
|
|
15
|
-
*/
|
|
16
|
-
export declare function createPlaneMatrix(points: Vector3[]): Matrix3;
|
|
17
|
-
/**
|
|
18
|
-
* 创建 uv 变换矩阵
|
|
19
|
-
* @remarks
|
|
20
|
-
* 需要对热力图数据进行y值翻转
|
|
21
|
-
* @param points
|
|
22
|
-
* @returns
|
|
23
|
-
*/
|
|
24
|
-
export declare function createUVMatrix(box: Box2): Matrix3;
|
|
25
|
-
/**
|
|
26
|
-
* 不需要对热力图数据进行y值翻转
|
|
27
|
-
*/
|
|
28
|
-
/**
|
|
29
|
-
* 生成区间内随机数
|
|
30
|
-
* @param min
|
|
31
|
-
* @param max
|
|
32
|
-
* @returns
|
|
33
|
-
*/
|
|
34
|
-
export declare function generateRandomNumber(min: number, max: number): number;
|
|
35
|
-
export declare function getHeatPoint(event: MouseEvent, type: StartEventType, param: DrawingParam, dataPoints: DrawingParam['data'], store: StoreValuePolygon, ssp: SoonSpace): ScenePolygonDataPoint | null;
|