0x01 代码
#include <iostream>
#include <vector>
using namespace std;
struct Point {
double x;
double y;
};
Point getBezierPoint(vector<Point>& controlPoints, double t) {
double x = pow((1 - t), 3) * controlPoints[0].x +
3 * t * pow((1 - t), 2) * controlPoints[1].x +
3 * pow(t, 2) * (1 - t) * controlPoints[2].x +
pow(t, 3) * controlPoints[3].x;
double y = pow((1 - t), 3) * controlPoints[0].y +
3 * t * pow((1 - t), 2) * controlPoints[1].y +
3 * pow(t, 2) * (1 - t) * controlPoints[2].y +
pow(t, 3) * controlPoints[3].y;
Point p = {
x, y};
return p;
}
void recursiveDivide(vector<Point>& controlPoints, double t0, double t1,
vector<Point>& pointList, int& idx) {
if ((t1 - t0) < 1e-6) {
return;
}
double tMid = (t0 + t1) / 2.0;
Point pMid = getBezierPoint(controlPoints, tMid);
pointList[idx++] = pMid;
recursiveDivide(controlPoints, t0, tMid, pointList, idx);
recursiveDivide(controlPoints, tMid, t1, pointList, idx);
}
int main() {
vector<Point> controlPoints = {
{
10, 10}, {
50, 60}, {
100, 30}, {
150, 150}};
int N = 10;
vector<Point> pointList(N + 1);
pointList[0] = controlPoints.front();
pointList[N] = controlPoints.back();
int idx = 1;
recursiveDivide(controlPoints, 0.0, 1.0, pointList, idx);
for (auto& p : pointList) {
cout << "(" << p.x << ", " << p.y << ")" << endl;
}
return <