You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

parabola.js 1.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /**
  2. * @Author: Caven
  3. * @Date: 2020-05-28 10:24:38
  4. */
  5. export default function parabola(
  6. startPosition,
  7. endPosition,
  8. height = 0,
  9. count = 50
  10. ) {
  11. //方程 y=-(4h/L^2)*x^2+h h:顶点高度 L:横纵间距较大者
  12. let result = []
  13. height = Math.max(+height, 100)
  14. count = Math.max(+count, 50)
  15. let diffLng = Math.abs(startPosition.lng - endPosition.lng)
  16. let diffLat = Math.abs(startPosition.lat - endPosition.lat)
  17. let L = Math.max(diffLng, diffLat)
  18. let dlt = L / count
  19. if (diffLng > diffLat) {
  20. //base on lng
  21. let delLat = (endPosition.lat - startPosition.lat) / count
  22. if (startPosition.lng - endPosition.lng > 0) {
  23. dlt = -dlt
  24. }
  25. for (let i = 0; i < count; i++) {
  26. let h =
  27. height -
  28. (Math.pow(-0.5 * L + Math.abs(dlt) * i, 2) * 4 * height) /
  29. Math.pow(L, 2)
  30. let lng = startPosition.lng + dlt * i
  31. let lat = startPosition.lat + delLat * i
  32. result.push([lng, lat, h])
  33. }
  34. } else {
  35. //base on lat
  36. let delLng = (endPosition.lng - startPosition.lng) / count
  37. if (startPosition.lat - endPosition.lat > 0) {
  38. dlt = -dlt
  39. }
  40. for (let i = 0; i < count; i++) {
  41. let h =
  42. height -
  43. (Math.pow(-0.5 * L + Math.abs(dlt) * i, 2) * 4 * height) /
  44. Math.pow(L, 2)
  45. let lng = startPosition.lng + delLng * i
  46. let lat = startPosition.lat + dlt * i
  47. result.push([lng, lat, h])
  48. }
  49. }
  50. result.push([endPosition.lng, endPosition.lat, endPosition.alt || 0])
  51. return result
  52. }