Program Listing for File BezierCurve.cpp
↰ Return to documentation for file (src/LouLib/Paths/BezierCurve.cpp
)
#include "BezierCurve.hpp"
namespace LouLib {
namespace Paths {
BezierCurve::BezierCurve(const Math::Point2D &p0, const Math::Point2D &p1, const Math::Point2D &p2,
const Math::Point2D &p3) : P0(p0), P1(p1), P2(p2), P3(p3) {}
Math::Point2D BezierCurve::evaluate(double t) {
Units::Length x = 0_m;
Units::Length y = 0_m;
x += std::pow(1-t, 3) * P0.getX();
x += 3 * std::pow(1-t,2) * t * P1.getX();
x += 3 * (1-t) * std::pow(t, 2) * P2.getX();
x += std::pow(t, 3) * P3.getX();
y += std::pow(1-t, 3) * P0.getY();
y += 3 * std::pow(1-t,2) * t * P1.getY();
y += 3 * (1-t) * std::pow(t, 2) * P2.getY();
y += std::pow(t, 3) * P3.getY();
return Math::Point2D{x, y};
}
std::vector<Math::Point2D> BezierCurve::decompose(int n) {
std::vector<Math::Point2D> sol;
for(int i = 0; i < n; i++){
double t = (double)(i)/(double)(n-1);
sol.push_back(evaluate(t));
}
return sol;
}
} // LouLib
} // Paths