#include "stdafx.h" #include "Bspline.h" CBspline::CBspline() { /* code */ } CBspline::CBspline(std::vectorpt) { /* 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::vectorrelevantPoint; std::vectorrelevantU; 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 vLength(m_nPoints); std::vector 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; } }