GAMES101 作业 4

文章描述了如何使用deCasteljau算法来生成和绘制Bézier曲线。首先,算法通过线性插值对控制点序列进行细分,然后递归地应用此过程直到只剩一个点。最后,通过在[0,1]范围内变化参数t,绘制出曲线。
摘要由CSDN通过智能技术生成

作业要求:

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


De Casteljau 算法说明如下:
1. 考虑一个 p 0 , p 1 , ... p n 为控制点序列的 Bézier 曲线。首先,将相邻的点连接起来以形成线段。
2. 用 t : (1 − t) 的比例细分每个线段,并找到该分割点。
3. 得到的分割点作为新的控制点序列,新序列的长度会减少一。
4. 如果序列只包含一个点,则返回该点并终止。否则,使用新的控制点序列并转到步骤 1。
使用 [0,1] 中的多个不同的 t 来执行上述算法,你就能得到相应的 Bézier 曲线。

第一步:
实现 de Casteljau 算法来返回 Bézier 曲线上对应点的坐标。

第二步:

实现绘制 Bézier 曲线的功能。

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
    if(control_points.size() == 2 )//只剩两点时为递归结束条件
        return t * control_points[1] + (1 - t) * control_points[0];
    
    std::vector<cv::Point2f> temp_control_points;

    for (int i=0; i<control_points.size() - 1; i++)
        temp_control_points.push_back((1 - t) * control_points[i] + t * control_points[i+1]);
    
    return recursive_bezier(temp_control_points, t);//递归
}
void bezier(const std::vector<cv::Point2f> &control_points, cv::Mat &window) 
{
    float t = 0.0;
    while(t <= 1.0)
    {
        auto point = recursive_bezier(control_points, t);//得到t情况下的一个点
        window.at<cv::Vec3b>(point.y, point.x)[1]= 255; //绘制贝塞尔*绿色*曲线
        t += 0.001;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值