lines-intersection.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { __read } from "tslib";
  2. function inside(x1, x2, y1, y2, xk, yk) {
  3. return ((x1 === x2 || (Math.min(x1, x2) <= xk && xk <= Math.max(x1, x2))) &&
  4. (y1 === y2 || (Math.min(y1, y2) <= yk && yk <= Math.max(y1, y2))));
  5. }
  6. function update(ans, x, y) {
  7. var out = ans;
  8. if (!ans.length || x < ans[0] || (x === ans[0] && y < ans[1])) {
  9. out[0] = x;
  10. out[1] = y;
  11. }
  12. }
  13. /**
  14. * 求两个线段的交点坐标
  15. * 参考:https://leetcode-cn.com/problems/intersection-lcci/solution/jiao-dian-by-leetcode-solution/
  16. */
  17. export function intersection(_a, _b, _c, _d) {
  18. var _e = __read(_a, 2), x1 = _e[0], y1 = _e[1];
  19. var _f = __read(_b, 2), x2 = _f[0], y2 = _f[1];
  20. var _g = __read(_c, 2), x3 = _g[0], y3 = _g[1];
  21. var _h = __read(_d, 2), x4 = _h[0], y4 = _h[1];
  22. var ans = [];
  23. // 若两直线平行
  24. if ((y4 - y3) * (x2 - x1) === (y2 - y1) * (x4 - x3)) {
  25. // 若两线段有重合
  26. if ((y2 - y1) * (x3 - x1) === (y3 - y1) * (x2 - x1)) {
  27. // 分别判断四个点
  28. if (inside(x1, x2, y1, y2, x3, y3)) {
  29. update(ans, x3, y3);
  30. }
  31. if (inside(x1, x2, y1, y2, x4, y4)) {
  32. update(ans, x4, y4);
  33. }
  34. if (inside(x3, x4, y3, y4, x1, y1)) {
  35. update(ans, x1, y1);
  36. }
  37. if (inside(x3, x4, y3, y4, x2, y2)) {
  38. update(ans, x2, y2);
  39. }
  40. }
  41. }
  42. else {
  43. // 联立方程得到 t1 和 t2 的值
  44. var t1 = (x3 * (y4 - y3) + y1 * (x4 - x3) - y3 * (x4 - x3) - x1 * (y4 - y3)) /
  45. ((x2 - x1) * (y4 - y3) - (x4 - x3) * (y2 - y1));
  46. var t2 = (x1 * (y2 - y1) + y3 * (x2 - x1) - y1 * (x2 - x1) - x3 * (y2 - y1)) /
  47. ((x4 - x3) * (y2 - y1) - (x2 - x1) * (y4 - y3));
  48. // 判断 t1 和 t2 是否均在 [0, 1] 之间
  49. if (t1 >= 0.0 && t1 <= 1.0 && t2 >= 0.0 && t2 <= 1.0) {
  50. ans[0] = x1 + t1 * (x2 - x1);
  51. ans[1] = y1 + t1 * (y2 - y1);
  52. }
  53. }
  54. return ans;
  55. }
  56. //# sourceMappingURL=lines-intersection.js.map