Games101作业四

作业0到作业3的代码

        这次是实现 de Casteljau 算法,以及绘制 Bezier 曲线,比上次简单

        核心思想就是递归,原理忘了就去看第十一节课,从15:00开始的        

GAMES101-现代计算机图形学入门-闫令琪

 代码

先实现贝塞尔曲线

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
    // 基线条件:当只剩一个控制点时,返回该点
    if(control_points.size() == 1) return control_points[0];
    
    // 创建下一级递归的控制点集合
    std::vector<cv::Point2f> next_control_points = {};
    
    // 对每对相邻控制点进行线性插值
    for(int i = 0; i < control_points.size() - 1; ++i) 
    {
        auto &a = control_points[i];       // 当前控制点
        auto &b = control_points[i + 1];   // 下一个控制点
        
        // 线性插值:a + t*(b - a) = (1-t)*a + t*b
        auto p = a + t * (b - a);
        
        // 将插值结果加入下一级控制点集合
        next_control_points.emplace_back(p);
    }
    
    // 递归调用,处理下一级控制点
    return recursive_bezier(next_control_points, t);
}

 绘制 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.
    // 遍历 t 从 0.0 到 1.0,每次增加 0.001
    for (double t = 0.0; t <= 1.0; t += 0.001) 
    {
        // 调用递归贝塞尔算法计算当前 t 对应的曲线点
        cv::Point2f point = recursive_bezier(control_points, t);
        
        // 在图像窗口的 (point.y, point.x) 位置设置绿色通道为255
        // OpenCV 中 Mat 的 at 方法是 (row, col) 即 (y, x)
        window.at<cv::Vec3b>(point.y, point.x)[1] = 255;
    }
}

效果

随便在窗口上点四个点生成相应贝塞尔曲线

内容概要:《机器人综合基础实践教程》(入门篇、提高篇)涵盖了机器人基础构建、编程控制、传感器应用等多个方面。教程从机械零件简介入手,逐步介绍主控板和编程环境的配置,随后通过一系列实验引导读者动手实践,包括驱动轮模块、双轮万向车、红外启动小车、带传动模块、履带机器人、红绿灯等实验。这些实验不仅帮助读者理解基本原理,还涉及高级应用如蓝牙电子温度计、语音识别、双轮小车平衡、蓝牙排爆机器人和WiFi视频排爆等。教程旨在培养读者的空间构型能力、编程技巧和综合调试能力,为机器人技术的实际应用打下坚实基础。 适用人群:具备一定编程基础和技术兴趣的学生、教师及爱好者,特别是对机器人技术感兴趣的初学者和中级学习者。 使用场景及目标:①帮助学生理解机器人基本原理,掌握机械零件组装和编程控制;②通过实际操作,提升编程和调试技能;③为机器人竞赛、项目开发和创新实践提供理论和实践指导;④培养创新思维和解决实际问题的能力。 其他说明:教程不仅提供详细的实验步骤和代码示例,还配有丰富的参考资料和光盘课件,确保学习者能够全面理解和掌握知识点。此外,教程强调实践操作的重要性,鼓励学习者通过动手实验加深理解,培养独立思考和解决问题的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值