index.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { lineString } from "@turf/helpers";
  2. import { getGeom } from "@turf/invariant";
  3. import Spline from "./lib/spline.js";
  4. /**
  5. * Takes a {@link LineString|line} and returns a curved version
  6. * by applying a [Bezier spline](http://en.wikipedia.org/wiki/B%C3%A9zier_spline)
  7. * algorithm.
  8. *
  9. * The bezier spline implementation is by [Leszek Rybicki](http://leszek.rybicki.cc/).
  10. *
  11. * @name bezierSpline
  12. * @param {Feature<LineString>} line input LineString
  13. * @param {Object} [options={}] Optional parameters
  14. * @param {Object} [options.properties={}] Translate properties to output
  15. * @param {number} [options.resolution=10000] time in milliseconds between points
  16. * @param {number} [options.sharpness=0.85] a measure of how curvy the path should be between splines
  17. * @returns {Feature<LineString>} curved line
  18. * @example
  19. * var line = turf.lineString([
  20. * [-76.091308, 18.427501],
  21. * [-76.695556, 18.729501],
  22. * [-76.552734, 19.40443],
  23. * [-74.61914, 19.134789],
  24. * [-73.652343, 20.07657],
  25. * [-73.157958, 20.210656]
  26. * ]);
  27. *
  28. * var curved = turf.bezierSpline(line);
  29. *
  30. * //addToMap
  31. * var addToMap = [line, curved]
  32. * curved.properties = { stroke: '#0F0' };
  33. */
  34. function bezier(line, options) {
  35. if (options === void 0) { options = {}; }
  36. // Optional params
  37. var resolution = options.resolution || 10000;
  38. var sharpness = options.sharpness || 0.85;
  39. var coords = [];
  40. var points = getGeom(line).coordinates.map(function (pt) {
  41. return { x: pt[0], y: pt[1] };
  42. });
  43. var spline = new Spline({
  44. duration: resolution,
  45. points: points,
  46. sharpness: sharpness,
  47. });
  48. var pushCoord = function (time) {
  49. var pos = spline.pos(time);
  50. if (Math.floor(time / 100) % 2 === 0) {
  51. coords.push([pos.x, pos.y]);
  52. }
  53. };
  54. for (var i = 0; i < spline.duration; i += 10) {
  55. pushCoord(i);
  56. }
  57. pushCoord(spline.duration);
  58. return lineString(coords, options.properties);
  59. }
  60. export default bezier;