class BezierCurve { public: void add_control_point(const vec2& p) { control_points.push_back(p); } void deCastelijau(int resolution) { //todo... } void draw(device_t* device, const TGAColor& smp_color, const TGAColor& ctr_color = RED, bool drawControlPoints = true) { if (drawControlPoints) { for (int i = 0; i < control_points.size() - 1; ++i) { draw_line(control_points[i], control_points[i + 1], device, ctr_color); } } for (int i = 0; i < sample_points.size() - 1; ++i) { draw_line(sample_points[i], sample_points[i + 1], device, smp_color); } } private: vector<vec2> control_points; //控制点 vector<vec2> sample_points; //贝塞尔曲线上的点 };完善代码
时间: 2023-06-18 21:05:29 浏览: 48
以下是完整的代码:
```cpp
#include <vector>
#include "geometry.h"
#include "tgaimage.h"
using namespace std;
class BezierCurve {
public:
void add_control_point(const vec2& p) {
control_points.push_back(p);
}
void deCastelijau(int resolution) {
sample_points.clear();
if (control_points.size() < 2) return;
for (int i = 0; i <= resolution; ++i) {
float t = (float)i / (float)resolution;
vec2 point = deCastelijau(t, control_points);
sample_points.push_back(point);
}
}
void draw(device_t* device, const TGAColor& smp_color, const TGAColor& ctr_color = RED, bool drawControlPoints = true) {
if (drawControlPoints) {
for (int i = 0; i < control_points.size() - 1; ++i) {
draw_line(control_points[i], control_points[i + 1], device, ctr_color);
}
}
for (int i = 0; i < sample_points.size() - 1; ++i) {
draw_line(sample_points[i], sample_points[i + 1], device, smp_color);
}
}
private:
vector<vec2> control_points; //控制点
vector<vec2> sample_points; //贝塞尔曲线上的点
vec2 deCastelijau(float t, const vector<vec2>& points) {
if (points.size() == 1) return points[0];
vector<vec2> new_points;
for (int i = 0; i < points.size() - 1; ++i) {
vec2 point = (1.0f - t) * points[i] + t * points[i + 1];
new_points.push_back(point);
}
return deCastelijau(t, new_points);
}
};
```
这份代码实现了一个二次贝塞尔曲线的绘制,支持添加控制点、计算贝塞尔曲线上的点、绘制控制点和贝塞尔曲线等功能。
在 `deCastelijau` 函数中,使用递归的方式计算出贝塞尔曲线上的点。函数的输入参数 `t` 表示当前位置的参数值,`points` 是当前要计算的点集,函数的返回值是当前参数值对应的贝塞尔曲线上的点。
在 `draw` 函数中,先绘制控制点,再绘制贝塞尔曲线上的采样点。其中 `draw_line` 函数是一个封装好的线段绘制函数,可以根据设备类型 `device` 绘制直线。参数 `smp_color` 和 `ctr_color` 分别表示采样点和控制点的颜色,`drawControlPoints` 表示是否绘制控制点。
需要注意的是,这份代码只支持二次贝塞尔曲线,如果要支持更高阶的贝塞尔曲线,需要修改 `deCastelijau` 函数的实现。