三次B样条曲线C++代码
时间: 2024-02-19 11:03:36 浏览: 127
以下是一个简单的三次B样条曲线的C++代码示例:
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 三次B样条基函数
double B(int i, int k, double u, vector<double>& knots) {
double ui = knots[i];
double ui1 = knots[i + 1];
if (k == 0) {
if (u >= ui && u < ui1) {
return 1.0;
} else {
return 0.0;
}
} else {
double coef1 = (u - ui) / (ui + k - ui);
double coef2 = (ui1 + k - u) / (ui1 + k - ui);
return coef1 * B(i, k - 1, u, knots) + coef2 * B(i + 1, k - 1, u, knots);
}
}
// 三次B样条曲线
vector<pair<double, double>> cubicBsplines(vector<pair<double, double>>& controlPoints, int numSamples) {
int n = controlPoints.size() - 1;
int k = 3; // B样条的次数为3
vector<double> knots(n + k + 2);
for (int i = 0; i <= n + k + 1; i++) {
if (i < k) {
knots[i] = 0;
} else if (i > n) {
knots[i] = n - k + 2;
} else {
knots[i] = i - k + 1;
}
}
vector<pair<double, double>> curve(numSamples);
for (int i = 0; i < numSamples; i++) {
double u = knots[k] + (knots[n + 1] - knots[k]) * i / (numSamples - 1);
double x = 0.0;
double y = 0.0;
for (int j = 0; j <= n; j++) {
double basis = B(j, k, u, knots);
x += basis * controlPoints[j].first;
y += basis * controlPoints[j].second;
}
curve[i] = make_pair(x, y);
}
return curve;
}
int main() {
// 用一些控制点来定义三次B样条曲线
vector<pair<double, double>> controlPoints = {make_pair(0.0, 0.0), make_pair(1.0, 2.0), make_pair(3.0, 1.0), make_pair(4.0, 3.0)};
// 生成100个样本点
int numSamples = 100;
vector<pair<double, double>> curve = cubicBsplines(controlPoints, numSamples);
// 输出曲线上的所有点
for (int i = 0; i < numSamples; i++) {
cout << "(" << curve[i].first << ", " << curve[i].second << ")" << endl;
}
return 0;
}
```
这个代码示例定义了一个C++函数`cubicBsplines`,它接受一个包含控制点的向量和生成的样本点数作为输入,并返回一个包含生成的三次B样条曲线上所有点的向量。在函数内部,我们首先计算出B样条的节点向量,然后使用三次B样条基函数构造插值函数,最后对每个样本点计算出其在插值函数下的坐标。
阅读全文