@visactor/vutils 0.18.16 → 0.18.17

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.
Files changed (43) hide show
  1. package/cjs/common/ascending.js +2 -1
  2. package/cjs/common/getType.js +1 -2
  3. package/cjs/common/isArrayLike.js +2 -1
  4. package/cjs/common/isObject.js +1 -2
  5. package/cjs/common/isShallowEqual.js +2 -1
  6. package/cjs/common/isUndefined.js +1 -1
  7. package/cjs/common/isValid.js +1 -1
  8. package/cjs/common/isValidNumber.js +1 -1
  9. package/cjs/common/isValidUrl.js +1 -1
  10. package/cjs/common/lowerFirst.js +1 -1
  11. package/cjs/data-structure/bounds.d.ts +3 -0
  12. package/cjs/data-structure/bounds.js +13 -3
  13. package/cjs/data-structure/bounds.js.map +1 -1
  14. package/cjs/data-structure/hashTable.js +1 -2
  15. package/cjs/data-structure/index.js +1 -1
  16. package/cjs/data-structure/matrix.js +1 -1
  17. package/cjs/data-structure/point.js +1 -1
  18. package/cjs/graphics/algorithm/intersect.d.ts +8 -0
  19. package/cjs/graphics/algorithm/intersect.js +15 -15
  20. package/cjs/graphics/algorithm/intersect.js.map +1 -1
  21. package/dist/index.js +2125 -2110
  22. package/dist/index.min.js +1 -1
  23. package/es/common/ascending.js +2 -1
  24. package/es/common/getType.js +1 -2
  25. package/es/common/isArrayLike.js +2 -1
  26. package/es/common/isObject.js +1 -2
  27. package/es/common/isShallowEqual.js +2 -1
  28. package/es/common/isUndefined.js +1 -1
  29. package/es/common/isValid.js +1 -1
  30. package/es/common/isValidNumber.js +1 -1
  31. package/es/common/isValidUrl.js +1 -1
  32. package/es/common/lowerFirst.js +1 -1
  33. package/es/data-structure/bounds.d.ts +3 -0
  34. package/es/data-structure/bounds.js +14 -2
  35. package/es/data-structure/bounds.js.map +1 -1
  36. package/es/data-structure/hashTable.js +1 -2
  37. package/es/data-structure/index.js +1 -1
  38. package/es/data-structure/matrix.js +1 -1
  39. package/es/data-structure/point.js +1 -1
  40. package/es/graphics/algorithm/intersect.d.ts +8 -0
  41. package/es/graphics/algorithm/intersect.js +12 -12
  42. package/es/graphics/algorithm/intersect.js.map +1 -1
  43. package/package.json +4 -4
@@ -6,4 +6,5 @@ function ascending(a, b) {
6
6
 
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: !0
9
- }), exports.ascending = void 0, exports.ascending = ascending;
9
+ }), exports.ascending = void 0, exports.ascending = ascending;
10
+ //# sourceMappingURL=ascending.js.map
@@ -6,5 +6,4 @@ Object.defineProperty(exports, "__esModule", {
6
6
 
7
7
  const getType = value => ({}.toString.call(value).replace(/^\[object /, "").replace(/]$/, ""));
8
8
 
9
- exports.default = getType;
10
- //# sourceMappingURL=getType.js.map
9
+ exports.default = getType;
@@ -8,4 +8,5 @@ const isArrayLike = function(value) {
8
8
  return null !== value && "function" != typeof value && Number.isFinite(value.length);
9
9
  };
10
10
 
11
- exports.default = isArrayLike;
11
+ exports.default = isArrayLike;
12
+ //# sourceMappingURL=isArrayLike.js.map
@@ -9,5 +9,4 @@ const isObject = value => {
9
9
  return null !== value && "object" === type || "function" === type;
10
10
  };
11
11
 
12
- exports.default = isObject;
13
- //# sourceMappingURL=isObject.js.map
12
+ exports.default = isObject;
@@ -30,4 +30,5 @@ function isShallowEqual(objA, objB) {
30
30
  ret;
31
31
  }
32
32
 
33
- exports.isShallowEqual = isShallowEqual;
33
+ exports.isShallowEqual = isShallowEqual;
34
+ //# sourceMappingURL=isShallowEqual.js.map
@@ -7,4 +7,4 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const isUndefined = value => void 0 === value;
8
8
 
9
9
  exports.default = isUndefined;
10
- //# sourceMappingURL=isUndefined.js.map
10
+ //# sourceMappingURL=isUndefined.js.map
@@ -7,4 +7,4 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const isValid = value => null != value;
8
8
 
9
9
  exports.default = isValid;
10
- //# sourceMappingURL=isValid.js.map
10
+ //# sourceMappingURL=isValid.js.map
@@ -14,4 +14,4 @@ const isNumber_1 = __importDefault(require("./isNumber")), isValidNumber = value
14
14
  isNumber_1.default)(value) && Number.isFinite(value);
15
15
 
16
16
  exports.default = isValidNumber;
17
- //# sourceMappingURL=isValidNumber.js.map
17
+ //# sourceMappingURL=isValidNumber.js.map
@@ -7,4 +7,4 @@ Object.defineProperty(exports, "__esModule", {
7
7
  const isValidUrl = value => new RegExp(/^(http(s)?:\/\/)\w+[^\s]+(\.[^\s]+){1,}$/).test(value);
8
8
 
9
9
  exports.isValidUrl = isValidUrl, exports.default = exports.isValidUrl;
10
- //# sourceMappingURL=isValidUrl.js.map
10
+ //# sourceMappingURL=isValidUrl.js.map
@@ -9,4 +9,4 @@ const lowerFirst = function(str) {
9
9
  };
10
10
 
11
11
  exports.default = lowerFirst;
12
- //# sourceMappingURL=lowerFirst.js.map
12
+ //# sourceMappingURL=lowerFirst.js.map
@@ -78,4 +78,7 @@ export declare class AABBBounds extends Bounds {
78
78
  }
79
79
  export declare class OBBBounds extends Bounds {
80
80
  angle: number;
81
+ constructor(bounds?: Bounds, angle?: number);
82
+ intersects(b: OBBBounds): boolean;
83
+ setValue(x1?: number, y1?: number, x2?: number, y2?: number, angle?: number): Bounds;
81
84
  }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  }), exports.OBBBounds = exports.AABBBounds = exports.Bounds = exports.transformBounds = exports.transformBoundsWithMatrix = void 0;
6
6
 
7
- const common_1 = require("../common"), math_1 = require("../math");
7
+ const common_1 = require("../common"), graphics_1 = require("../graphics"), math_1 = require("../math");
8
8
 
9
9
  function transformBoundsWithMatrix(out, bounds, matrix) {
10
10
  const {x1: x1, y1: y1, x2: x2, y2: y2} = bounds;
@@ -133,7 +133,17 @@ class AABBBounds extends Bounds {}
133
133
 
134
134
  exports.AABBBounds = AABBBounds;
135
135
 
136
- class OBBBounds extends Bounds {}
136
+ class OBBBounds extends Bounds {
137
+ constructor(bounds, angle = 0) {
138
+ super(bounds), bounds && (this.angle = angle);
139
+ }
140
+ intersects(b) {
141
+ return (0, graphics_1.isRotateAABBIntersect)(this, b);
142
+ }
143
+ setValue(x1 = 0, y1 = 0, x2 = 0, y2 = 0, angle = 0) {
144
+ return super.setValue(x1, y1, x2, y2), this.angle = angle, this;
145
+ }
146
+ }
137
147
 
138
148
  exports.OBBBounds = OBBBounds;
139
- //# sourceMappingURL=bounds.js.map
149
+ //# sourceMappingURL=bounds.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/data-structure/bounds.ts"],"names":[],"mappings":"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","file":"bounds.js","sourcesContent":["import { isArray } from '../common';\nimport type { vec4, vec8 } from '../math';\nimport { abs, epsilon } from '../math';\nimport type { IMatrix } from './matrix';\nimport type { IPointLike } from './point';\n\nexport type IBoundsLike = Pick<IBounds, 'x1' | 'y1' | 'x2' | 'y2'>;\nexport type IAABBBoundsLike = IBoundsLike;\nexport type IOBBBoundsLike = Pick<IOBBBounds, 'x1' | 'y1' | 'x2' | 'y2' | 'angle'>;\n\nexport interface IBounds {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n clone: () => IBounds;\n clear: () => IBounds;\n empty: () => boolean;\n equals: (b: IBounds) => boolean;\n set: (x1: number, y1: number, x2: number, y2: number) => IBounds;\n setValue: (x1: number, y1: number, x2: number, y2: number) => IBounds;\n add: (x: number, y: number) => IBounds;\n expand: (d: number) => IBounds;\n round: () => IBounds;\n translate: (dx: number, dy: number) => IBounds;\n rotate: (angle: number, x: number, y: number) => IBounds;\n scale: (sx: number, sy: number, x: number, y: number) => IBounds;\n /**\n * 并集\n * @param b\n * @returns\n */\n union: (b: IBoundsLike) => IBounds;\n /**\n * 交集\n * @param b\n * @returns\n */\n intersect: (b: IBoundsLike) => IBounds;\n /**\n * 是否包含b\n * @param b\n * @returns\n */\n encloses: (b: IBoundsLike) => boolean;\n /**\n * 是否共边\n * @param b\n * @returns\n */\n alignsWith: (b: IBoundsLike) => boolean;\n /**\n * 是否相交\n * @param b\n * @returns\n */\n intersects: (b: IBoundsLike) => boolean;\n /**\n * 是否包含\n * @param x\n * @param y\n * @returns\n */\n contains: (x: number, y: number) => boolean;\n containsPoint: (p: IPointLike) => boolean;\n width: () => number;\n height: () => number;\n scaleX: (s: number) => IBounds;\n scaleY: (s: number) => IBounds;\n\n copy: (b: IBoundsLike) => IBounds;\n\n transformWithMatrix: (matrix: IMatrix) => IBounds;\n}\n\nexport type IAABBBounds = IBounds;\n\nexport interface IOBBBounds extends IBounds {\n angle: number;\n}\n\nexport function transformBoundsWithMatrix(out: IBounds, bounds: IBounds, matrix: IMatrix): IBounds {\n const { x1, y1, x2, y2 } = bounds;\n // 如果没有旋转和缩放,那就直接translate\n if (matrix.onlyTranslate()) {\n if (out !== bounds) {\n out.setValue(bounds.x1, bounds.y1, bounds.x2, bounds.y2);\n }\n out.translate(matrix.e, matrix.f);\n return bounds;\n }\n out.clear();\n out.add(matrix.a * x1 + matrix.c * y1 + matrix.e, matrix.b * x1 + matrix.d * y1 + matrix.f);\n out.add(matrix.a * x2 + matrix.c * y1 + matrix.e, matrix.b * x2 + matrix.d * y1 + matrix.f);\n out.add(matrix.a * x2 + matrix.c * y2 + matrix.e, matrix.b * x2 + matrix.d * y2 + matrix.f);\n out.add(matrix.a * x1 + matrix.c * y2 + matrix.e, matrix.b * x1 + matrix.d * y2 + matrix.f);\n return bounds;\n}\n\n/**\n * 依据graphic的属性对bounds进行变换\n * @param bounds\n * @param x\n * @param y\n * @param scaleX\n * @param scaleY\n * @param angle\n * @param rotateCenter\n */\nexport function transformBounds(\n bounds: IBounds,\n x: number,\n y: number,\n scaleX: number,\n scaleY: number,\n angle: number,\n rotateCenter?: [number, number]\n) {\n if (abs(scaleX) <= epsilon || abs(scaleY) <= epsilon) {\n return;\n }\n\n scaleX !== 1 && bounds.scaleX(scaleX);\n scaleY !== 1 && bounds.scaleY(scaleY);\n\n if (isFinite(angle) && Math.abs(angle) > epsilon) {\n let rx = 0;\n let ry = 0;\n if (rotateCenter !== undefined) {\n rx = rotateCenter[0];\n ry = rotateCenter[1];\n }\n bounds.rotate(angle, rx, ry);\n }\n\n bounds.translate(x, y);\n}\n\n/**\nCopyright (c) 2015-2021, University of Washington Interactive Data Lab\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n// 基于Vega的Bounds重构\n// https://github.com/vega/vega/blob/825bfaba6ccfe3306183df22b8c955a07bb30714/packages/vega-scenegraph/src/Bounds.js\nexport class Bounds implements IBounds {\n // 默认初始值是Number.MAX_VALUE\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n\n constructor(bounds?: Bounds) {\n if (bounds) {\n this.setValue(bounds.x1, bounds.y1, bounds.x2, bounds.y2);\n } else {\n this.clear();\n }\n }\n\n clone() {\n return new Bounds(this);\n }\n\n clear(): Bounds {\n this.x1 = +Number.MAX_VALUE;\n this.y1 = +Number.MAX_VALUE;\n this.x2 = -Number.MAX_VALUE;\n this.y2 = -Number.MAX_VALUE;\n return this;\n }\n empty(): boolean {\n return (\n this.x1 === +Number.MAX_VALUE &&\n this.y1 === +Number.MAX_VALUE &&\n this.x2 === -Number.MAX_VALUE &&\n this.y2 === -Number.MAX_VALUE\n );\n }\n equals(b: IBoundsLike): boolean {\n return this.x1 === b.x1 && this.y1 === b.y1 && this.x2 === b.x2 && this.y2 === b.y2;\n }\n setValue(x1: number = 0, y1: number = 0, x2: number = 0, y2: number = 0): Bounds {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n return this;\n }\n set(x1: number = 0, y1: number = 0, x2: number = 0, y2: number = 0): Bounds {\n if (x2 < x1) {\n this.x2 = x1;\n this.x1 = x2;\n } else {\n this.x1 = x1;\n this.x2 = x2;\n }\n if (y2 < y1) {\n this.y2 = y1;\n this.y1 = y2;\n } else {\n this.y1 = y1;\n this.y2 = y2;\n }\n return this;\n }\n add(x: number = 0, y: number = 0): Bounds {\n if (x < this.x1) {\n this.x1 = x;\n }\n if (y < this.y1) {\n this.y1 = y;\n }\n if (x > this.x2) {\n this.x2 = x;\n }\n if (y > this.y2) {\n this.y2 = y;\n }\n return this;\n }\n expand(d: number | [number, number, number, number] = 0): Bounds {\n if (isArray(d)) {\n this.y1 -= d[0];\n this.x2 += d[1];\n this.y2 += d[2];\n this.x1 -= d[3];\n } else {\n this.x1 -= d;\n this.y1 -= d;\n this.x2 += d;\n this.y2 += d;\n }\n return this;\n }\n round(): Bounds {\n this.x1 = Math.floor(this.x1);\n this.y1 = Math.floor(this.y1);\n this.x2 = Math.ceil(this.x2);\n this.y2 = Math.ceil(this.y2);\n return this;\n }\n translate(dx: number = 0, dy: number = 0): Bounds {\n this.x1 += dx;\n this.x2 += dx;\n this.y1 += dy;\n this.y2 += dy;\n return this;\n }\n rotate(angle: number = 0, x: number = 0, y: number = 0) {\n const p = this.rotatedPoints(angle, x, y);\n return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n }\n scale(sx: number = 0, sy: number = 0, x: number = 0, y: number = 0) {\n const p = this.scalePoints(sx, sy, x, y);\n return this.clear().add(p[0], p[1]).add(p[2], p[3]);\n }\n /**\n * 并集\n * @param b\n * @returns\n */\n union(b: IBoundsLike): Bounds {\n if (b.x1 < this.x1) {\n this.x1 = b.x1;\n }\n if (b.y1 < this.y1) {\n this.y1 = b.y1;\n }\n if (b.x2 > this.x2) {\n this.x2 = b.x2;\n }\n if (b.y2 > this.y2) {\n this.y2 = b.y2;\n }\n return this;\n }\n /**\n * 交集\n * @param b\n * @returns\n */\n intersect(b: IBoundsLike): Bounds {\n if (b.x1 > this.x1) {\n this.x1 = b.x1;\n }\n if (b.y1 > this.y1) {\n this.y1 = b.y1;\n }\n if (b.x2 < this.x2) {\n this.x2 = b.x2;\n }\n if (b.y2 < this.y2) {\n this.y2 = b.y2;\n }\n return this;\n }\n /**\n * 是否包含b\n * @param b\n * @returns\n */\n encloses(b: IBoundsLike): boolean {\n return b && this.x1 <= b.x1 && this.x2 >= b.x2 && this.y1 <= b.y1 && this.y2 >= b.y2;\n }\n /**\n * 是否共边\n * @param b\n * @returns\n */\n alignsWith(b: IBoundsLike): boolean {\n return b && (this.x1 === b.x1 || this.x2 === b.x2 || this.y1 === b.y1 || this.y2 === b.y2);\n }\n /**\n * 是否相交\n * @param b\n * @returns\n */\n intersects(b: IBoundsLike): boolean {\n return b && !(this.x2 < b.x1 || this.x1 > b.x2 || this.y2 < b.y1 || this.y1 > b.y2);\n }\n /**\n * 是否包含\n * @param x\n * @param y\n * @returns\n */\n contains(x: number = 0, y: number = 0): boolean {\n return !(x < this.x1 || x > this.x2 || y < this.y1 || y > this.y2);\n }\n containsPoint(p: IPointLike): boolean {\n return !(p.x < this.x1 || p.x > this.x2 || p.y < this.y1 || p.y > this.y2);\n }\n width(): number {\n if (this.empty()) {\n return 0;\n }\n return this.x2 - this.x1;\n }\n height(): number {\n if (this.empty()) {\n return 0;\n }\n return this.y2 - this.y1;\n }\n scaleX(s: number = 0): Bounds {\n this.x1 *= s;\n this.x2 *= s;\n return this;\n }\n\n scaleY(s: number = 0): Bounds {\n this.y1 *= s;\n this.y2 *= s;\n return this;\n }\n\n transformWithMatrix(matrix: IMatrix): Bounds {\n transformBoundsWithMatrix(this, this, matrix);\n return this;\n }\n\n copy(b: IBoundsLike) {\n this.x1 = b.x1;\n this.y1 = b.y1;\n this.x2 = b.x2;\n this.y2 = b.y2;\n return this;\n }\n private rotatedPoints(angle: number, x: number, y: number): vec8 {\n const { x1, y1, x2, y2 } = this;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const cx = x - x * cos + y * sin;\n const cy = y - x * sin - y * cos;\n\n return [\n cos * x1 - sin * y1 + cx,\n sin * x1 + cos * y1 + cy,\n cos * x1 - sin * y2 + cx,\n sin * x1 + cos * y2 + cy,\n cos * x2 - sin * y1 + cx,\n sin * x2 + cos * y1 + cy,\n cos * x2 - sin * y2 + cx,\n sin * x2 + cos * y2 + cy\n ];\n }\n private scalePoints(sx: number, sy: number, x: number, y: number): vec4 {\n const { x1, y1, x2, y2 } = this;\n\n return [sx * x1 + (1 - sx) * x, sy * y1 + (1 - sy) * y, sx * x2 + (1 - sx) * x, sy * y2 + (1 - sy) * y];\n }\n}\n\nexport class AABBBounds extends Bounds {}\nexport class OBBBounds extends Bounds {\n angle: number;\n}\n"]}
1
+ {"version":3,"sources":["../src/data-structure/bounds.ts"],"names":[],"mappings":"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","file":"bounds.js","sourcesContent":["import { isArray } from '../common';\nimport { isRotateAABBIntersect } from '../graphics';\nimport type { vec4, vec8 } from '../math';\nimport { abs, epsilon } from '../math';\nimport type { IMatrix } from './matrix';\nimport type { IPointLike } from './point';\n\nexport type IBoundsLike = Pick<IBounds, 'x1' | 'y1' | 'x2' | 'y2'>;\nexport type IAABBBoundsLike = IBoundsLike;\nexport type IOBBBoundsLike = Pick<IOBBBounds, 'x1' | 'y1' | 'x2' | 'y2' | 'angle'>;\n\nexport interface IBounds {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n clone: () => IBounds;\n clear: () => IBounds;\n empty: () => boolean;\n equals: (b: IBounds) => boolean;\n set: (x1: number, y1: number, x2: number, y2: number) => IBounds;\n setValue: (x1: number, y1: number, x2: number, y2: number) => IBounds;\n add: (x: number, y: number) => IBounds;\n expand: (d: number) => IBounds;\n round: () => IBounds;\n translate: (dx: number, dy: number) => IBounds;\n rotate: (angle: number, x: number, y: number) => IBounds;\n scale: (sx: number, sy: number, x: number, y: number) => IBounds;\n /**\n * 并集\n * @param b\n * @returns\n */\n union: (b: IBoundsLike) => IBounds;\n /**\n * 交集\n * @param b\n * @returns\n */\n intersect: (b: IBoundsLike) => IBounds;\n /**\n * 是否包含b\n * @param b\n * @returns\n */\n encloses: (b: IBoundsLike) => boolean;\n /**\n * 是否共边\n * @param b\n * @returns\n */\n alignsWith: (b: IBoundsLike) => boolean;\n /**\n * 是否相交\n * @param b\n * @returns\n */\n intersects: (b: IBoundsLike) => boolean;\n /**\n * 是否包含\n * @param x\n * @param y\n * @returns\n */\n contains: (x: number, y: number) => boolean;\n containsPoint: (p: IPointLike) => boolean;\n width: () => number;\n height: () => number;\n scaleX: (s: number) => IBounds;\n scaleY: (s: number) => IBounds;\n\n copy: (b: IBoundsLike) => IBounds;\n\n transformWithMatrix: (matrix: IMatrix) => IBounds;\n}\n\nexport type IAABBBounds = IBounds;\n\nexport interface IOBBBounds extends IBounds {\n angle: number;\n}\n\nexport function transformBoundsWithMatrix(out: IBounds, bounds: IBounds, matrix: IMatrix): IBounds {\n const { x1, y1, x2, y2 } = bounds;\n // 如果没有旋转和缩放,那就直接translate\n if (matrix.onlyTranslate()) {\n if (out !== bounds) {\n out.setValue(bounds.x1, bounds.y1, bounds.x2, bounds.y2);\n }\n out.translate(matrix.e, matrix.f);\n return bounds;\n }\n out.clear();\n out.add(matrix.a * x1 + matrix.c * y1 + matrix.e, matrix.b * x1 + matrix.d * y1 + matrix.f);\n out.add(matrix.a * x2 + matrix.c * y1 + matrix.e, matrix.b * x2 + matrix.d * y1 + matrix.f);\n out.add(matrix.a * x2 + matrix.c * y2 + matrix.e, matrix.b * x2 + matrix.d * y2 + matrix.f);\n out.add(matrix.a * x1 + matrix.c * y2 + matrix.e, matrix.b * x1 + matrix.d * y2 + matrix.f);\n return bounds;\n}\n\n/**\n * 依据graphic的属性对bounds进行变换\n * @param bounds\n * @param x\n * @param y\n * @param scaleX\n * @param scaleY\n * @param angle\n * @param rotateCenter\n */\nexport function transformBounds(\n bounds: IBounds,\n x: number,\n y: number,\n scaleX: number,\n scaleY: number,\n angle: number,\n rotateCenter?: [number, number]\n) {\n if (abs(scaleX) <= epsilon || abs(scaleY) <= epsilon) {\n return;\n }\n\n scaleX !== 1 && bounds.scaleX(scaleX);\n scaleY !== 1 && bounds.scaleY(scaleY);\n\n if (isFinite(angle) && Math.abs(angle) > epsilon) {\n let rx = 0;\n let ry = 0;\n if (rotateCenter !== undefined) {\n rx = rotateCenter[0];\n ry = rotateCenter[1];\n }\n bounds.rotate(angle, rx, ry);\n }\n\n bounds.translate(x, y);\n}\n\n/**\nCopyright (c) 2015-2021, University of Washington Interactive Data Lab\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n// 基于Vega的Bounds重构\n// https://github.com/vega/vega/blob/825bfaba6ccfe3306183df22b8c955a07bb30714/packages/vega-scenegraph/src/Bounds.js\nexport class Bounds implements IBounds {\n // 默认初始值是Number.MAX_VALUE\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n\n constructor(bounds?: Bounds) {\n if (bounds) {\n this.setValue(bounds.x1, bounds.y1, bounds.x2, bounds.y2);\n } else {\n this.clear();\n }\n }\n\n clone() {\n return new Bounds(this);\n }\n\n clear(): Bounds {\n this.x1 = +Number.MAX_VALUE;\n this.y1 = +Number.MAX_VALUE;\n this.x2 = -Number.MAX_VALUE;\n this.y2 = -Number.MAX_VALUE;\n return this;\n }\n empty(): boolean {\n return (\n this.x1 === +Number.MAX_VALUE &&\n this.y1 === +Number.MAX_VALUE &&\n this.x2 === -Number.MAX_VALUE &&\n this.y2 === -Number.MAX_VALUE\n );\n }\n equals(b: IBoundsLike): boolean {\n return this.x1 === b.x1 && this.y1 === b.y1 && this.x2 === b.x2 && this.y2 === b.y2;\n }\n setValue(x1: number = 0, y1: number = 0, x2: number = 0, y2: number = 0): Bounds {\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n return this;\n }\n set(x1: number = 0, y1: number = 0, x2: number = 0, y2: number = 0): Bounds {\n if (x2 < x1) {\n this.x2 = x1;\n this.x1 = x2;\n } else {\n this.x1 = x1;\n this.x2 = x2;\n }\n if (y2 < y1) {\n this.y2 = y1;\n this.y1 = y2;\n } else {\n this.y1 = y1;\n this.y2 = y2;\n }\n return this;\n }\n add(x: number = 0, y: number = 0): Bounds {\n if (x < this.x1) {\n this.x1 = x;\n }\n if (y < this.y1) {\n this.y1 = y;\n }\n if (x > this.x2) {\n this.x2 = x;\n }\n if (y > this.y2) {\n this.y2 = y;\n }\n return this;\n }\n expand(d: number | [number, number, number, number] = 0): Bounds {\n if (isArray(d)) {\n this.y1 -= d[0];\n this.x2 += d[1];\n this.y2 += d[2];\n this.x1 -= d[3];\n } else {\n this.x1 -= d;\n this.y1 -= d;\n this.x2 += d;\n this.y2 += d;\n }\n return this;\n }\n round(): Bounds {\n this.x1 = Math.floor(this.x1);\n this.y1 = Math.floor(this.y1);\n this.x2 = Math.ceil(this.x2);\n this.y2 = Math.ceil(this.y2);\n return this;\n }\n translate(dx: number = 0, dy: number = 0): Bounds {\n this.x1 += dx;\n this.x2 += dx;\n this.y1 += dy;\n this.y2 += dy;\n return this;\n }\n rotate(angle: number = 0, x: number = 0, y: number = 0) {\n const p = this.rotatedPoints(angle, x, y);\n return this.clear().add(p[0], p[1]).add(p[2], p[3]).add(p[4], p[5]).add(p[6], p[7]);\n }\n scale(sx: number = 0, sy: number = 0, x: number = 0, y: number = 0) {\n const p = this.scalePoints(sx, sy, x, y);\n return this.clear().add(p[0], p[1]).add(p[2], p[3]);\n }\n /**\n * 并集\n * @param b\n * @returns\n */\n union(b: IBoundsLike): Bounds {\n if (b.x1 < this.x1) {\n this.x1 = b.x1;\n }\n if (b.y1 < this.y1) {\n this.y1 = b.y1;\n }\n if (b.x2 > this.x2) {\n this.x2 = b.x2;\n }\n if (b.y2 > this.y2) {\n this.y2 = b.y2;\n }\n return this;\n }\n /**\n * 交集\n * @param b\n * @returns\n */\n intersect(b: IBoundsLike): Bounds {\n if (b.x1 > this.x1) {\n this.x1 = b.x1;\n }\n if (b.y1 > this.y1) {\n this.y1 = b.y1;\n }\n if (b.x2 < this.x2) {\n this.x2 = b.x2;\n }\n if (b.y2 < this.y2) {\n this.y2 = b.y2;\n }\n return this;\n }\n /**\n * 是否包含b\n * @param b\n * @returns\n */\n encloses(b: IBoundsLike): boolean {\n return b && this.x1 <= b.x1 && this.x2 >= b.x2 && this.y1 <= b.y1 && this.y2 >= b.y2;\n }\n /**\n * 是否共边\n * @param b\n * @returns\n */\n alignsWith(b: IBoundsLike): boolean {\n return b && (this.x1 === b.x1 || this.x2 === b.x2 || this.y1 === b.y1 || this.y2 === b.y2);\n }\n /**\n * 是否相交\n * @param b\n * @returns\n */\n intersects(b: IBoundsLike): boolean {\n return b && !(this.x2 < b.x1 || this.x1 > b.x2 || this.y2 < b.y1 || this.y1 > b.y2);\n }\n /**\n * 是否包含\n * @param x\n * @param y\n * @returns\n */\n contains(x: number = 0, y: number = 0): boolean {\n return !(x < this.x1 || x > this.x2 || y < this.y1 || y > this.y2);\n }\n containsPoint(p: IPointLike): boolean {\n return !(p.x < this.x1 || p.x > this.x2 || p.y < this.y1 || p.y > this.y2);\n }\n width(): number {\n if (this.empty()) {\n return 0;\n }\n return this.x2 - this.x1;\n }\n height(): number {\n if (this.empty()) {\n return 0;\n }\n return this.y2 - this.y1;\n }\n scaleX(s: number = 0): Bounds {\n this.x1 *= s;\n this.x2 *= s;\n return this;\n }\n\n scaleY(s: number = 0): Bounds {\n this.y1 *= s;\n this.y2 *= s;\n return this;\n }\n\n transformWithMatrix(matrix: IMatrix): Bounds {\n transformBoundsWithMatrix(this, this, matrix);\n return this;\n }\n\n copy(b: IBoundsLike) {\n this.x1 = b.x1;\n this.y1 = b.y1;\n this.x2 = b.x2;\n this.y2 = b.y2;\n return this;\n }\n private rotatedPoints(angle: number, x: number, y: number): vec8 {\n const { x1, y1, x2, y2 } = this;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const cx = x - x * cos + y * sin;\n const cy = y - x * sin - y * cos;\n\n return [\n cos * x1 - sin * y1 + cx,\n sin * x1 + cos * y1 + cy,\n cos * x1 - sin * y2 + cx,\n sin * x1 + cos * y2 + cy,\n cos * x2 - sin * y1 + cx,\n sin * x2 + cos * y1 + cy,\n cos * x2 - sin * y2 + cx,\n sin * x2 + cos * y2 + cy\n ];\n }\n private scalePoints(sx: number, sy: number, x: number, y: number): vec4 {\n const { x1, y1, x2, y2 } = this;\n\n return [sx * x1 + (1 - sx) * x, sy * y1 + (1 - sy) * y, sx * x2 + (1 - sx) * x, sy * y2 + (1 - sy) * y];\n }\n}\n\nexport class AABBBounds extends Bounds {}\nexport class OBBBounds extends Bounds {\n angle: number;\n\n constructor(bounds?: Bounds, angle = 0) {\n super(bounds);\n if (bounds) {\n this.angle = angle;\n }\n }\n\n intersects(b: OBBBounds): boolean {\n return isRotateAABBIntersect(this, b);\n }\n\n setValue(x1: number = 0, y1: number = 0, x2: number = 0, y2: number = 0, angle = 0): Bounds {\n super.setValue(x1, y1, x2, y2);\n this.angle = angle;\n return this;\n }\n}\n"]}
@@ -111,5 +111,4 @@ class HashTable {
111
111
  toImmutableMap() {}
112
112
  }
113
113
 
114
- exports.HashTable = HashTable;
115
- //# sourceMappingURL=hashTable.js.map
114
+ exports.HashTable = HashTable;
@@ -19,4 +19,4 @@ Object.defineProperty(exports, "__esModule", {
19
19
  value: !0
20
20
  }), __exportStar(require("./hashTable"), exports), __exportStar(require("./point"), exports),
21
21
  __exportStar(require("./bounds"), exports), __exportStar(require("./matrix"), exports);
22
- //# sourceMappingURL=index.js.map
22
+ //# sourceMappingURL=index.js.map
@@ -110,4 +110,4 @@ function normalTransform(out, origin, x, y, scaleX, scaleY, angle, rotateCenter)
110
110
  }
111
111
 
112
112
  exports.Matrix = Matrix, exports.normalTransform = normalTransform;
113
- //# sourceMappingURL=matrix.js.map
113
+ //# sourceMappingURL=matrix.js.map
@@ -78,4 +78,4 @@ class PolarPoint {
78
78
  }
79
79
 
80
80
  exports.PolarPoint = PolarPoint;
81
- //# sourceMappingURL=point.js.map
81
+ //# sourceMappingURL=point.js.map
@@ -1,5 +1,6 @@
1
1
  import type { IBoundsLike } from '../../data-structure';
2
2
  import type { vec2 } from '../../math';
3
+ import type { Point } from './interface';
3
4
  export declare function isIntersect(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean;
4
5
  export declare function getIntersectPoint(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean | vec2;
5
6
  export declare function getRectIntersect(bbox1: IBoundsLike | null, bbox2: IBoundsLike | null, format: boolean): IBoundsLike | null;
@@ -14,6 +15,13 @@ export declare function pointInRect(point: {
14
15
  x: number;
15
16
  y: number;
16
17
  }, bbox: IBoundsLike | null, format: boolean): boolean;
18
+ export declare function rotatePoint({ x, y }: Point, rad: number, origin?: {
19
+ x: number;
20
+ y: number;
21
+ }): {
22
+ x: number;
23
+ y: number;
24
+ };
17
25
  interface RotateBound extends IBoundsLike {
18
26
  angle: number;
19
27
  rotateCenter?: {
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
- }), exports.isRotateAABBIntersect = exports.pointInRect = exports.isRectIntersect = exports.rectInsideAnotherRect = exports.InnerBBox = exports.getRectIntersect = exports.getIntersectPoint = exports.isIntersect = void 0;
5
+ }), exports.isRotateAABBIntersect = exports.rotatePoint = exports.pointInRect = exports.isRectIntersect = exports.rectInsideAnotherRect = exports.InnerBBox = exports.getRectIntersect = exports.getIntersectPoint = exports.isIntersect = void 0;
6
6
 
7
7
  const angle_1 = require("../../angle"), math_1 = require("../../math");
8
8
 
@@ -95,13 +95,13 @@ function getProjectionRadius(checkAxis, axis) {
95
95
  return Math.abs(axis[0] * checkAxis[0] + axis[1] * checkAxis[1]);
96
96
  }
97
97
 
98
- function rotate({x: x, y: y}, deg, origin = {
98
+ function rotatePoint({x: x, y: y}, rad, origin = {
99
99
  x: 0,
100
100
  y: 0
101
101
  }) {
102
102
  return {
103
- x: (x - origin.x) * Math.cos(deg) + (y - origin.y) * Math.sin(deg) + origin.x,
104
- y: (x - origin.x) * Math.sin(deg) + (origin.y - y) * Math.cos(deg) + origin.y
103
+ x: (x - origin.x) * Math.cos(rad) - (y - origin.y) * Math.sin(rad) + origin.x,
104
+ y: (x - origin.x) * Math.sin(rad) + (y - origin.y) * Math.cos(rad) + origin.y
105
105
  };
106
106
  }
107
107
 
@@ -113,17 +113,17 @@ function getCenterPoint(box) {
113
113
  }
114
114
 
115
115
  function toRect(box, isDeg) {
116
- const deg = isDeg ? box.angle : (0, angle_1.degreeToRadian)(box.angle), cp = getCenterPoint(box);
117
- return [ rotate({
116
+ const deg = isDeg ? (0, angle_1.degreeToRadian)(box.angle) : box.angle, cp = getCenterPoint(box);
117
+ return [ rotatePoint({
118
118
  x: box.x1,
119
119
  y: box.y1
120
- }, deg, cp), rotate({
120
+ }, deg, cp), rotatePoint({
121
121
  x: box.x2,
122
122
  y: box.y1
123
- }, deg, cp), rotate({
123
+ }, deg, cp), rotatePoint({
124
124
  x: box.x2,
125
125
  y: box.y2
126
- }, deg, cp), rotate({
126
+ }, deg, cp), rotatePoint({
127
127
  x: box.x1,
128
128
  y: box.y2
129
129
  }, deg, cp) ];
@@ -139,11 +139,11 @@ function isRotateAABBIntersect(box1, box2, isDeg = !1, ctx) {
139
139
  })), ctx.fill(), ctx.restore());
140
140
  const p1 = getCenterPoint(box1), p2 = getCenterPoint(box2);
141
141
  ctx && ctx.fillRect(p1.x, p1.y, 2, 2), ctx && ctx.fillRect(p2.x, p2.y, 2, 2);
142
- const vp1p2 = vector(p1, p2), AB = vector(rect1[0], rect1[1]), BC = vector(rect1[1], rect1[2]), A1B1 = vector(rect2[0], rect2[1]), B1C1 = vector(rect2[1], rect2[2]), deg11 = isDeg ? box1.angle : (0,
143
- angle_1.degreeToRadian)(box1.angle);
144
- let deg12 = isDeg ? box1.angle + math_1.halfPi : (0, angle_1.degreeToRadian)(90 - box1.angle);
145
- const deg21 = isDeg ? box2.angle : (0, angle_1.degreeToRadian)(box2.angle);
146
- let deg22 = isDeg ? box2.angle + math_1.halfPi : (0, angle_1.degreeToRadian)(90 - box2.angle);
142
+ const vp1p2 = vector(p1, p2), AB = vector(rect1[0], rect1[1]), BC = vector(rect1[1], rect1[2]), A1B1 = vector(rect2[0], rect2[1]), B1C1 = vector(rect2[1], rect2[2]), deg11 = isDeg ? (0,
143
+ angle_1.degreeToRadian)(box1.angle) : box1.angle;
144
+ let deg12 = isDeg ? (0, angle_1.degreeToRadian)(90 - box1.angle) : box1.angle + math_1.halfPi;
145
+ const deg21 = isDeg ? (0, angle_1.degreeToRadian)(box2.angle) : box2.angle;
146
+ let deg22 = isDeg ? (0, angle_1.degreeToRadian)(90 - box2.angle) : box2.angle + math_1.halfPi;
147
147
  deg12 > math_1.pi2 && (deg12 -= math_1.pi2), deg22 > math_1.pi2 && (deg22 -= math_1.pi2);
148
148
  const isCover = (checkAxisRadius, deg, targetAxis1, targetAxis2) => {
149
149
  const checkAxis = [ Math.cos(deg), Math.sin(deg) ];
@@ -153,5 +153,5 @@ function isRotateAABBIntersect(box1, box2, isDeg = !1, ctx) {
153
153
  }
154
154
 
155
155
  exports.rectInsideAnotherRect = rectInsideAnotherRect, exports.isRectIntersect = isRectIntersect,
156
- exports.pointInRect = pointInRect, exports.isRotateAABBIntersect = isRotateAABBIntersect;
156
+ exports.pointInRect = pointInRect, exports.rotatePoint = rotatePoint, exports.isRotateAABBIntersect = isRotateAABBIntersect;
157
157
  //# sourceMappingURL=intersect.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/graphics/algorithm/intersect.ts"],"names":[],"mappings":"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","file":"intersect.js","sourcesContent":["/* 用于判断2d相交 */\nimport { degreeToRadian } from '../../angle';\nimport type { IBoundsLike } from '../../data-structure';\nimport type { vec2 } from '../../math';\nimport { pi2, halfPi, crossProduct, fuzzyEqualVec } from '../../math';\nimport type { Point } from './interface';\n\nfunction sub(out: vec2, v1: vec2, v2: vec2) {\n out[0] = v1[0] - v2[0];\n out[1] = v1[1] - v2[1];\n}\n\n/**\n * 判断直线是否相交,投影法\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function isIntersect(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean {\n let min1: number = left1[0];\n let max1: number = right1[0];\n let min2: number = left2[0];\n let max2: number = right2[0];\n if (max1 < min1) {\n [min1, max1] = [max1, min1];\n }\n if (max2 < min2) {\n [max2, min2] = [min2, max2];\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n (min1 = left1[1]), (max1 = right1[1]), (min2 = left2[1]), (max2 = right2[1]);\n if (max1 < min1) {\n [min1, max1] = [max1, min1];\n }\n if (max2 < min2) {\n [max2, min2] = [min2, max2];\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 获取直线交点\n * 不相交返回false,共线返回true,相交返回交点\n * https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function getIntersectPoint(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean | vec2 {\n if (!isIntersect(left1, right1, left2, right2)) {\n return false;\n }\n const dir1: vec2 = [0, 0];\n const dir2: vec2 = [0, 0];\n const tempVec: vec2 = [0, 0];\n sub(dir1, right1, left1);\n sub(dir2, right2, left2);\n\n // 判断共线\n if (fuzzyEqualVec(dir1, dir2)) {\n return true;\n }\n\n // https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n // line1: left1 + dir1 * t\n // line2: left2 + dir2 * u\n // 当 left1 + dir1 * t = left2 + dir2 * u => (left1 + dir1 * t) x dir2 = (left2 + dir2 * u) x dir2\n // => dir1 x dir2 * t = (left2 - left1) x dir2 => t = (left2 - left1) x dir2 / (dir1 x dir2)\n // 直线不平行,dir1 x dir2 ≠ 0,当0 <= t <= 1时,可以求出交点\n sub(tempVec, left2, left1);\n const t = crossProduct(tempVec, dir2) / crossProduct(dir1, dir2);\n if (t >= 0 && t <= 1) {\n return [left1[0] + dir1[0] * t, left1[1] + dir1[1] * t];\n }\n\n return false;\n}\n\n/**\n * 获取两个rect的相交部分\n * 如果有bbox为null,返回null,如果不相交返回{x1: 0, y1: 0, x2: 0, y2: 0}\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function getRectIntersect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): IBoundsLike | null {\n if (bbox1 === null) {\n return bbox2;\n }\n if (bbox2 === null) {\n return bbox1;\n }\n\n const { x11, x12, y11, y12, x21, x22, y21, y22 } = formatTwoBBox(bbox1, bbox2, format);\n\n if (x11 >= x22 || x12 <= x21 || y11 >= y22 || y12 <= y21) {\n return { x1: 0, y1: 0, x2: 0, y2: 0 };\n }\n return { x1: Math.max(x11, x21), y1: Math.max(y11, y21), x2: Math.min(x12, x22), y2: Math.min(y12, y22) };\n}\n\nexport enum InnerBBox {\n NONE = 0,\n BBOX1 = 1,\n BBOX2 = 2\n}\n\nconst formatTwoBBox = (bbox1: IBoundsLike, bbox2: IBoundsLike, format: boolean) => {\n let x11 = bbox1.x1;\n let x12 = bbox1.x2;\n let y11 = bbox1.y1;\n let y12 = bbox1.y2;\n let x21 = bbox2.x1;\n let x22 = bbox2.x2;\n let y21 = bbox2.y1;\n let y22 = bbox2.y2;\n\n if (format) {\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n }\n return { x11, x12, y11, y12, x21, x22, y21, y22 };\n};\n/**\n * 矩形是否在另一个矩形内部\n * 返回InnerBBox\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function rectInsideAnotherRect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): InnerBBox {\n if (!bbox1 || !bbox2) {\n return InnerBBox.NONE;\n }\n\n const { x11, x12, y11, y12, x21, x22, y21, y22 } = formatTwoBBox(bbox1, bbox2, format);\n // bbox1在bbox2内部\n if (x11 > x21 && x12 < x22 && y11 > y21 && y12 < y22) {\n return InnerBBox.BBOX1;\n }\n // bbox2在bbox1内部\n if (x21 > x11 && x22 < x12 && y21 > y11 && y22 < y12) {\n return InnerBBox.BBOX2;\n }\n\n return InnerBBox.NONE;\n}\n\n/**\n * 两个矩形是否相交\n * 如果有矩形为null,判断为相交\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function isRectIntersect(bbox1: IBoundsLike | null, bbox2: IBoundsLike | null, format: boolean): boolean {\n if (bbox1 && bbox2) {\n if (!format) {\n if (bbox1.x1 > bbox2.x2 || bbox1.x2 < bbox2.x1 || bbox1.y1 > bbox2.y2 || bbox1.y2 < bbox2.y1) {\n return false;\n }\n return true;\n }\n\n const { x11, x12, y11, y12, x21, x22, y21, y22 } = formatTwoBBox(bbox1, bbox2, true);\n\n if (x11 > x22 || x12 < x21 || y11 > y22 || y12 < y21) {\n return false;\n }\n return true;\n }\n return true;\n}\n\n/**\n * 点在box内部\n * 如果bbox为null返回true\n * @param point\n * @param bbox\n */\nexport function pointInRect(point: { x: number; y: number }, bbox: IBoundsLike | null, format: boolean): boolean {\n if (!bbox) {\n return true;\n }\n if (!format) {\n return point.x >= bbox.x1 && point.x <= bbox.x2 && point.y >= bbox.y1 && point.y <= bbox.y2;\n }\n let x11 = bbox.x1;\n let x12 = bbox.x2;\n let y11 = bbox.y1;\n let y12 = bbox.y2;\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n return point.x >= x11 && point.x <= x12 && point.y >= y11 && point.y <= y12;\n}\n\n// 参考https://github.com/francecil/leetcode/issues/1\n\n/**\n * 计算投影半径\n * @param {Array(Number)} checkAxis 检测轴 [cosθ,sinθ]\n * @param {Array} axis 目标轴 [x,y]\n */\nfunction getProjectionRadius(checkAxis: [number, number], axis: [number, number]) {\n return Math.abs(axis[0] * checkAxis[0] + axis[1] * checkAxis[1]);\n}\n\nfunction rotate({ x, y }: Point, deg: number, origin = { x: 0, y: 0 }) {\n return {\n x: (x - origin.x) * Math.cos(deg) + (y - origin.y) * Math.sin(deg) + origin.x,\n y: (x - origin.x) * Math.sin(deg) + (origin.y - y) * Math.cos(deg) + origin.y\n };\n}\n\nfunction getCenterPoint(box: RotateBound): Point {\n return {\n x: (box.x1 + box.x2) / 2,\n y: (box.y1 + box.y2) / 2\n };\n}\n\ninterface RotateBound extends IBoundsLike {\n angle: number;\n rotateCenter?: { x: number; y: number };\n}\n\n/**\n * 转化为顶点坐标数组\n * @param {Object} box\n */\nfunction toRect(box: RotateBound, isDeg: boolean) {\n const deg = isDeg ? box.angle : degreeToRadian(box.angle);\n const cp = getCenterPoint(box);\n return [\n rotate(\n {\n x: box.x1,\n y: box.y1\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x2,\n y: box.y1\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x2,\n y: box.y2\n },\n deg,\n cp\n ),\n rotate(\n {\n x: box.x1,\n y: box.y2\n },\n deg,\n cp\n )\n ];\n}\nexport function isRotateAABBIntersect(\n box1: RotateBound,\n box2: RotateBound,\n isDeg = false,\n ctx?: CanvasRenderingContext2D\n) {\n const rect1 = toRect(box1, isDeg);\n const rect2 = toRect(box2, isDeg);\n const vector = (start: Point, end: Point) => {\n return [end.x - start.x, end.y - start.y] as [number, number];\n };\n\n if (ctx) {\n ctx.save();\n ctx.fillStyle = 'red';\n ctx.globalAlpha = 0.6;\n rect1.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n\n ctx.save();\n ctx.fillStyle = 'green';\n ctx.globalAlpha = 0.6;\n rect2.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n }\n\n // 两个矩形的中心点\n const p1 = getCenterPoint(box1);\n const p2 = getCenterPoint(box2);\n\n ctx && ctx.fillRect(p1.x, p1.y, 2, 2);\n ctx && ctx.fillRect(p2.x, p2.y, 2, 2);\n // 向量 p1p2\n const vp1p2 = vector(p1, p2);\n\n //矩形1的两边向量\n const AB = vector(rect1[0], rect1[1]);\n const BC = vector(rect1[1], rect1[2]);\n //矩形2的两边向量\n const A1B1 = vector(rect2[0], rect2[1]);\n const B1C1 = vector(rect2[1], rect2[2]);\n\n // 矩形1 的两个弧度\n const deg11 = isDeg ? box1.angle : degreeToRadian(box1.angle);\n let deg12 = isDeg ? box1.angle + halfPi : degreeToRadian(90 - box1.angle);\n // 矩形2 的两个弧度\n const deg21 = isDeg ? box2.angle : degreeToRadian(box2.angle);\n let deg22 = isDeg ? box2.angle + halfPi : degreeToRadian(90 - box2.angle);\n if (deg12 > pi2) {\n deg12 -= pi2;\n }\n if (deg22 > pi2) {\n deg22 -= pi2;\n }\n\n // 投影重叠\n const isCover = (\n checkAxisRadius: number,\n deg: number,\n targetAxis1: [number, number],\n targetAxis2: [number, number]\n ) => {\n const checkAxis = [Math.cos(deg), Math.sin(deg)] as [number, number];\n const targetAxisRadius =\n (getProjectionRadius(checkAxis, targetAxis1) + getProjectionRadius(checkAxis, targetAxis2)) / 2;\n const centerPointRadius = getProjectionRadius(checkAxis, vp1p2);\n // console.log('abc', `checkAxis:${checkAxis},三个投影:${checkAxisRadius}, ${targetAxisRadius}, ${centerPointRadius}`)\n return checkAxisRadius + targetAxisRadius > centerPointRadius;\n };\n\n return (\n isCover((box1.x2 - box1.x1) / 2, deg11, A1B1, B1C1) &&\n isCover((box1.y2 - box1.y1) / 2, deg12, A1B1, B1C1) &&\n isCover((box2.x2 - box2.x1) / 2, deg21, AB, BC) &&\n isCover((box2.y2 - box2.y1) / 2, deg22, AB, BC)\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/graphics/algorithm/intersect.ts"],"names":[],"mappings":"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","file":"intersect.js","sourcesContent":["/* 用于判断2d相交 */\nimport { degreeToRadian } from '../../angle';\nimport type { IBoundsLike } from '../../data-structure';\nimport type { vec2 } from '../../math';\nimport { pi2, halfPi, crossProduct, fuzzyEqualVec } from '../../math';\nimport type { Point } from './interface';\n\nfunction sub(out: vec2, v1: vec2, v2: vec2) {\n out[0] = v1[0] - v2[0];\n out[1] = v1[1] - v2[1];\n}\n\n/**\n * 判断直线是否相交,投影法\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function isIntersect(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean {\n let min1: number = left1[0];\n let max1: number = right1[0];\n let min2: number = left2[0];\n let max2: number = right2[0];\n if (max1 < min1) {\n [min1, max1] = [max1, min1];\n }\n if (max2 < min2) {\n [max2, min2] = [min2, max2];\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n (min1 = left1[1]), (max1 = right1[1]), (min2 = left2[1]), (max2 = right2[1]);\n if (max1 < min1) {\n [min1, max1] = [max1, min1];\n }\n if (max2 < min2) {\n [max2, min2] = [min2, max2];\n }\n if (max1 < min2 || max2 < min1) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 获取直线交点\n * 不相交返回false,共线返回true,相交返回交点\n * https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n * @param left1\n * @param right1\n * @param left2\n * @param right2\n */\nexport function getIntersectPoint(left1: vec2, right1: vec2, left2: vec2, right2: vec2): boolean | vec2 {\n if (!isIntersect(left1, right1, left2, right2)) {\n return false;\n }\n const dir1: vec2 = [0, 0];\n const dir2: vec2 = [0, 0];\n const tempVec: vec2 = [0, 0];\n sub(dir1, right1, left1);\n sub(dir2, right2, left2);\n\n // 判断共线\n if (fuzzyEqualVec(dir1, dir2)) {\n return true;\n }\n\n // https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect/565282#565282\n // line1: left1 + dir1 * t\n // line2: left2 + dir2 * u\n // 当 left1 + dir1 * t = left2 + dir2 * u => (left1 + dir1 * t) x dir2 = (left2 + dir2 * u) x dir2\n // => dir1 x dir2 * t = (left2 - left1) x dir2 => t = (left2 - left1) x dir2 / (dir1 x dir2)\n // 直线不平行,dir1 x dir2 ≠ 0,当0 <= t <= 1时,可以求出交点\n sub(tempVec, left2, left1);\n const t = crossProduct(tempVec, dir2) / crossProduct(dir1, dir2);\n if (t >= 0 && t <= 1) {\n return [left1[0] + dir1[0] * t, left1[1] + dir1[1] * t];\n }\n\n return false;\n}\n\n/**\n * 获取两个rect的相交部分\n * 如果有bbox为null,返回null,如果不相交返回{x1: 0, y1: 0, x2: 0, y2: 0}\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function getRectIntersect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): IBoundsLike | null {\n if (bbox1 === null) {\n return bbox2;\n }\n if (bbox2 === null) {\n return bbox1;\n }\n\n const { x11, x12, y11, y12, x21, x22, y21, y22 } = formatTwoBBox(bbox1, bbox2, format);\n\n if (x11 >= x22 || x12 <= x21 || y11 >= y22 || y12 <= y21) {\n return { x1: 0, y1: 0, x2: 0, y2: 0 };\n }\n return { x1: Math.max(x11, x21), y1: Math.max(y11, y21), x2: Math.min(x12, x22), y2: Math.min(y12, y22) };\n}\n\nexport enum InnerBBox {\n NONE = 0,\n BBOX1 = 1,\n BBOX2 = 2\n}\n\nconst formatTwoBBox = (bbox1: IBoundsLike, bbox2: IBoundsLike, format: boolean) => {\n let x11 = bbox1.x1;\n let x12 = bbox1.x2;\n let y11 = bbox1.y1;\n let y12 = bbox1.y2;\n let x21 = bbox2.x1;\n let x22 = bbox2.x2;\n let y21 = bbox2.y1;\n let y22 = bbox2.y2;\n\n if (format) {\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n if (x21 > x22) {\n [x21, x22] = [x22, x21];\n }\n if (y21 > y22) {\n [y21, y22] = [y22, y21];\n }\n }\n return { x11, x12, y11, y12, x21, x22, y21, y22 };\n};\n/**\n * 矩形是否在另一个矩形内部\n * 返回InnerBBox\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function rectInsideAnotherRect(\n bbox1: IBoundsLike | null,\n bbox2: IBoundsLike | null,\n format: boolean\n): InnerBBox {\n if (!bbox1 || !bbox2) {\n return InnerBBox.NONE;\n }\n\n const { x11, x12, y11, y12, x21, x22, y21, y22 } = formatTwoBBox(bbox1, bbox2, format);\n // bbox1在bbox2内部\n if (x11 > x21 && x12 < x22 && y11 > y21 && y12 < y22) {\n return InnerBBox.BBOX1;\n }\n // bbox2在bbox1内部\n if (x21 > x11 && x22 < x12 && y21 > y11 && y22 < y12) {\n return InnerBBox.BBOX2;\n }\n\n return InnerBBox.NONE;\n}\n\n/**\n * 两个矩形是否相交\n * 如果有矩形为null,判断为相交\n * @param bbox1\n * @param bbox2\n * @param format\n */\nexport function isRectIntersect(bbox1: IBoundsLike | null, bbox2: IBoundsLike | null, format: boolean): boolean {\n if (bbox1 && bbox2) {\n if (!format) {\n if (bbox1.x1 > bbox2.x2 || bbox1.x2 < bbox2.x1 || bbox1.y1 > bbox2.y2 || bbox1.y2 < bbox2.y1) {\n return false;\n }\n return true;\n }\n\n const { x11, x12, y11, y12, x21, x22, y21, y22 } = formatTwoBBox(bbox1, bbox2, true);\n\n if (x11 > x22 || x12 < x21 || y11 > y22 || y12 < y21) {\n return false;\n }\n return true;\n }\n return true;\n}\n\n/**\n * 点在box内部\n * 如果bbox为null返回true\n * @param point\n * @param bbox\n */\nexport function pointInRect(point: { x: number; y: number }, bbox: IBoundsLike | null, format: boolean): boolean {\n if (!bbox) {\n return true;\n }\n if (!format) {\n return point.x >= bbox.x1 && point.x <= bbox.x2 && point.y >= bbox.y1 && point.y <= bbox.y2;\n }\n let x11 = bbox.x1;\n let x12 = bbox.x2;\n let y11 = bbox.y1;\n let y12 = bbox.y2;\n if (x11 > x12) {\n [x11, x12] = [x12, x11];\n }\n if (y11 > y12) {\n [y11, y12] = [y12, y11];\n }\n return point.x >= x11 && point.x <= x12 && point.y >= y11 && point.y <= y12;\n}\n\n// 参考https://github.com/francecil/leetcode/issues/1\n\n/**\n * 计算投影半径\n * @param {Array(Number)} checkAxis 检测轴 [cosθ,sinθ]\n * @param {Array} axis 目标轴 [x,y]\n */\nfunction getProjectionRadius(checkAxis: [number, number], axis: [number, number]) {\n return Math.abs(axis[0] * checkAxis[0] + axis[1] * checkAxis[1]);\n}\n\n/**\n * 逆时针旋转矩阵(从正 x 轴开始,旋转到正 y 轴的方向)\n * [ cos(θ) -sin(θ) ]\n * [ sin(θ) cos(θ) ]\n */\nexport function rotatePoint({ x, y }: Point, rad: number, origin = { x: 0, y: 0 }) {\n return {\n x: (x - origin.x) * Math.cos(rad) - (y - origin.y) * Math.sin(rad) + origin.x,\n y: (x - origin.x) * Math.sin(rad) + (y - origin.y) * Math.cos(rad) + origin.y\n };\n}\n\nfunction getCenterPoint(box: RotateBound): Point {\n return {\n x: (box.x1 + box.x2) / 2,\n y: (box.y1 + box.y2) / 2\n };\n}\n\ninterface RotateBound extends IBoundsLike {\n angle: number;\n rotateCenter?: { x: number; y: number };\n}\n\n/**\n * 转化为顶点坐标数组\n * @param {Object} box\n */\nfunction toRect(box: RotateBound, isDeg: boolean) {\n const deg = isDeg ? degreeToRadian(box.angle) : box.angle;\n const cp = getCenterPoint(box);\n return [\n rotatePoint(\n {\n x: box.x1,\n y: box.y1\n },\n deg,\n cp\n ),\n rotatePoint(\n {\n x: box.x2,\n y: box.y1\n },\n deg,\n cp\n ),\n rotatePoint(\n {\n x: box.x2,\n y: box.y2\n },\n deg,\n cp\n ),\n rotatePoint(\n {\n x: box.x1,\n y: box.y2\n },\n deg,\n cp\n )\n ];\n}\nexport function isRotateAABBIntersect(\n box1: RotateBound,\n box2: RotateBound,\n isDeg = false,\n ctx?: CanvasRenderingContext2D\n) {\n const rect1 = toRect(box1, isDeg);\n const rect2 = toRect(box2, isDeg);\n\n const vector = (start: Point, end: Point) => {\n return [end.x - start.x, end.y - start.y] as [number, number];\n };\n\n if (ctx) {\n ctx.save();\n ctx.fillStyle = 'red';\n ctx.globalAlpha = 0.6;\n rect1.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n\n ctx.save();\n ctx.fillStyle = 'green';\n ctx.globalAlpha = 0.6;\n rect2.forEach((item, index) => {\n if (index === 0) {\n ctx.moveTo(item.x, item.y);\n } else {\n ctx.lineTo(item.x, item.y);\n }\n });\n ctx.fill();\n ctx.restore();\n }\n\n // 两个矩形的中心点\n const p1 = getCenterPoint(box1);\n const p2 = getCenterPoint(box2);\n\n ctx && ctx.fillRect(p1.x, p1.y, 2, 2);\n ctx && ctx.fillRect(p2.x, p2.y, 2, 2);\n // 向量 p1p2\n const vp1p2 = vector(p1, p2);\n\n //矩形1的两边向量\n const AB = vector(rect1[0], rect1[1]);\n const BC = vector(rect1[1], rect1[2]);\n //矩形2的两边向量\n const A1B1 = vector(rect2[0], rect2[1]);\n const B1C1 = vector(rect2[1], rect2[2]);\n\n // 矩形1 的两个弧度\n const deg11 = isDeg ? degreeToRadian(box1.angle) : box1.angle;\n let deg12 = isDeg ? degreeToRadian(90 - box1.angle) : box1.angle + halfPi;\n // 矩形2 的两个弧度\n const deg21 = isDeg ? degreeToRadian(box2.angle) : box2.angle;\n let deg22 = isDeg ? degreeToRadian(90 - box2.angle) : box2.angle + halfPi;\n if (deg12 > pi2) {\n deg12 -= pi2;\n }\n if (deg22 > pi2) {\n deg22 -= pi2;\n }\n\n // 投影重叠\n const isCover = (\n checkAxisRadius: number,\n deg: number,\n targetAxis1: [number, number],\n targetAxis2: [number, number]\n ) => {\n const checkAxis = [Math.cos(deg), Math.sin(deg)] as [number, number];\n const targetAxisRadius =\n (getProjectionRadius(checkAxis, targetAxis1) + getProjectionRadius(checkAxis, targetAxis2)) / 2;\n const centerPointRadius = getProjectionRadius(checkAxis, vp1p2);\n // console.log('abc', `checkAxis:${checkAxis},三个投影:${checkAxisRadius}, ${targetAxisRadius}, ${centerPointRadius}`)\n return checkAxisRadius + targetAxisRadius > centerPointRadius;\n };\n\n return (\n isCover((box1.x2 - box1.x1) / 2, deg11, A1B1, B1C1) &&\n isCover((box1.y2 - box1.y1) / 2, deg12, A1B1, B1C1) &&\n isCover((box2.x2 - box2.x1) / 2, deg21, AB, BC) &&\n isCover((box2.y2 - box2.y1) / 2, deg22, AB, BC)\n );\n}\n"]}