///////////////////////////////////////////////////////////////////////////////
//  CBezier.cpp

#include <math.h>
#include "CBezier.h"

namespace math3d {

CBezier::CBezier()
{
}

CBezier::~CBezier()
{
}

float CBezier::Bernstein(int i, int n, float t)
{
	int a;

	int ns = 1;
	for (a = 1; a <= n; a++) ns *= a;

	int is = 1;
	for (a = 1; a <= i; a++) is *= a;

	int nis = 1;
	for (a = 1; a <= n - i; a++) nis *= a;

	return (static_cast<float>(ns) / (static_cast<float>(is) * static_cast<float>(nis))) *
		powf(t, static_cast<float>(i)) * powf(1.0f - t, static_cast<float>(n - i));
}

S2D CBezier::CalcBezier(const std::array<S2D, 4>& PosList, float Rate)
{
	S2D Result;

	for (int n = 0; n < 4; n++) {
		const float BernsteinRate = Bernstein(n, 4 - 1, Rate);

		Result += PosList[n] * BernsteinRate;
	}

	return Result;
}

}

