games101_Homework4

实现四个点的贝塞尔曲线

作业描述:

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

• recursive_bezier:该函数使用一个控制点序列和一个浮点数 t 作为输入, 实现 de Casteljau 算法来返回 Bézier 曲线上对应点的坐标

 bezier()

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
    // TODO: Implement de Casteljau's algorithm
    cv::Point2f res = {0, 0};
    // 给定n+1个点
    int n = control_points.size() - 1, i = 0;
    for(int i = 0; i < n + 1; i++){
        // C(n,i)=A(n,i)/i!=n(n-1)(n-2)(n-i+1)/i!
        float Cni = 1;
        for(int k = n; k > n - i; k--) Cni *= k;
        for(int k = 2; k < i + 1; k++) Cni /= k;

        // sum(bi * Bni(t)) = bi * B(ni)(t) = bi * C(ni) * t^i * (1-t)^n-i 
        res += control_points[i] * Cni * pow(t, i) * pow(1 - t, n - i);
    }
    return res;
}
View Code

recursive_bezier()

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(float t = 0; t < 1; t += 0.001){
        auto point = recursive_bezier(control_points, t);
        window.at<cv::Vec3b>(point.y, point.x)[1] = 255;
    }
}
View Code

 

posted @ 2024-03-02 23:51  七星易  阅读(10)  评论(0编辑  收藏  举报