Я пытаюсь отобразить зажатую кривую B-сплайна. (То есть кривая, где кривая начинается в первой контрольной точке и заканчивается в последней контрольной точке)
Вот входные данные:
Контрольные точки
Я пытаюсь отобразить зажатую кривую B-сплайна. (То есть кривая, где кривая начинается в первой контрольной точке и заканчивается в последней контрольной точке) Вот входные данные: Контрольные точки [code] xcp = { 5, 5, 16, 31, 22, 33, 44, 42, 51, 50, 59}; ycp = { 27, 12, 29, 18, 9, 9, 20, 29, 28, 10, 10}; [/code] Узлы [code] vknot = { 0.0, 0.0, 0.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 8.0, 8.0, 8.0}; [/code] Обратите внимание на повторяющиеся значения узлов в начале и конце — это то, что должно зажимать кривую. См. https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve.html Я попробовал реализовать описанный алгоритм здесь. https://mathworld.wolfram.com/B-Spline.html Вот мой код [code]#include #include #include #include #include #include
bool CSpline::getNextPoint(int &xp, int &yp) { // number of points drawn along curve const int Ndiv = 100; if (current == Ndiv) return false; double t = current / Ndiv; int degree = vknot.size() - xcp.size() - 1;
double x,y; x = y = 0; for (int i = 0; i < xcp.size(); i++) { double N = BSN(i, degree, t); x += xcp[i] * N; y += ycp[i] * N; }