作业要求

具体实现
- recursive_bezier()函数
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t)
{
// TODO: Implement de Casteljau's algorithm
std::vector<cv::Point2f> tmp,points = control_points;
cv::Point2f T;
while(points.size() != 1)
{
for(int i=0;i<points.size()-1;i++)
{
T.x = points[i].x + (points[i+1].x - points[i].x) * t;
T.y = points[i].y + (points[i+1].y - points[i].y) * t;
tmp.push_back(T);
}
points = tmp;
tmp.clear();
}
return points[0];
}
- 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.
cv::Point2f point;
for (double t = 0.0; t <= 1.0; t += 0.001)
{
point = recursive_bezier(control_points,t);
//设置成绿色
window.at<cv::Vec3b>(point.y, point.x)[1] = 255;
}
}
运行结果
- 注释掉main函数中的naive_bezier()函数的调用

- 去掉注释后

本文详细介绍了如何使用C++和OpenCV实现基于deCasteljau算法的递归_bezier函数来绘制贝塞尔曲线。bezier函数遍历t从0到1的所有小步骤,调用recursive_bezier计算每个点并将其显示在窗口上。代码中使用了OpenCV的Point2f结构体来处理坐标,并通过修改像素颜色展示曲线路径。

5万+

被折叠的 条评论
为什么被折叠?



