GraphicalCurve.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { PointF2D } from "../../Common/DataObjects/PointF2D";
  2. export class GraphicalCurve {
  3. private static bezierCurveStepSize: number = 1000;
  4. private static tPow3: number[];
  5. private static oneMinusTPow3: number[];
  6. private static bezierFactorOne: number[];
  7. private static bezierFactorTwo: number[];
  8. // Pre-calculate Curve-independend factors, to be used later in the Slur- and TieCurvePoints calculation.
  9. constructor() {
  10. GraphicalCurve.tPow3 = new Array(GraphicalCurve.bezierCurveStepSize);
  11. GraphicalCurve.oneMinusTPow3 = new Array(GraphicalCurve.bezierCurveStepSize);
  12. GraphicalCurve.bezierFactorOne = new Array(GraphicalCurve.bezierCurveStepSize);
  13. GraphicalCurve.bezierFactorTwo = new Array(GraphicalCurve.bezierCurveStepSize);
  14. for (let i: number = 0; i < GraphicalCurve.bezierCurveStepSize; i++) {
  15. const t: number = i / GraphicalCurve.bezierCurveStepSize;
  16. GraphicalCurve.tPow3[i] = Math.pow(t, 3);
  17. GraphicalCurve.oneMinusTPow3[i] = Math.pow((1 - t), 3);
  18. GraphicalCurve.bezierFactorOne[i] = 3 * Math.pow((1 - t), 2) * t;
  19. GraphicalCurve.bezierFactorTwo[i] = 3 * (1 - t) * Math.pow(t, 2);
  20. }
  21. }
  22. public bezierStartPt: PointF2D;
  23. public bezierStartControlPt: PointF2D;
  24. public bezierEndControlPt: PointF2D;
  25. public bezierEndPt: PointF2D;
  26. /**
  27. *
  28. * @param relativePosition
  29. */
  30. public calculateCurvePointAtIndex(relativePosition: number): PointF2D {
  31. const index: number = Math.round(relativePosition * GraphicalCurve.bezierCurveStepSize);
  32. if (index < 0 || index >= GraphicalCurve.bezierCurveStepSize) {
  33. return new PointF2D();
  34. }
  35. return new PointF2D( (GraphicalCurve.oneMinusTPow3[index] * this.bezierStartPt.x
  36. + GraphicalCurve.bezierFactorOne[index] * this.bezierStartControlPt.x
  37. + GraphicalCurve.bezierFactorTwo[index] * this.bezierEndControlPt.x
  38. + GraphicalCurve.tPow3[index] * this.bezierEndPt.x)
  39. , (GraphicalCurve.oneMinusTPow3[index] * this.bezierStartPt.y
  40. + GraphicalCurve.bezierFactorOne[index] * this.bezierStartControlPt.y
  41. + GraphicalCurve.bezierFactorTwo[index] * this.bezierEndControlPt.y + GraphicalCurve.tPow3[index] * this.bezierEndPt.y));
  42. }
  43. }