理论回顾
计算方法
- 解析式法
用二项展开的方法计算各个系数
- 递归法
每次递归计算插值后的新顶点
凸包性质
凸包在游戏开发里面的一个应用是:可以通过生成模型的凸包分解,来获得碰撞检测的区域范围
代码展示
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t)
{
//TODO: Implement de Casteljau's algorithm
int sz=control_points.size();
if(sz==2){
return cv::Point2f(control_points[0]*t+(1-t)*control_points[1]);
}else{
auto begin_it=control_points.begin();
auto end_it=control_points.end();
std::vector<cv::Point2f> points;
for (int i = 1; i < sz; ++i) {
auto tmp=cv::Point2f(control_points[i-1]*t+(1-t)*control_points[i]);
points.push_back(tmp);
}
return recursive_bezier(points,t);
}
}
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.
for (double t = 0.0; t <= 1.0; t += 0.001) {
auto point = recursive_bezier(control_points,t);
window.at<cv::Vec3b>(point.y, point.x)[2] = 255;
}
}