GAMES101 作业4——绘制贝塞尔曲线

举报
lutianfei 发表于 2022/05/09 20:30:07 2022/05/09
【摘要】 作业描述贝塞尔曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实现de Casteljau 算法来绘制由 4 个控制点表示的 Bézier 曲线 (当你正确实现该算法时,你可以支持绘制由更多点来控制的BézierBzier 曲线)。而在本次实验中,你需要完成的任务是:bezier:该函数实现绘制BézierBeˊzier 曲线的功能。它使用一个控制点序列和一个 OpenCV::Ma...

作业描述
贝塞尔曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实
现de Casteljau 算法来绘制由 4 个控制点表示的 Bézier 曲线 (当你正确实现该算法时,你可以支持绘制由更多点来控制的BézierBzier 曲线)。

而在本次实验中,你需要完成的任务是:

  1. bezier:该函数实现绘制BézierBeˊzier 曲线的功能。它使用一个控制点序列和一个 OpenCV::Mat 对象作为输入,没有返回值。它会使 t 在 0 到 1 的范围内进 行迭代,并在每次迭代中使 t 增加一个微小值。对于每个需要计算的 t,将调用另一个函数 recursive_bezier,然后该函数将返回在贝塞尔曲线上 t 处的点。最后,将返回的点绘制在 OpenCV::Mat 对象上。
  2. 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。