intersect.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { __read, __values } from "tslib";
  2. import { getBounds } from './bounds';
  3. /**
  4. * Detect whether line-line collision.
  5. * From: https://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect
  6. */
  7. function lineToLine(line1, line2) {
  8. var _a = __read(line1, 4), x0 = _a[0], y0 = _a[1], x1 = _a[2], y1 = _a[3];
  9. var _b = __read(line2, 4), x2 = _b[0], y2 = _b[1], x3 = _b[2], y3 = _b[3];
  10. var s10x = x1 - x0;
  11. var s10y = y1 - y0;
  12. var s32x = x3 - x2;
  13. var s32y = y3 - y2;
  14. var denom = s10x * s32y - s32x * s10y;
  15. if (denom === 0)
  16. return false;
  17. var denomPositive = denom > 0;
  18. var s02x = x0 - x2;
  19. var s02y = y0 - y2;
  20. var sNum = s10x * s02y - s10y * s02x;
  21. if (sNum < 0 === denomPositive)
  22. return false;
  23. var tNum = s32x * s02y - s32y * s02x;
  24. if (tNum < 0 === denomPositive)
  25. return false;
  26. if (sNum > denom === denomPositive || tNum > denom === denomPositive)
  27. return false;
  28. return true;
  29. }
  30. function intersectBoxLine(box /** 八个顶点 */, line) {
  31. var lines = [
  32. [box[0], box[1], box[2], box[3]],
  33. [box[2], box[3], box[4], box[5]],
  34. [box[4], box[5], box[6], box[7]],
  35. [box[6], box[7], box[0], box[1]],
  36. ];
  37. return lines.some(function (boxLine) { return lineToLine(line, boxLine); });
  38. }
  39. export var IntersectUtils = { lineToLine: lineToLine, intersectBoxLine: intersectBoxLine, getBounds: getBounds };
  40. /**
  41. * 检测两个 DisplayObject 是否相交
  42. */
  43. export function intersect(a, b, margin) {
  44. var e_1, _a;
  45. var p = getBounds(a, margin).flat(1);
  46. var q = getBounds(b, margin).flat(1);
  47. var linesP = [
  48. [p[0], p[1], p[2], p[3]],
  49. [p[0], p[1], p[4], p[5]],
  50. [p[4], p[5], p[6], p[7]],
  51. [p[2], p[3], p[6], p[7]],
  52. ];
  53. try {
  54. for (var linesP_1 = __values(linesP), linesP_1_1 = linesP_1.next(); !linesP_1_1.done; linesP_1_1 = linesP_1.next()) {
  55. var line = linesP_1_1.value;
  56. if (intersectBoxLine(q, line))
  57. return true;
  58. }
  59. }
  60. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  61. finally {
  62. try {
  63. if (linesP_1_1 && !linesP_1_1.done && (_a = linesP_1.return)) _a.call(linesP_1);
  64. }
  65. finally { if (e_1) throw e_1.error; }
  66. }
  67. return false;
  68. }
  69. //# sourceMappingURL=intersect.js.map