catmull-rom2bezier.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // http://schepers.cc/getting-to-the-point
  2. module.exports = function catmullRom2bezier(crp, z) {
  3. var d = [];
  4. for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {
  5. var p = [{
  6. x: +crp[i - 2],
  7. y: +crp[i - 1]
  8. }, {
  9. x: +crp[i],
  10. y: +crp[i + 1]
  11. }, {
  12. x: +crp[i + 2],
  13. y: +crp[i + 3]
  14. }, {
  15. x: +crp[i + 4],
  16. y: +crp[i + 5]
  17. }];
  18. if (z) {
  19. if (!i) {
  20. p[0] = {
  21. x: +crp[iLen - 2],
  22. y: +crp[iLen - 1]
  23. };
  24. } else if (iLen - 4 === i) {
  25. p[3] = {
  26. x: +crp[0],
  27. y: +crp[1]
  28. };
  29. } else if (iLen - 2 === i) {
  30. p[2] = {
  31. x: +crp[0],
  32. y: +crp[1]
  33. };
  34. p[3] = {
  35. x: +crp[2],
  36. y: +crp[3]
  37. };
  38. }
  39. } else {
  40. if (iLen - 4 === i) {
  41. p[3] = p[2];
  42. } else if (!i) {
  43. p[0] = {
  44. x: +crp[i],
  45. y: +crp[i + 1]
  46. };
  47. }
  48. }
  49. d.push(['C', (-p[0].x + 6 * p[1].x + p[2].x) / 6, (-p[0].y + 6 * p[1].y + p[2].y) / 6, (p[1].x + 6 * p[2].x - p[3].x) / 6, (p[1].y + 6 * p[2].y - p[3].y) / 6, p[2].x, p[2].y]);
  50. }
  51. return d;
  52. };