实现四个点的贝塞尔曲线

作业描述:

• bezier:该函数实现绘制 Bézier 曲线的功能。它使用一个控制点序列和一个 OpenCV::Mat 对象作为输入,没有返回值。它会使 t 在 0 到 1 的范围内进 行迭代,并在每次迭代中使 t 增加一个微小值。对于每个需要计算的 t,将 调用另一个函数 recursive_bezier,然后该函数将返回在 Bézier 曲线上 t 处的点。最后,将返回的点绘制在 OpenCV ::Mat 对象上。

• recursive_bezier:该函数使用一个控制点序列和一个浮点数 t 作为输入, 实现 de Casteljau 算法来返回 Bézier 曲线上对应点的坐标

bezier()

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t)
{
// TODO: Implement de Casteljau's algorithm
cv::Point2f res = {0, 0};
// 给定n+1个点
int n = control_points.size() - 1, i = 0;
for(int i = 0; i < n + 1; i++){
// C(n,i)=A(n,i)/i!=n(n-1)(n-2)(n-i+1)/i!
float Cni = 1;
for(int k = n; k > n - i; k--) Cni *= k;
for(int k = 2; k < i + 1; k++) Cni /= k; // sum(bi * Bni(t)) = bi * B(ni)(t) = bi * C(ni) * t^i * (1-t)^n-i
res += control_points[i] * Cni * pow(t, i) * pow(1 - t, n - i);
}
return res;
}

recursive_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.
for(float t = 0; t < 1; t += 0.001){
auto point = recursive_bezier(control_points, t);
window.at<cv::Vec3b>(point.y, point.x)[1] = 255;
}
}

随机推荐

  1. java如何保证一个方法只能执行一次

    我们经常会遇到一些情况需要某一个方法或者操作只执行一次,比如说配置信息加载,如果配置信息需要动态刷新,这个不在适用范围.下面列举几种方式 第一种 如果是web容器,可以使用servlet或者Liste ...

  2. freertos学习笔记(十)事件标志组

    事件标志组 相当于用户平时定义的Flag,事件标志,不过freertos支持将该标志组作为启动task的条件 概述 分为8位和24位的模式(通过设置宏来配置) 每一位有0和1两个状态 用法 用于平常程 ...

  3. Docker 导出容器 / 镜像

    有时由于镜像大小.网络限制等原因,我们不能将本地制作的容器 / 镜像上传到公共容器注册表.此时我们可以选择将镜像以本地文件的形式导出. 导入 / 导出容器 docker export "CO ...

  4. 使用 setenv 配置文件管理 Tomcat 的自定义环境变量

    1.背景描述 有时候,我们会在 catalina.bat 或 catalina.sh 文件中,自定义一些环境变量,例如额外指定 JDK 路径或设置 JVM 参数. 实际上,直接在 catalina.b ...

  5. CentOS 7 yum无法使用解决方法Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=

    在centos7中使用yum命令时候报错: Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http: ...

  6. opencv equalizeHist

    ''' What are histograms? Histograms are collected counts of data organized into a set of predefined ...

  7. ES6之常用开发知识点:let 和 const 命令详解(二)

    let命令 基本用法 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 根据上面结果显示,let声明的变 ...

  8. webpack笔记-生产环境与开发环境常用plugin介绍(五)

    mode 和 plugin 前边我们介绍 mode 时提过,mode 不同值会影响 webpack 构建配置,其中有一个就是会启用 DefinePlugin 来设置process.env.NODE_E ...

  9. Visual Studio & VS Code

    前言 会写这篇是因为想记入一个 bug. 随便以后记入一些 Visual Studio 和 VS Code 相关的冬冬呗. 当 VS Code Hot Reload 遇上 View Component ...

  10. 2024.7.5-2024.7.20 HA省学会集训游记(焦作一中)

    这是一篇长篇小说 DAY1 除了DAY4-DAY5个别内容以外,这些都是补的,但是全写完有太多了qwq,挑题写了 树状数组和线段树基础 很多都是一些模板题,太模板的题不再做太多解释 题目: P4062 ...