X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fbezier.cpp;fp=src%2Fbezier.cpp;h=15a5069a6703c08ec33841b82621176a0e99693c;hp=0000000000000000000000000000000000000000;hb=f59f24dff392428d7219ba2d6be5e1e81c344ee0;hpb=d3e941df79b54b698a5b8a1d4763346c4d6eb3d7 diff --git a/src/bezier.cpp b/src/bezier.cpp new file mode 100644 index 0000000..15a5069 --- /dev/null +++ b/src/bezier.cpp @@ -0,0 +1,48 @@ +#include "bezier.h" + +#include +#include + +using namespace std; + +namespace IPDF +{ + +/** + * Factorial + * Use dynamic programming / recursion + */ +int Factorial(int n) +{ + static unordered_map dp; + static bool init = false; + if (!init) + { + init = true; + dp[0] = 1; + } + auto it = dp.find(n); + if (it != dp.end()) + return it->second; + int result = n*Factorial(n-1); + dp[n] = result; + return result; +} + +/** + * Binomial coefficients + */ +int BinomialCoeff(int n, int k) +{ + return Factorial(n) / Factorial(k) / Factorial(n-k); +} + +/** + * Bernstein Basis Polynomial + */ +Real Bernstein(int k, int n, const Real & u) +{ + return Real(BinomialCoeff(n, k)) * pow(u, k) * pow(Real(1.0) - u, n-k); +} + +}