GAMES101 Assignment4 (对应Lecture10-11)

课程作业框架来自GAMES

基础部分:

目标要求:需要实现de Casteljau 算法来绘制由4 个控制点表示的Bézier 曲线

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 贝塞尔递归
**/
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t)
{
// TODO: Implement de Casteljau's algorithm
int control_points_num = control_points.size();

if (control_points_num == 1)
{
cv::Point2f pix_center_point(0.5,0.5);
pix_center_point += (cv::Point2f) control_points[0];
return pix_center_point;
}
else
{
cv::Point2d left_bezier_point, right_bezier_point;
std::vector<cv::Point2f> left_control_points(&(control_points[0]), &(control_points[control_points_num - 1]));
std::vector<cv::Point2f> right_control_points(&(control_points[1]), &(control_points[control_points_num]));
left_bezier_point = recursive_bezier(left_control_points, t);
right_bezier_point = recursive_bezier(right_control_points, t);
return left_bezier_point * (1-t) + right_bezier_point*t;
}



}

void bezier(const std::vector<cv::Point2f> &control_points, cv::Mat &window)
{
// TODO: Iterate through all t = 0 to t = 1 with small steps, and call de Casteljau's
// recursive Bezier algorithm.
static cv::Point2f point;
for (double t = 0.0; t <= 1.0; t+=0.005)
{
point = recursive_bezier(control_points, t);
window.at<cv::Vec3b>(point.y, point.x)[1] = 255;
}

}