首页 > 编程知识 正文

GAMES101作业04 Bézier 曲线包含公式和递归写法

时间:2023-05-05 18:38:25 阅读:254962 作者:4570

作业来自官网

知识点整理

文章目录 总览解答注意常规写法递归写法结果

总览

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

解答

直接代入公式即可,也可用递归解决(但是有公式为啥要递归呢)。

注意

window.at<cv::Vec3b>(point.y, point.x)[1] = 255;这里把绘制的点显示成绿色,然后最终打开main的注释,最终结果呈黄色。

常规写法 cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) { cv::Point2f p(0,0); p=control_points[0]*pow(1-t,3)+control_points[1]*pow(1-t,2)*t*3+control_points[2]*(1-t)*pow(t,2)*3+control_points[3]*pow(t,3); return p;}void bezier(const std::vector<cv::Point2f> &control_points, cv::Mat &window) { for(float t = 0;t<=1;t+=0.001f){ cv::Point2f point=recursive_bezier(control_points,t); window.at<cv::Vec3b>(point.y, point.x)[1] = 255; }} 递归写法

这个应该是支持好几个点的。

//另一个函数与上面一致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> control_points_new; for (int i = 1; i < control_points.size(); i++) { cv::Point2f p=(control_points[i]-control_points[i-1])*t+control_points[i-1]; control_points_new.push_back(p); } return recursive_bezier(control_points_new,t);} 结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。