GAMES101 作业4——绘制贝塞尔曲线
【摘要】 作业描述贝塞尔曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实现de Casteljau 算法来绘制由 4 个控制点表示的 Bézier 曲线 (当你正确实现该算法时,你可以支持绘制由更多点来控制的BézierBzier 曲线)。而在本次实验中,你需要完成的任务是:bezier:该函数实现绘制BézierBeˊzier 曲线的功能。它使用一个控制点序列和一个 OpenCV::Ma...
作业描述
贝塞尔曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实
现de Casteljau 算法来绘制由 4 个控制点表示的 Bézier 曲线 (当你正确实现该算法时,你可以支持绘制由更多点来控制的BézierBzier 曲线)。
而在本次实验中,你需要完成的任务是:
- bezier:该函数实现绘制BézierBeˊzier 曲线的功能。它使用一个控制点序列和一个 OpenCV::Mat 对象作为输入,没有返回值。它会使 t 在 0 到 1 的范围内进 行迭代,并在每次迭代中使 t 增加一个微小值。对于每个需要计算的 t,将调用另一个函数 recursive_bezier,然后该函数将返回在贝塞尔曲线上 t 处的点。最后,将返回的点绘制在 OpenCV::Mat 对象上。
- recursive_bezier:该函数使用一个控制点序列和一个浮点数 t 作为输入,实现de Casteljau算法来返回曲线上对应点的坐标。
1. bezier曲线入口函数
void bezier(const std::vector<cv::Point2f> &control_points, cv::Mat &window) {
// Iterate through all t = 0 to t = 1 with small steps, and call de Casteljau's
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;
}
}
2. recursive_bezier对 de Casteljau算法的实现
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) {
// Implement de Casteljau's algorithm
std::vector<cv::Point2f> points = control_points;
//当序列大于三个点时会继续迭代
while (points.size() >= 3) {
std::vector<cv::Point2f> points_temp;
for (int i = 0; i < points.size() - 1; ++i) {
cv::Point2f first = points[i];
cv::Point2f second = points[i + 1];
cv::Point2f mid = (1 - t) * first + t * second;
points_temp.push_back(mid);
}
points = points_temp;
}
cv::Point2f start = points[0];
cv::Point2f end = points[points.size() - 1];
cv::Point2f mid = (1 - t) * start + t * end;
return mid;
}
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)