BezierCurve.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import { __extends } from "tslib";
  2. import Path from '../Path.js';
  3. import * as vec2 from '../../core/vector.js';
  4. import { quadraticSubdivide, cubicSubdivide, quadraticAt, cubicAt, quadraticDerivativeAt, cubicDerivativeAt } from '../../core/curve.js';
  5. var out = [];
  6. var BezierCurveShape = (function () {
  7. function BezierCurveShape() {
  8. this.x1 = 0;
  9. this.y1 = 0;
  10. this.x2 = 0;
  11. this.y2 = 0;
  12. this.cpx1 = 0;
  13. this.cpy1 = 0;
  14. this.percent = 1;
  15. }
  16. return BezierCurveShape;
  17. }());
  18. export { BezierCurveShape };
  19. function someVectorAt(shape, t, isTangent) {
  20. var cpx2 = shape.cpx2;
  21. var cpy2 = shape.cpy2;
  22. if (cpx2 != null || cpy2 != null) {
  23. return [
  24. (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t),
  25. (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t)
  26. ];
  27. }
  28. else {
  29. return [
  30. (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t),
  31. (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t)
  32. ];
  33. }
  34. }
  35. var BezierCurve = (function (_super) {
  36. __extends(BezierCurve, _super);
  37. function BezierCurve(opts) {
  38. return _super.call(this, opts) || this;
  39. }
  40. BezierCurve.prototype.getDefaultStyle = function () {
  41. return {
  42. stroke: '#000',
  43. fill: null
  44. };
  45. };
  46. BezierCurve.prototype.getDefaultShape = function () {
  47. return new BezierCurveShape();
  48. };
  49. BezierCurve.prototype.buildPath = function (ctx, shape) {
  50. var x1 = shape.x1;
  51. var y1 = shape.y1;
  52. var x2 = shape.x2;
  53. var y2 = shape.y2;
  54. var cpx1 = shape.cpx1;
  55. var cpy1 = shape.cpy1;
  56. var cpx2 = shape.cpx2;
  57. var cpy2 = shape.cpy2;
  58. var percent = shape.percent;
  59. if (percent === 0) {
  60. return;
  61. }
  62. ctx.moveTo(x1, y1);
  63. if (cpx2 == null || cpy2 == null) {
  64. if (percent < 1) {
  65. quadraticSubdivide(x1, cpx1, x2, percent, out);
  66. cpx1 = out[1];
  67. x2 = out[2];
  68. quadraticSubdivide(y1, cpy1, y2, percent, out);
  69. cpy1 = out[1];
  70. y2 = out[2];
  71. }
  72. ctx.quadraticCurveTo(cpx1, cpy1, x2, y2);
  73. }
  74. else {
  75. if (percent < 1) {
  76. cubicSubdivide(x1, cpx1, cpx2, x2, percent, out);
  77. cpx1 = out[1];
  78. cpx2 = out[2];
  79. x2 = out[3];
  80. cubicSubdivide(y1, cpy1, cpy2, y2, percent, out);
  81. cpy1 = out[1];
  82. cpy2 = out[2];
  83. y2 = out[3];
  84. }
  85. ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);
  86. }
  87. };
  88. BezierCurve.prototype.pointAt = function (t) {
  89. return someVectorAt(this.shape, t, false);
  90. };
  91. BezierCurve.prototype.tangentAt = function (t) {
  92. var p = someVectorAt(this.shape, t, true);
  93. return vec2.normalize(p, p);
  94. };
  95. return BezierCurve;
  96. }(Path));
  97. ;
  98. BezierCurve.prototype.type = 'bezier-curve';
  99. export default BezierCurve;