homework4: Bézier Curve

这篇博客介绍了如何利用递归法实现贝塞尔曲线的计算,特别是德卡斯特尔约算法。文章指出,贝塞尔曲线在游戏开发中可以用于模型的凸包分解,从而进行碰撞检测。还提供了C++代码示例,展示了如何通过递归计算每个插值点来绘制贝塞尔曲线。
摘要由CSDN通过智能技术生成

在这里插入图片描述

理论回顾

计算方法

  • 解析式法

在这里插入图片描述

用二项展开的方法计算各个系数

  • 递归法

在这里插入图片描述

每次递归计算插值后的新顶点

凸包性质

在这里插入图片描述

在这里插入图片描述

凸包在游戏开发里面的一个应用是:可以通过生成模型的凸包分解,来获得碰撞检测的区域范围

代码展示

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;
  }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值