//介乘
int factrial(int factrialCount)
{
int factrialResult = 1; //声明一个long型的变量
if (factrialCount == 0) //0的阶乘为1
{
return 1;
}
for (int i = 2; i <= factrialCount; i++){ //求大于等于2的数的阶乘
factrialResult = factrialResult*i;
}
return factrialResult; //返回结果
}
//bezierPoints 贝塞尔曲线点的集合
//bezierControlPoints 贝塞尔曲线控制点的集合
//sectionNum 贝塞尔阶乘的冥次数
//bezierStep 贝塞尔曲线的点的个数
void makeUpBezierLine(float* bezierPoints, float* bezierControlPoints, int sectionNum, int bezierStep)
{
int sectionNumber = sectionNum - 1;
float factResArr[1000];//介乘结果的集合
for (int i = 0; i <= sectionNumber; i++){ //求0到n的阶乘
factResArr[i] = factrial(i);
}
//循环每个点
for (int i = 0; i <= bezierStep; i++)
{
//在bezier曲线上的节点的百分数
float bezierPercentFractor = float(i) / float(bezierStep);
if (bezierPercentFractor > 1)
{
bezierPercentFractor = 1;
}
float tka[1000];
float otka[1000];
for (int j = 0; j <= sectionNumber; j++)
{
//计算t的j次幂
tka[j] = (float)pow(bezierPercentFractor, j);
//计算1-t的j次幂
otka[j] = (float)pow(1.0 - bezierPercentFractor, j);
}
float xf = 0.0;
float yf = 0.0;
float zf = 0.0;
for (int k = 0; k <= sectionNumber; k++)
{
float xs = (factResArr[sectionNumber] / (factResArr[k] * factResArr[sectionNumber - k])) * tka[k] * otka[sectionNumber - k];
xf = xf + bezierControlPoints[k * 3] * xs;
yf = yf + bezierControlPoints[k * 3 + 1] * xs;
zf = zf + bezierControlPoints[k * 3 + 2] * xs;
}
bezierPoints[i * 3] = xf;
bezierPoints[i * 3 + 1] = yf;
bezierPoints[i * 3 + 2] = zf;
}
}