line.js 3.1 KB

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