@soonspacejs/plugin-heat-map 2.13.7 → 2.13.9

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 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)
@@ -0,0 +1,39 @@
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;
@@ -0,0 +1,109 @@
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/index.esm.js CHANGED
@@ -1,601 +1 @@
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
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};
@@ -0,0 +1,35 @@
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;
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.7",
4
+ "version": "2.13.9",
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": "550040550bf20ec0015982ff1159d0cfe9b35ed3",
19
+ "gitHead": "a5596909f48bd136905b85f239e13690f9f2c66e",
20
20
  "peerDependencies": {
21
- "soonspacejs": "2.13.7"
21
+ "soonspacejs": "2.13.9"
22
22
  }
23
23
  }
@@ -1 +0,0 @@
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]}