作业来自官网
知识点整理
总览
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);} 结果