#include "stdafx.h"
|
#include "Bspline.h"
|
|
|
CBspline::CBspline() {
|
/* code */
|
|
}
|
|
CBspline::CBspline(std::vector<vec>pt) {
|
/* code */
|
int num = (int)(pt.size());
|
m_nPoints = num - 1;
|
|
if (num < 4) {
|
m_nNumber = num - 1;
|
}
|
else {
|
m_nNumber = 3;
|
}
|
|
m_vControlpoint.resize(num);
|
memcpy(&m_vControlpoint[0], &pt[0], num * sizeof(vec));
|
m_uData.resize(m_nPoints + m_nNumber + 2);
|
}
|
|
CBspline::~CBspline(void) {
|
/* code */
|
}
|
|
void CBspline::execute(void) {
|
/* code */
|
m_vPtResults.clear();
|
getNode();
|
|
std::vector<vec>relevantPoint;
|
std::vector<float>relevantU;
|
relevantPoint.resize(m_nNumber + 1);//Ïà¹Ø¿ØÖƶ¥µã
|
relevantU.resize(2 * m_nNumber);//Ïà¹Ø½ÚµãʸÁ¿
|
|
//Ïà¹Ø¿ØÖƶ¥µã¿½±´
|
float u = 0;
|
int i = m_nNumber; //m±íʾuÖµËùÔڵĽڵã,Ôò¿ØÖƶ¥µãΪm_controlpoint[i-k]\m_controlpoint[i]
|
float a = 0.0f;
|
int m = 0;
|
int n = 0;
|
int num = 0;
|
int sz = (int)(m_nNumber);
|
for (int j = 0; j < 500; j++) {
|
n = 0;
|
m = 0;
|
u = (float)(1.0f * j / 500);
|
|
if (u > m_uData[i + 1]) {
|
i++;
|
}
|
|
for (m = i - sz; m <= i; m++) {
|
relevantPoint[n] = m_vControlpoint[m];
|
n++;
|
}
|
|
//Ïà¹Ø½ÚµãʸÁ¿¿½±´
|
n = 0;
|
for (m = i - sz + 1; m <= i + sz; m++) {
|
relevantU[n] = m_uData[m];
|
n++;
|
}
|
//¿ªÊ¼²åÖµ¼Æ
|
num = (int)(relevantPoint.size());
|
for (n = 1; n < num; n++) {
|
for (m = 0; m < num - n; m++) {
|
a = relevantU[sz + m] - relevantU[m + n - 1];
|
if (fabs(a) < 1e-5) {
|
a = 0.0;
|
}
|
else {
|
a = (u - relevantU[m + n - 1]) / a;
|
}
|
relevantPoint[m] = (1 - a)*relevantPoint[m] + a*relevantPoint[m + 1];
|
}
|
}
|
m_vPtResults.push_back(relevantPoint[0]);
|
}
|
}
|
|
void CBspline::getNode(void) {
|
/* code */
|
int sz = (int)(m_nNumber);
|
for (int i = 0; i <= sz; i++) {
|
m_uData[i] = 0;
|
}
|
|
for (int i = 1; i <= sz + 1; i++) {
|
m_uData[i + m_nPoints] = 1;
|
}
|
|
hartley();
|
}
|
|
void CBspline::hartley(void) {
|
/* code */
|
std::vector<float> vLength(m_nPoints);
|
std::vector<float> vData;
|
vData.push_back(0.0);
|
|
vec fValue;
|
int fzNum = (int)(m_nPoints);
|
for (int i = 0; i < fzNum; i++) {
|
fValue = m_vControlpoint[i + 1] - m_vControlpoint[i];
|
vLength[i] = len(fValue);
|
}
|
|
float sum = 0.0f;
|
float fTemp = 0.0f;
|
int num = (int)(vLength.size());
|
int szNum = (int)(m_nNumber);
|
for (int i = 0; i <= num - szNum; i++) {
|
fTemp = 0;
|
for (int j = 0; j < szNum; j++) {
|
fTemp += vLength[i + j];
|
}
|
sum += fTemp;
|
vData.push_back(fTemp);
|
}
|
|
int count = (int)(vData.size());
|
for (int i = 1; i < count; i++) {
|
vData[i] = vData[i - 1] + vData[i];
|
m_uData[i + szNum] = vData[i] / sum;
|
}
|
}
|