microboard-temp 0.12.3 → 0.12.5

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.
@@ -54310,7 +54310,7 @@ class GravityEngine {
54310
54310
  G = 80;
54311
54311
  G_CENTER = 120;
54312
54312
  DAMPING = 0.92;
54313
- REPULSION = 60000;
54313
+ REPULSION = 800;
54314
54314
  TICK_MS = 33;
54315
54315
  SYNC_MS = 300;
54316
54316
  MAX_DISTANCE = 3000;
@@ -54345,52 +54345,68 @@ class GravityEngine {
54345
54345
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54346
54346
  if (items.length < 1)
54347
54347
  return;
54348
- let sumX = 0;
54349
- let sumY = 0;
54350
- for (const item of items) {
54348
+ const snap = items.map((item, idx) => {
54349
+ const pos = item.transformation.getTranslation();
54351
54350
  const mbr = item.getMbr();
54352
- sumX += mbr.left + mbr.getWidth() * 0.5;
54353
- sumY += mbr.top + mbr.getHeight() * 0.5;
54351
+ const w = Math.max(mbr.getWidth(), 1);
54352
+ const h2 = Math.max(mbr.getHeight(), 1);
54353
+ return {
54354
+ idx,
54355
+ id: item.getId(),
54356
+ left: pos.x,
54357
+ top: pos.y,
54358
+ right: pos.x + w,
54359
+ bottom: pos.y + h2,
54360
+ cx: pos.x + w * 0.5,
54361
+ cy: pos.y + h2 * 0.5,
54362
+ w,
54363
+ h: h2,
54364
+ mass: w * h2
54365
+ };
54366
+ });
54367
+ let sumX = 0, sumY = 0;
54368
+ for (const s2 of snap) {
54369
+ sumX += s2.cx;
54370
+ sumY += s2.cy;
54354
54371
  }
54355
- const centerX = sumX / items.length;
54356
- const centerY = sumY / items.length;
54357
- for (const item of items) {
54358
- const id = item.getId();
54359
- if (!this.velocities.has(id)) {
54360
- this.velocities.set(id, { vx: 0, vy: 0 });
54372
+ const centerX = sumX / snap.length;
54373
+ const centerY = sumY / snap.length;
54374
+ for (let i = 0;i < snap.length; i++) {
54375
+ const s1 = snap[i];
54376
+ if (!this.velocities.has(s1.id)) {
54377
+ this.velocities.set(s1.id, { vx: 0, vy: 0 });
54361
54378
  }
54362
- const vel = this.velocities.get(id);
54363
- const mbr1 = item.getMbr();
54364
- const w1 = mbr1.getWidth();
54365
- const h1 = mbr1.getHeight();
54379
+ const vel = this.velocities.get(s1.id);
54366
54380
  let ax = 0;
54367
54381
  let ay = 0;
54368
- const cx1 = mbr1.left + w1 * 0.5;
54369
- const cy1 = mbr1.top + h1 * 0.5;
54370
- const dcx = centerX - cx1;
54371
- const dcy = centerY - cy1;
54382
+ const dcx = centerX - s1.cx;
54383
+ const dcy = centerY - s1.cy;
54372
54384
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54373
54385
  ax += this.G_CENTER * dcx / distCenter;
54374
54386
  ay += this.G_CENTER * dcy / distCenter;
54375
- const nearby = this.board.items.getEnclosedOrCrossed(cx1 - this.MAX_DISTANCE, cy1 - this.MAX_DISTANCE, cx1 + this.MAX_DISTANCE * 2, cy1 + this.MAX_DISTANCE * 2).filter((other) => other.getId() !== id && !EXCLUDED_ITEM_TYPES.has(other.itemType));
54376
- for (const other of nearby) {
54377
- const mbr2 = other.getMbr();
54378
- const w2 = mbr2.getWidth();
54379
- const h2 = mbr2.getHeight();
54380
- const mass2 = w2 * h2;
54381
- const cx2 = mbr2.left + w2 * 0.5;
54382
- const cy2 = mbr2.top + h2 * 0.5;
54383
- const dx = cx2 - cx1;
54384
- const dy = cy2 - cy1;
54385
- const distSq = dx * dx + dy * dy;
54386
- const dist = Math.sqrt(distSq) + 0.001;
54387
- const minDist = (w1 + w2) * 0.5 + (h1 + h2) * 0.5;
54388
- if (dist < minDist) {
54389
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54390
- ax -= repAcc * dx / dist;
54391
- ay -= repAcc * dy / dist;
54387
+ for (let j = 0;j < snap.length; j++) {
54388
+ if (i === j)
54389
+ continue;
54390
+ const s2 = snap[j];
54391
+ const dx = s2.cx - s1.cx;
54392
+ const dy = s2.cy - s1.cy;
54393
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54394
+ if (dist > this.MAX_DISTANCE)
54395
+ continue;
54396
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54397
+ if (overlapping) {
54398
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54399
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54400
+ if (overlapX < overlapY) {
54401
+ const sign = s1.cx < s2.cx ? -1 : 1;
54402
+ ax += sign * this.REPULSION * overlapX;
54403
+ } else {
54404
+ const sign = s1.cy < s2.cy ? -1 : 1;
54405
+ ay += sign * this.REPULSION * overlapY;
54406
+ }
54392
54407
  } else {
54393
- const gravAcc = this.G * mass2 / (distSq + this.SOFTENING_SQ);
54408
+ const distSq = dx * dx + dy * dy;
54409
+ const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54394
54410
  ax += gravAcc * dx / dist;
54395
54411
  ay += gravAcc * dy / dist;
54396
54412
  }
@@ -54400,7 +54416,7 @@ class GravityEngine {
54400
54416
  const moveX = vel.vx * dt;
54401
54417
  const moveY = vel.vy * dt;
54402
54418
  if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
54403
- item.transformation.applyMatrixSilent({
54419
+ items[i].transformation.applyMatrixSilent({
54404
54420
  translateX: moveX,
54405
54421
  translateY: moveY,
54406
54422
  scaleX: 1,
@@ -54431,14 +54447,7 @@ class GravityEngine {
54431
54447
  method: "applyMatrix",
54432
54448
  items: movedItems.map(({ id, dx, dy }) => ({
54433
54449
  id,
54434
- matrix: {
54435
- translateX: dx,
54436
- translateY: dy,
54437
- scaleX: 1,
54438
- scaleY: 1,
54439
- shearX: 0,
54440
- shearY: 0
54441
- }
54450
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54442
54451
  }))
54443
54452
  };
54444
54453
  this.board.events.emit(operation);
package/dist/cjs/index.js CHANGED
@@ -54310,7 +54310,7 @@ class GravityEngine {
54310
54310
  G = 80;
54311
54311
  G_CENTER = 120;
54312
54312
  DAMPING = 0.92;
54313
- REPULSION = 60000;
54313
+ REPULSION = 800;
54314
54314
  TICK_MS = 33;
54315
54315
  SYNC_MS = 300;
54316
54316
  MAX_DISTANCE = 3000;
@@ -54345,52 +54345,68 @@ class GravityEngine {
54345
54345
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54346
54346
  if (items.length < 1)
54347
54347
  return;
54348
- let sumX = 0;
54349
- let sumY = 0;
54350
- for (const item of items) {
54348
+ const snap = items.map((item, idx) => {
54349
+ const pos = item.transformation.getTranslation();
54351
54350
  const mbr = item.getMbr();
54352
- sumX += mbr.left + mbr.getWidth() * 0.5;
54353
- sumY += mbr.top + mbr.getHeight() * 0.5;
54351
+ const w = Math.max(mbr.getWidth(), 1);
54352
+ const h2 = Math.max(mbr.getHeight(), 1);
54353
+ return {
54354
+ idx,
54355
+ id: item.getId(),
54356
+ left: pos.x,
54357
+ top: pos.y,
54358
+ right: pos.x + w,
54359
+ bottom: pos.y + h2,
54360
+ cx: pos.x + w * 0.5,
54361
+ cy: pos.y + h2 * 0.5,
54362
+ w,
54363
+ h: h2,
54364
+ mass: w * h2
54365
+ };
54366
+ });
54367
+ let sumX = 0, sumY = 0;
54368
+ for (const s2 of snap) {
54369
+ sumX += s2.cx;
54370
+ sumY += s2.cy;
54354
54371
  }
54355
- const centerX = sumX / items.length;
54356
- const centerY = sumY / items.length;
54357
- for (const item of items) {
54358
- const id = item.getId();
54359
- if (!this.velocities.has(id)) {
54360
- this.velocities.set(id, { vx: 0, vy: 0 });
54372
+ const centerX = sumX / snap.length;
54373
+ const centerY = sumY / snap.length;
54374
+ for (let i = 0;i < snap.length; i++) {
54375
+ const s1 = snap[i];
54376
+ if (!this.velocities.has(s1.id)) {
54377
+ this.velocities.set(s1.id, { vx: 0, vy: 0 });
54361
54378
  }
54362
- const vel = this.velocities.get(id);
54363
- const mbr1 = item.getMbr();
54364
- const w1 = mbr1.getWidth();
54365
- const h1 = mbr1.getHeight();
54379
+ const vel = this.velocities.get(s1.id);
54366
54380
  let ax = 0;
54367
54381
  let ay = 0;
54368
- const cx1 = mbr1.left + w1 * 0.5;
54369
- const cy1 = mbr1.top + h1 * 0.5;
54370
- const dcx = centerX - cx1;
54371
- const dcy = centerY - cy1;
54382
+ const dcx = centerX - s1.cx;
54383
+ const dcy = centerY - s1.cy;
54372
54384
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54373
54385
  ax += this.G_CENTER * dcx / distCenter;
54374
54386
  ay += this.G_CENTER * dcy / distCenter;
54375
- const nearby = this.board.items.getEnclosedOrCrossed(cx1 - this.MAX_DISTANCE, cy1 - this.MAX_DISTANCE, cx1 + this.MAX_DISTANCE * 2, cy1 + this.MAX_DISTANCE * 2).filter((other) => other.getId() !== id && !EXCLUDED_ITEM_TYPES.has(other.itemType));
54376
- for (const other of nearby) {
54377
- const mbr2 = other.getMbr();
54378
- const w2 = mbr2.getWidth();
54379
- const h2 = mbr2.getHeight();
54380
- const mass2 = w2 * h2;
54381
- const cx2 = mbr2.left + w2 * 0.5;
54382
- const cy2 = mbr2.top + h2 * 0.5;
54383
- const dx = cx2 - cx1;
54384
- const dy = cy2 - cy1;
54385
- const distSq = dx * dx + dy * dy;
54386
- const dist = Math.sqrt(distSq) + 0.001;
54387
- const minDist = (w1 + w2) * 0.5 + (h1 + h2) * 0.5;
54388
- if (dist < minDist) {
54389
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54390
- ax -= repAcc * dx / dist;
54391
- ay -= repAcc * dy / dist;
54387
+ for (let j = 0;j < snap.length; j++) {
54388
+ if (i === j)
54389
+ continue;
54390
+ const s2 = snap[j];
54391
+ const dx = s2.cx - s1.cx;
54392
+ const dy = s2.cy - s1.cy;
54393
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54394
+ if (dist > this.MAX_DISTANCE)
54395
+ continue;
54396
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54397
+ if (overlapping) {
54398
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54399
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54400
+ if (overlapX < overlapY) {
54401
+ const sign = s1.cx < s2.cx ? -1 : 1;
54402
+ ax += sign * this.REPULSION * overlapX;
54403
+ } else {
54404
+ const sign = s1.cy < s2.cy ? -1 : 1;
54405
+ ay += sign * this.REPULSION * overlapY;
54406
+ }
54392
54407
  } else {
54393
- const gravAcc = this.G * mass2 / (distSq + this.SOFTENING_SQ);
54408
+ const distSq = dx * dx + dy * dy;
54409
+ const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54394
54410
  ax += gravAcc * dx / dist;
54395
54411
  ay += gravAcc * dy / dist;
54396
54412
  }
@@ -54400,7 +54416,7 @@ class GravityEngine {
54400
54416
  const moveX = vel.vx * dt;
54401
54417
  const moveY = vel.vy * dt;
54402
54418
  if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
54403
- item.transformation.applyMatrixSilent({
54419
+ items[i].transformation.applyMatrixSilent({
54404
54420
  translateX: moveX,
54405
54421
  translateY: moveY,
54406
54422
  scaleX: 1,
@@ -54431,14 +54447,7 @@ class GravityEngine {
54431
54447
  method: "applyMatrix",
54432
54448
  items: movedItems.map(({ id, dx, dy }) => ({
54433
54449
  id,
54434
- matrix: {
54435
- translateX: dx,
54436
- translateY: dy,
54437
- scaleX: 1,
54438
- scaleY: 1,
54439
- shearX: 0,
54440
- shearY: 0
54441
- }
54450
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54442
54451
  }))
54443
54452
  };
54444
54453
  this.board.events.emit(operation);
package/dist/cjs/node.js CHANGED
@@ -56783,7 +56783,7 @@ class GravityEngine {
56783
56783
  G = 80;
56784
56784
  G_CENTER = 120;
56785
56785
  DAMPING = 0.92;
56786
- REPULSION = 60000;
56786
+ REPULSION = 800;
56787
56787
  TICK_MS = 33;
56788
56788
  SYNC_MS = 300;
56789
56789
  MAX_DISTANCE = 3000;
@@ -56818,52 +56818,68 @@ class GravityEngine {
56818
56818
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
56819
56819
  if (items.length < 1)
56820
56820
  return;
56821
- let sumX = 0;
56822
- let sumY = 0;
56823
- for (const item of items) {
56821
+ const snap = items.map((item, idx) => {
56822
+ const pos = item.transformation.getTranslation();
56824
56823
  const mbr = item.getMbr();
56825
- sumX += mbr.left + mbr.getWidth() * 0.5;
56826
- sumY += mbr.top + mbr.getHeight() * 0.5;
56824
+ const w = Math.max(mbr.getWidth(), 1);
56825
+ const h2 = Math.max(mbr.getHeight(), 1);
56826
+ return {
56827
+ idx,
56828
+ id: item.getId(),
56829
+ left: pos.x,
56830
+ top: pos.y,
56831
+ right: pos.x + w,
56832
+ bottom: pos.y + h2,
56833
+ cx: pos.x + w * 0.5,
56834
+ cy: pos.y + h2 * 0.5,
56835
+ w,
56836
+ h: h2,
56837
+ mass: w * h2
56838
+ };
56839
+ });
56840
+ let sumX = 0, sumY = 0;
56841
+ for (const s2 of snap) {
56842
+ sumX += s2.cx;
56843
+ sumY += s2.cy;
56827
56844
  }
56828
- const centerX = sumX / items.length;
56829
- const centerY = sumY / items.length;
56830
- for (const item of items) {
56831
- const id = item.getId();
56832
- if (!this.velocities.has(id)) {
56833
- this.velocities.set(id, { vx: 0, vy: 0 });
56845
+ const centerX = sumX / snap.length;
56846
+ const centerY = sumY / snap.length;
56847
+ for (let i = 0;i < snap.length; i++) {
56848
+ const s1 = snap[i];
56849
+ if (!this.velocities.has(s1.id)) {
56850
+ this.velocities.set(s1.id, { vx: 0, vy: 0 });
56834
56851
  }
56835
- const vel = this.velocities.get(id);
56836
- const mbr1 = item.getMbr();
56837
- const w1 = mbr1.getWidth();
56838
- const h1 = mbr1.getHeight();
56852
+ const vel = this.velocities.get(s1.id);
56839
56853
  let ax = 0;
56840
56854
  let ay = 0;
56841
- const cx1 = mbr1.left + w1 * 0.5;
56842
- const cy1 = mbr1.top + h1 * 0.5;
56843
- const dcx = centerX - cx1;
56844
- const dcy = centerY - cy1;
56855
+ const dcx = centerX - s1.cx;
56856
+ const dcy = centerY - s1.cy;
56845
56857
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
56846
56858
  ax += this.G_CENTER * dcx / distCenter;
56847
56859
  ay += this.G_CENTER * dcy / distCenter;
56848
- const nearby = this.board.items.getEnclosedOrCrossed(cx1 - this.MAX_DISTANCE, cy1 - this.MAX_DISTANCE, cx1 + this.MAX_DISTANCE * 2, cy1 + this.MAX_DISTANCE * 2).filter((other) => other.getId() !== id && !EXCLUDED_ITEM_TYPES.has(other.itemType));
56849
- for (const other of nearby) {
56850
- const mbr2 = other.getMbr();
56851
- const w2 = mbr2.getWidth();
56852
- const h2 = mbr2.getHeight();
56853
- const mass2 = w2 * h2;
56854
- const cx2 = mbr2.left + w2 * 0.5;
56855
- const cy2 = mbr2.top + h2 * 0.5;
56856
- const dx = cx2 - cx1;
56857
- const dy = cy2 - cy1;
56858
- const distSq = dx * dx + dy * dy;
56859
- const dist = Math.sqrt(distSq) + 0.001;
56860
- const minDist = (w1 + w2) * 0.5 + (h1 + h2) * 0.5;
56861
- if (dist < minDist) {
56862
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
56863
- ax -= repAcc * dx / dist;
56864
- ay -= repAcc * dy / dist;
56860
+ for (let j = 0;j < snap.length; j++) {
56861
+ if (i === j)
56862
+ continue;
56863
+ const s2 = snap[j];
56864
+ const dx = s2.cx - s1.cx;
56865
+ const dy = s2.cy - s1.cy;
56866
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
56867
+ if (dist > this.MAX_DISTANCE)
56868
+ continue;
56869
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
56870
+ if (overlapping) {
56871
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
56872
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
56873
+ if (overlapX < overlapY) {
56874
+ const sign = s1.cx < s2.cx ? -1 : 1;
56875
+ ax += sign * this.REPULSION * overlapX;
56876
+ } else {
56877
+ const sign = s1.cy < s2.cy ? -1 : 1;
56878
+ ay += sign * this.REPULSION * overlapY;
56879
+ }
56865
56880
  } else {
56866
- const gravAcc = this.G * mass2 / (distSq + this.SOFTENING_SQ);
56881
+ const distSq = dx * dx + dy * dy;
56882
+ const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
56867
56883
  ax += gravAcc * dx / dist;
56868
56884
  ay += gravAcc * dy / dist;
56869
56885
  }
@@ -56873,7 +56889,7 @@ class GravityEngine {
56873
56889
  const moveX = vel.vx * dt;
56874
56890
  const moveY = vel.vy * dt;
56875
56891
  if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
56876
- item.transformation.applyMatrixSilent({
56892
+ items[i].transformation.applyMatrixSilent({
56877
56893
  translateX: moveX,
56878
56894
  translateY: moveY,
56879
56895
  scaleX: 1,
@@ -56904,14 +56920,7 @@ class GravityEngine {
56904
56920
  method: "applyMatrix",
56905
56921
  items: movedItems.map(({ id, dx, dy }) => ({
56906
56922
  id,
56907
- matrix: {
56908
- translateX: dx,
56909
- translateY: dy,
56910
- scaleX: 1,
56911
- scaleY: 1,
56912
- shearX: 0,
56913
- shearY: 0
56914
- }
56923
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
56915
56924
  }))
56916
56925
  };
56917
56926
  this.board.events.emit(operation);
@@ -54139,7 +54139,7 @@ class GravityEngine {
54139
54139
  G = 80;
54140
54140
  G_CENTER = 120;
54141
54141
  DAMPING = 0.92;
54142
- REPULSION = 60000;
54142
+ REPULSION = 800;
54143
54143
  TICK_MS = 33;
54144
54144
  SYNC_MS = 300;
54145
54145
  MAX_DISTANCE = 3000;
@@ -54174,52 +54174,68 @@ class GravityEngine {
54174
54174
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54175
54175
  if (items.length < 1)
54176
54176
  return;
54177
- let sumX = 0;
54178
- let sumY = 0;
54179
- for (const item of items) {
54177
+ const snap = items.map((item, idx) => {
54178
+ const pos = item.transformation.getTranslation();
54180
54179
  const mbr = item.getMbr();
54181
- sumX += mbr.left + mbr.getWidth() * 0.5;
54182
- sumY += mbr.top + mbr.getHeight() * 0.5;
54180
+ const w = Math.max(mbr.getWidth(), 1);
54181
+ const h2 = Math.max(mbr.getHeight(), 1);
54182
+ return {
54183
+ idx,
54184
+ id: item.getId(),
54185
+ left: pos.x,
54186
+ top: pos.y,
54187
+ right: pos.x + w,
54188
+ bottom: pos.y + h2,
54189
+ cx: pos.x + w * 0.5,
54190
+ cy: pos.y + h2 * 0.5,
54191
+ w,
54192
+ h: h2,
54193
+ mass: w * h2
54194
+ };
54195
+ });
54196
+ let sumX = 0, sumY = 0;
54197
+ for (const s2 of snap) {
54198
+ sumX += s2.cx;
54199
+ sumY += s2.cy;
54183
54200
  }
54184
- const centerX = sumX / items.length;
54185
- const centerY = sumY / items.length;
54186
- for (const item of items) {
54187
- const id = item.getId();
54188
- if (!this.velocities.has(id)) {
54189
- this.velocities.set(id, { vx: 0, vy: 0 });
54201
+ const centerX = sumX / snap.length;
54202
+ const centerY = sumY / snap.length;
54203
+ for (let i = 0;i < snap.length; i++) {
54204
+ const s1 = snap[i];
54205
+ if (!this.velocities.has(s1.id)) {
54206
+ this.velocities.set(s1.id, { vx: 0, vy: 0 });
54190
54207
  }
54191
- const vel = this.velocities.get(id);
54192
- const mbr1 = item.getMbr();
54193
- const w1 = mbr1.getWidth();
54194
- const h1 = mbr1.getHeight();
54208
+ const vel = this.velocities.get(s1.id);
54195
54209
  let ax = 0;
54196
54210
  let ay = 0;
54197
- const cx1 = mbr1.left + w1 * 0.5;
54198
- const cy1 = mbr1.top + h1 * 0.5;
54199
- const dcx = centerX - cx1;
54200
- const dcy = centerY - cy1;
54211
+ const dcx = centerX - s1.cx;
54212
+ const dcy = centerY - s1.cy;
54201
54213
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54202
54214
  ax += this.G_CENTER * dcx / distCenter;
54203
54215
  ay += this.G_CENTER * dcy / distCenter;
54204
- const nearby = this.board.items.getEnclosedOrCrossed(cx1 - this.MAX_DISTANCE, cy1 - this.MAX_DISTANCE, cx1 + this.MAX_DISTANCE * 2, cy1 + this.MAX_DISTANCE * 2).filter((other) => other.getId() !== id && !EXCLUDED_ITEM_TYPES.has(other.itemType));
54205
- for (const other of nearby) {
54206
- const mbr2 = other.getMbr();
54207
- const w2 = mbr2.getWidth();
54208
- const h2 = mbr2.getHeight();
54209
- const mass2 = w2 * h2;
54210
- const cx2 = mbr2.left + w2 * 0.5;
54211
- const cy2 = mbr2.top + h2 * 0.5;
54212
- const dx = cx2 - cx1;
54213
- const dy = cy2 - cy1;
54214
- const distSq = dx * dx + dy * dy;
54215
- const dist = Math.sqrt(distSq) + 0.001;
54216
- const minDist = (w1 + w2) * 0.5 + (h1 + h2) * 0.5;
54217
- if (dist < minDist) {
54218
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54219
- ax -= repAcc * dx / dist;
54220
- ay -= repAcc * dy / dist;
54216
+ for (let j = 0;j < snap.length; j++) {
54217
+ if (i === j)
54218
+ continue;
54219
+ const s2 = snap[j];
54220
+ const dx = s2.cx - s1.cx;
54221
+ const dy = s2.cy - s1.cy;
54222
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54223
+ if (dist > this.MAX_DISTANCE)
54224
+ continue;
54225
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54226
+ if (overlapping) {
54227
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54228
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54229
+ if (overlapX < overlapY) {
54230
+ const sign = s1.cx < s2.cx ? -1 : 1;
54231
+ ax += sign * this.REPULSION * overlapX;
54232
+ } else {
54233
+ const sign = s1.cy < s2.cy ? -1 : 1;
54234
+ ay += sign * this.REPULSION * overlapY;
54235
+ }
54221
54236
  } else {
54222
- const gravAcc = this.G * mass2 / (distSq + this.SOFTENING_SQ);
54237
+ const distSq = dx * dx + dy * dy;
54238
+ const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54223
54239
  ax += gravAcc * dx / dist;
54224
54240
  ay += gravAcc * dy / dist;
54225
54241
  }
@@ -54229,7 +54245,7 @@ class GravityEngine {
54229
54245
  const moveX = vel.vx * dt;
54230
54246
  const moveY = vel.vy * dt;
54231
54247
  if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
54232
- item.transformation.applyMatrixSilent({
54248
+ items[i].transformation.applyMatrixSilent({
54233
54249
  translateX: moveX,
54234
54250
  translateY: moveY,
54235
54251
  scaleX: 1,
@@ -54260,14 +54276,7 @@ class GravityEngine {
54260
54276
  method: "applyMatrix",
54261
54277
  items: movedItems.map(({ id, dx, dy }) => ({
54262
54278
  id,
54263
- matrix: {
54264
- translateX: dx,
54265
- translateY: dy,
54266
- scaleX: 1,
54267
- scaleY: 1,
54268
- shearX: 0,
54269
- shearY: 0
54270
- }
54279
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54271
54280
  }))
54272
54281
  };
54273
54282
  this.board.events.emit(operation);
package/dist/esm/index.js CHANGED
@@ -54132,7 +54132,7 @@ class GravityEngine {
54132
54132
  G = 80;
54133
54133
  G_CENTER = 120;
54134
54134
  DAMPING = 0.92;
54135
- REPULSION = 60000;
54135
+ REPULSION = 800;
54136
54136
  TICK_MS = 33;
54137
54137
  SYNC_MS = 300;
54138
54138
  MAX_DISTANCE = 3000;
@@ -54167,52 +54167,68 @@ class GravityEngine {
54167
54167
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
54168
54168
  if (items.length < 1)
54169
54169
  return;
54170
- let sumX = 0;
54171
- let sumY = 0;
54172
- for (const item of items) {
54170
+ const snap = items.map((item, idx) => {
54171
+ const pos = item.transformation.getTranslation();
54173
54172
  const mbr = item.getMbr();
54174
- sumX += mbr.left + mbr.getWidth() * 0.5;
54175
- sumY += mbr.top + mbr.getHeight() * 0.5;
54173
+ const w = Math.max(mbr.getWidth(), 1);
54174
+ const h2 = Math.max(mbr.getHeight(), 1);
54175
+ return {
54176
+ idx,
54177
+ id: item.getId(),
54178
+ left: pos.x,
54179
+ top: pos.y,
54180
+ right: pos.x + w,
54181
+ bottom: pos.y + h2,
54182
+ cx: pos.x + w * 0.5,
54183
+ cy: pos.y + h2 * 0.5,
54184
+ w,
54185
+ h: h2,
54186
+ mass: w * h2
54187
+ };
54188
+ });
54189
+ let sumX = 0, sumY = 0;
54190
+ for (const s2 of snap) {
54191
+ sumX += s2.cx;
54192
+ sumY += s2.cy;
54176
54193
  }
54177
- const centerX = sumX / items.length;
54178
- const centerY = sumY / items.length;
54179
- for (const item of items) {
54180
- const id = item.getId();
54181
- if (!this.velocities.has(id)) {
54182
- this.velocities.set(id, { vx: 0, vy: 0 });
54194
+ const centerX = sumX / snap.length;
54195
+ const centerY = sumY / snap.length;
54196
+ for (let i = 0;i < snap.length; i++) {
54197
+ const s1 = snap[i];
54198
+ if (!this.velocities.has(s1.id)) {
54199
+ this.velocities.set(s1.id, { vx: 0, vy: 0 });
54183
54200
  }
54184
- const vel = this.velocities.get(id);
54185
- const mbr1 = item.getMbr();
54186
- const w1 = mbr1.getWidth();
54187
- const h1 = mbr1.getHeight();
54201
+ const vel = this.velocities.get(s1.id);
54188
54202
  let ax = 0;
54189
54203
  let ay = 0;
54190
- const cx1 = mbr1.left + w1 * 0.5;
54191
- const cy1 = mbr1.top + h1 * 0.5;
54192
- const dcx = centerX - cx1;
54193
- const dcy = centerY - cy1;
54204
+ const dcx = centerX - s1.cx;
54205
+ const dcy = centerY - s1.cy;
54194
54206
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
54195
54207
  ax += this.G_CENTER * dcx / distCenter;
54196
54208
  ay += this.G_CENTER * dcy / distCenter;
54197
- const nearby = this.board.items.getEnclosedOrCrossed(cx1 - this.MAX_DISTANCE, cy1 - this.MAX_DISTANCE, cx1 + this.MAX_DISTANCE * 2, cy1 + this.MAX_DISTANCE * 2).filter((other) => other.getId() !== id && !EXCLUDED_ITEM_TYPES.has(other.itemType));
54198
- for (const other of nearby) {
54199
- const mbr2 = other.getMbr();
54200
- const w2 = mbr2.getWidth();
54201
- const h2 = mbr2.getHeight();
54202
- const mass2 = w2 * h2;
54203
- const cx2 = mbr2.left + w2 * 0.5;
54204
- const cy2 = mbr2.top + h2 * 0.5;
54205
- const dx = cx2 - cx1;
54206
- const dy = cy2 - cy1;
54207
- const distSq = dx * dx + dy * dy;
54208
- const dist = Math.sqrt(distSq) + 0.001;
54209
- const minDist = (w1 + w2) * 0.5 + (h1 + h2) * 0.5;
54210
- if (dist < minDist) {
54211
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
54212
- ax -= repAcc * dx / dist;
54213
- ay -= repAcc * dy / dist;
54209
+ for (let j = 0;j < snap.length; j++) {
54210
+ if (i === j)
54211
+ continue;
54212
+ const s2 = snap[j];
54213
+ const dx = s2.cx - s1.cx;
54214
+ const dy = s2.cy - s1.cy;
54215
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
54216
+ if (dist > this.MAX_DISTANCE)
54217
+ continue;
54218
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
54219
+ if (overlapping) {
54220
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
54221
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
54222
+ if (overlapX < overlapY) {
54223
+ const sign = s1.cx < s2.cx ? -1 : 1;
54224
+ ax += sign * this.REPULSION * overlapX;
54225
+ } else {
54226
+ const sign = s1.cy < s2.cy ? -1 : 1;
54227
+ ay += sign * this.REPULSION * overlapY;
54228
+ }
54214
54229
  } else {
54215
- const gravAcc = this.G * mass2 / (distSq + this.SOFTENING_SQ);
54230
+ const distSq = dx * dx + dy * dy;
54231
+ const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
54216
54232
  ax += gravAcc * dx / dist;
54217
54233
  ay += gravAcc * dy / dist;
54218
54234
  }
@@ -54222,7 +54238,7 @@ class GravityEngine {
54222
54238
  const moveX = vel.vx * dt;
54223
54239
  const moveY = vel.vy * dt;
54224
54240
  if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
54225
- item.transformation.applyMatrixSilent({
54241
+ items[i].transformation.applyMatrixSilent({
54226
54242
  translateX: moveX,
54227
54243
  translateY: moveY,
54228
54244
  scaleX: 1,
@@ -54253,14 +54269,7 @@ class GravityEngine {
54253
54269
  method: "applyMatrix",
54254
54270
  items: movedItems.map(({ id, dx, dy }) => ({
54255
54271
  id,
54256
- matrix: {
54257
- translateX: dx,
54258
- translateY: dy,
54259
- scaleX: 1,
54260
- scaleY: 1,
54261
- shearX: 0,
54262
- shearY: 0
54263
- }
54272
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
54264
54273
  }))
54265
54274
  };
54266
54275
  this.board.events.emit(operation);
package/dist/esm/node.js CHANGED
@@ -56600,7 +56600,7 @@ class GravityEngine {
56600
56600
  G = 80;
56601
56601
  G_CENTER = 120;
56602
56602
  DAMPING = 0.92;
56603
- REPULSION = 60000;
56603
+ REPULSION = 800;
56604
56604
  TICK_MS = 33;
56605
56605
  SYNC_MS = 300;
56606
56606
  MAX_DISTANCE = 3000;
@@ -56635,52 +56635,68 @@ class GravityEngine {
56635
56635
  const items = this.board.items.listAll().filter((item) => !item.transformation.isLocked && !EXCLUDED_ITEM_TYPES.has(item.itemType));
56636
56636
  if (items.length < 1)
56637
56637
  return;
56638
- let sumX = 0;
56639
- let sumY = 0;
56640
- for (const item of items) {
56638
+ const snap = items.map((item, idx) => {
56639
+ const pos = item.transformation.getTranslation();
56641
56640
  const mbr = item.getMbr();
56642
- sumX += mbr.left + mbr.getWidth() * 0.5;
56643
- sumY += mbr.top + mbr.getHeight() * 0.5;
56641
+ const w = Math.max(mbr.getWidth(), 1);
56642
+ const h2 = Math.max(mbr.getHeight(), 1);
56643
+ return {
56644
+ idx,
56645
+ id: item.getId(),
56646
+ left: pos.x,
56647
+ top: pos.y,
56648
+ right: pos.x + w,
56649
+ bottom: pos.y + h2,
56650
+ cx: pos.x + w * 0.5,
56651
+ cy: pos.y + h2 * 0.5,
56652
+ w,
56653
+ h: h2,
56654
+ mass: w * h2
56655
+ };
56656
+ });
56657
+ let sumX = 0, sumY = 0;
56658
+ for (const s2 of snap) {
56659
+ sumX += s2.cx;
56660
+ sumY += s2.cy;
56644
56661
  }
56645
- const centerX = sumX / items.length;
56646
- const centerY = sumY / items.length;
56647
- for (const item of items) {
56648
- const id = item.getId();
56649
- if (!this.velocities.has(id)) {
56650
- this.velocities.set(id, { vx: 0, vy: 0 });
56662
+ const centerX = sumX / snap.length;
56663
+ const centerY = sumY / snap.length;
56664
+ for (let i = 0;i < snap.length; i++) {
56665
+ const s1 = snap[i];
56666
+ if (!this.velocities.has(s1.id)) {
56667
+ this.velocities.set(s1.id, { vx: 0, vy: 0 });
56651
56668
  }
56652
- const vel = this.velocities.get(id);
56653
- const mbr1 = item.getMbr();
56654
- const w1 = mbr1.getWidth();
56655
- const h1 = mbr1.getHeight();
56669
+ const vel = this.velocities.get(s1.id);
56656
56670
  let ax = 0;
56657
56671
  let ay = 0;
56658
- const cx1 = mbr1.left + w1 * 0.5;
56659
- const cy1 = mbr1.top + h1 * 0.5;
56660
- const dcx = centerX - cx1;
56661
- const dcy = centerY - cy1;
56672
+ const dcx = centerX - s1.cx;
56673
+ const dcy = centerY - s1.cy;
56662
56674
  const distCenter = Math.sqrt(dcx * dcx + dcy * dcy) + 1;
56663
56675
  ax += this.G_CENTER * dcx / distCenter;
56664
56676
  ay += this.G_CENTER * dcy / distCenter;
56665
- const nearby = this.board.items.getEnclosedOrCrossed(cx1 - this.MAX_DISTANCE, cy1 - this.MAX_DISTANCE, cx1 + this.MAX_DISTANCE * 2, cy1 + this.MAX_DISTANCE * 2).filter((other) => other.getId() !== id && !EXCLUDED_ITEM_TYPES.has(other.itemType));
56666
- for (const other of nearby) {
56667
- const mbr2 = other.getMbr();
56668
- const w2 = mbr2.getWidth();
56669
- const h2 = mbr2.getHeight();
56670
- const mass2 = w2 * h2;
56671
- const cx2 = mbr2.left + w2 * 0.5;
56672
- const cy2 = mbr2.top + h2 * 0.5;
56673
- const dx = cx2 - cx1;
56674
- const dy = cy2 - cy1;
56675
- const distSq = dx * dx + dy * dy;
56676
- const dist = Math.sqrt(distSq) + 0.001;
56677
- const minDist = (w1 + w2) * 0.5 + (h1 + h2) * 0.5;
56678
- if (dist < minDist) {
56679
- const repAcc = this.REPULSION / (distSq + this.SOFTENING_SQ);
56680
- ax -= repAcc * dx / dist;
56681
- ay -= repAcc * dy / dist;
56677
+ for (let j = 0;j < snap.length; j++) {
56678
+ if (i === j)
56679
+ continue;
56680
+ const s2 = snap[j];
56681
+ const dx = s2.cx - s1.cx;
56682
+ const dy = s2.cy - s1.cy;
56683
+ const dist = Math.sqrt(dx * dx + dy * dy) + 0.001;
56684
+ if (dist > this.MAX_DISTANCE)
56685
+ continue;
56686
+ const overlapping = s1.right > s2.left && s2.right > s1.left && s1.bottom > s2.top && s2.bottom > s1.top;
56687
+ if (overlapping) {
56688
+ const overlapX = Math.min(s1.right, s2.right) - Math.max(s1.left, s2.left);
56689
+ const overlapY = Math.min(s1.bottom, s2.bottom) - Math.max(s1.top, s2.top);
56690
+ if (overlapX < overlapY) {
56691
+ const sign = s1.cx < s2.cx ? -1 : 1;
56692
+ ax += sign * this.REPULSION * overlapX;
56693
+ } else {
56694
+ const sign = s1.cy < s2.cy ? -1 : 1;
56695
+ ay += sign * this.REPULSION * overlapY;
56696
+ }
56682
56697
  } else {
56683
- const gravAcc = this.G * mass2 / (distSq + this.SOFTENING_SQ);
56698
+ const distSq = dx * dx + dy * dy;
56699
+ const gravAcc = this.G * s2.mass / (distSq + this.SOFTENING_SQ);
56684
56700
  ax += gravAcc * dx / dist;
56685
56701
  ay += gravAcc * dy / dist;
56686
56702
  }
@@ -56690,7 +56706,7 @@ class GravityEngine {
56690
56706
  const moveX = vel.vx * dt;
56691
56707
  const moveY = vel.vy * dt;
56692
56708
  if (Math.abs(moveX) >= this.MIN_MOVE_PX || Math.abs(moveY) >= this.MIN_MOVE_PX) {
56693
- item.transformation.applyMatrixSilent({
56709
+ items[i].transformation.applyMatrixSilent({
56694
56710
  translateX: moveX,
56695
56711
  translateY: moveY,
56696
56712
  scaleX: 1,
@@ -56721,14 +56737,7 @@ class GravityEngine {
56721
56737
  method: "applyMatrix",
56722
56738
  items: movedItems.map(({ id, dx, dy }) => ({
56723
56739
  id,
56724
- matrix: {
56725
- translateX: dx,
56726
- translateY: dy,
56727
- scaleX: 1,
56728
- scaleY: 1,
56729
- shearX: 0,
56730
- shearY: 0
56731
- }
56740
+ matrix: { translateX: dx, translateY: dy, scaleX: 1, scaleY: 1, shearX: 0, shearY: 0 }
56732
56741
  }))
56733
56742
  };
56734
56743
  this.board.events.emit(operation);
@@ -8,7 +8,7 @@ export declare class GravityEngine {
8
8
  readonly G = 80;
9
9
  readonly G_CENTER = 120;
10
10
  readonly DAMPING = 0.92;
11
- readonly REPULSION = 60000;
11
+ readonly REPULSION = 800;
12
12
  readonly TICK_MS = 33;
13
13
  readonly SYNC_MS = 300;
14
14
  readonly MAX_DISTANCE = 3000;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microboard-temp",
3
- "version": "0.12.3",
3
+ "version": "0.12.5",
4
4
  "description": "A flexible interactive whiteboard library",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",