line.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var util_1 = require("./util");
  4. var vec2 = require("gl-matrix/vec2");
  5. exports.default = {
  6. /**
  7. * 计算线段的包围盒
  8. * @param {number} x1 起始点 x
  9. * @param {number} y1 起始点 y
  10. * @param {number} x2 结束点 x
  11. * @param {number} y2 结束点 y
  12. * @return {object} 包围盒对象
  13. */
  14. box: function (x1, y1, x2, y2) {
  15. return util_1.getBBoxByArray([x1, x2], [y1, y2]);
  16. },
  17. /**
  18. * 线段的长度
  19. * @param {number} x1 起始点 x
  20. * @param {number} y1 起始点 y
  21. * @param {number} x2 结束点 x
  22. * @param {number} y2 结束点 y
  23. * @return {number} 距离
  24. */
  25. length: function (x1, y1, x2, y2) {
  26. return util_1.distance(x1, y1, x2, y2);
  27. },
  28. /**
  29. * 根据比例获取点
  30. * @param {number} x1 起始点 x
  31. * @param {number} y1 起始点 y
  32. * @param {number} x2 结束点 x
  33. * @param {number} y2 结束点 y
  34. * @param {number} t 指定比例
  35. * @return {object} 包含 x, y 的点
  36. */
  37. pointAt: function (x1, y1, x2, y2, t) {
  38. return {
  39. x: (1 - t) * x1 + t * x2,
  40. y: (1 - t) * y1 + t * y2,
  41. };
  42. },
  43. /**
  44. * 点到线段的距离
  45. * @param {number} x1 起始点 x
  46. * @param {number} y1 起始点 y
  47. * @param {number} x2 结束点 x
  48. * @param {number} y2 结束点 y
  49. * @param {number} x 测试点 x
  50. * @param {number} y 测试点 y
  51. * @return {number} 距离
  52. */
  53. pointDistance: function (x1, y1, x2, y2, x, y) {
  54. // 投影距离 x1, y1 的向量,假设 p, p1, p2 三个点,投影点为 a
  55. // p1a = p1p.p1p2/|p1p2| * (p1p 的单位向量)
  56. var cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
  57. if (cross < 0) {
  58. return util_1.distance(x1, y1, x, y);
  59. }
  60. var lengthSquare = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
  61. if (cross > lengthSquare) {
  62. return util_1.distance(x2, y2, x, y);
  63. }
  64. return this.pointToLine(x1, y1, x2, y2, x, y);
  65. },
  66. /**
  67. * 点到直线的距离,而不是点到线段的距离
  68. * @param {number} x1 起始点 x
  69. * @param {number} y1 起始点 y
  70. * @param {number} x2 结束点 x
  71. * @param {number} y2 结束点 y
  72. * @param {number} x 测试点 x
  73. * @param {number} y 测试点 y
  74. * @return {number} 距离
  75. */
  76. pointToLine: function (x1, y1, x2, y2, x, y) {
  77. var d = [x2 - x1, y2 - y1];
  78. // 如果端点相等,则判定点到点的距离
  79. if (vec2.exactEquals(d, [0, 0])) {
  80. return Math.sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
  81. }
  82. var u = [-d[1], d[0]];
  83. vec2.normalize(u, u);
  84. var a = [x - x1, y - y1];
  85. return Math.abs(vec2.dot(a, u));
  86. },
  87. /**
  88. * 线段的角度
  89. * @param {number} x1 起始点 x
  90. * @param {number} y1 起始点 y
  91. * @param {number} x2 结束点 x
  92. * @param {number} y2 结束点 y
  93. * @return {number} 导数
  94. */
  95. tangentAngle: function (x1, y1, x2, y2) {
  96. return Math.atan2(y2 - y1, x2 - x1);
  97. },
  98. };
  99. //# sourceMappingURL=line.js.map