CatmullRom.cpp 881 B

123456789101112131415161718192021222324
  1. #include "CatmullRom.h"
  2. USING_NS_BF;
  3. PointF Beefy::CatmullRomEvaluate(PointF &p0, PointF &p1, PointF &p2, PointF &p3, float tension, float t)
  4. {
  5. float t2 = t * t;
  6. float t3 = t2 * t;
  7. /*
  8. * Formula: s(-ttt + 2tt - t)P1 + s(-ttt + tt)P2 + (2ttt - 3tt + 1)P2 + s(ttt - 2tt + t)P3 + (-2ttt + 3tt)P3 + s(ttt - tt)P4
  9. */
  10. float s = (1 - tension) / 2;
  11. float b1 = s * ((-t3 + (2 * t2)) - t); // s(-t3 + 2 t2 - t)P1
  12. float b2 = s * (-t3 + t2) + (2 * t3 - 3 * t2 + 1); // s(-t3 + t2)P2 + (2 t3 - 3 t2 + 1)P2
  13. float b3 = s * (t3 - 2 * t2 + t) + (-2 * t3 + 3 * t2); // s(t3 - 2 t2 + t)P3 + (-2 t3 + 3 t2)P3
  14. float b4 = s * (t3 - t2); // s(t3 - t2)P4
  15. float x = (p0.x*b1 + p1.x*b2 + p2.x*b3 + p3.x*b4);
  16. float y = (p0.y*b1 + p1.y*b2 + p2.y*b3 + p3.y*b4);
  17. return PointF(x,y);
  18. }