Games101-Homework4

本章内容

本章讲述Games101的作业4,主要涉及几何的贝塞尔曲线部分。

基础部分

实现

  • [20 分] De Casteljau 算法: 对于给定的控制点,你的代码能够产生正确的 Bézier 曲线,比较简单,直接利用递归计算点即可。

代码

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
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
// TODO: Implement de Casteljau's algorithm
if (control_points.size() == 1) return control_points[0];

std::vector<cv::Point2f> new_points;
for (int i = 1; i < control_points.size(); i++)
{
//t比例下的贝塞尔点
auto point = (1.0f - t) * control_points[i - 1] + t * control_points[i];
new_points.emplace_back(point);
}
return recursive_bezier(new_points, 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.

for (double t = 0.0; t <= 1.0; t += 0.001)
{
auto point = recursive_bezier(control_points, t);
window.at<cv::Vec3b>(point.y, point.x)[1] = 255;
}
}

运行结果

提高部分

实现

  • [5 分] 奖励分数: 实现对 Bézier 曲线的反走样。(对于一个曲线上的点,不只把它对应于一个像素,你需要根据到像素中心的距离来考虑与它相邻的像素的颜色。)

代码

运行结果

遇到的问题