curve.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * 根据弧线的坐标节点数组
  3. */
  4. function getCurvePoints(points, options) {
  5. options = options || {};
  6. var curvePoints = [];
  7. for (var i = 0; i < points.length - 1; i++) {
  8. var p = getCurveByTwoPoints(points[i], points[i + 1], options.count);
  9. if (p && p.length > 0) {
  10. curvePoints = curvePoints.concat(p);
  11. }
  12. }
  13. return curvePoints;
  14. }
  15. /**
  16. * 根据两点获取曲线坐标点数组
  17. * @param Point 起点
  18. * @param Point 终点
  19. */
  20. function getCurveByTwoPoints(obj1, obj2, count) {
  21. if (!obj1 || !obj2) {
  22. return null;
  23. }
  24. var B1 = function(x) {
  25. return 1 - 2 * x + x * x;
  26. };
  27. var B2 = function(x) {
  28. return 2 * x - 2 * x * x;
  29. };
  30. var B3 = function(x) {
  31. return x * x;
  32. };
  33. var curveCoordinates = [];
  34. var count = count || 40; // 曲线是由一些小的线段组成的,这个表示这个曲线所有到的折线的个数
  35. var isFuture = false;
  36. var t, h, h2, lat3, lng3, j, t2;
  37. var LnArray = [];
  38. var i = 0;
  39. var inc = 0;
  40. if (typeof(obj2) == "undefined") {
  41. if (typeof(curveCoordinates) != "undefined") {
  42. curveCoordinates = [];
  43. }
  44. return;
  45. }
  46. var lat1 = parseFloat(obj1.lat);
  47. var lat2 = parseFloat(obj2.lat);
  48. var lng1 = parseFloat(obj1.lng);
  49. var lng2 = parseFloat(obj2.lng);
  50. // 计算曲线角度的方法
  51. if (lng2 > lng1) {
  52. if (parseFloat(lng2-lng1) > 180) {
  53. if (lng1 < 0) {
  54. lng1 = parseFloat(180 + 180 + lng1);
  55. }
  56. }
  57. }
  58. if (lng1 > lng2) {
  59. if (parseFloat(lng1-lng2) > 180) {
  60. if (lng2 < 0) {
  61. lng2 = parseFloat(180 + 180 + lng2);
  62. }
  63. }
  64. }
  65. j = 0;
  66. t2 = 0;
  67. if (lat2 == lat1) {
  68. t = 0;
  69. h = lng1 - lng2;
  70. } else if (lng2 == lng1) {
  71. t = Math.PI / 2;
  72. h = lat1 - lat2;
  73. } else {
  74. t = Math.atan((lat2 - lat1) / (lng2 - lng1));
  75. h = (lat2 - lat1) / Math.sin(t);
  76. }
  77. if (t2 == 0) {
  78. t2 = (t + (Math.PI / 5));
  79. }
  80. h2 = h / 2;
  81. lng3 = h2 * Math.cos(t2) + lng1;
  82. lat3 = h2 * Math.sin(t2) + lat1;
  83. for (i = 0; i < count + 1; i++) {
  84. curveCoordinates.push([
  85. (lng1 * B1(inc) + lng3 * B2(inc)) + lng2 * B3(inc),
  86. (lat1 * B1(inc) + lat3 * B2(inc) + lat2 * B3(inc))
  87. ]);
  88. inc = inc + (1 / count);
  89. }
  90. return curveCoordinates;
  91. }
  92. function Point (lng, lat) {
  93. this.lng = lng;
  94. this.lat = lat;
  95. }