#pragma once
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
//Point的数据结构
typedef struct
{
float X;
float Y;
} PointF;
class Bezier {
public:
Bezier() = default;
PointF InterpolationFunc(float t, PointF* points, PointF* tmpPoint, int count);
void DrawBezierCurves(PointF* points, int count, PointF* out_points, int out_count);
};
#include "Curve.h"
PointF Bezier::InterpolationFunc(float t, PointF* points, PointF* tmpPoint, int count)
{
for (int i = 1; i < count; ++i)
{
for (int j = 0; j < count - i; ++j)
{
if (i == 1)
{
tmpPoint[j].X = (float)(points[j].X * (1 - t) + points[j + 1].X * t);
tmpPoint[j].Y = (float)(points[j].Y * (1 - t) + points[j + 1].Y * t);
continue;
}
tmpPoint[j].X = (float)(tmpPoint[j].X * (1 - t) + tmpPoint[j + 1].X * t);
tmpPoint[j].Y = (float)(tmpPoint[j].Y * (1 - t) + tmpPoint[j + 1].Y * t);
}
}
return tmpPoint[0];
}
void Bezier::DrawBezierCurves(PointF* points, int count, PointF* out_points, int out_count)
{
float step = 1.0 / out_count;
float t = 0;
PointF *tmpPoints = new PointF[count];
for (int i = 0; i < out_count; i++)
{
PointF temp_point = InterpolationFunc(t, points, tmpPoints, count); // 计算插值点
t += step;
out_points[i] = temp_point;
}
delete[] tmpPoints;
}
调用
Bezier calBz;
PointF in[3] = { {100,0},{200,200},{300,100} }; // 输入点
int num = 100; // 输出点数
PointF out[100]; // 输出点数组
calBz.DrawBezierCurves(in, 3, out, num);// 二阶贝塞尔曲线