QT 绘制多阶贝塞尔曲线bezier

#include "bezierline.h"BezierLine::BezierLine(QWidget *parent)
{this->setParent(parent);/*阶数 : 公式order = 2: P = (1-t)^2*P0 + 2(1-t)*t*P1 + t^2*P2order = 3: P = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3order = 4: P = (1-t)^4*P0 + 4(1-t)^3*t*P1 + 6(1-t)^2*t^2*P2 + 4(1-t)*t^3*P3 + t^4*P4order = 5: P = (1-t)^5*P0 + 5(1-t)^4*t*P1 + 10(1-t)^3*t^2*P2 + 10(1-t)^2*t^3*P3 + 5(1-t)*t^4*P4 + t^5*P5order = 6: P = (1-t)^6*P0 + 6(1-t)^5*t*P1 + 15(1-t)^4*t^2*P2 + 20(1-t)^3*t^3*P3 + 15(1-t)^2*t^4*P4 + 6(1-t)*t^5*P5 + t^6*P6系数 杨辉三角O=0:              1O=1:            1    1O=2:          1   2    1O=3:        1   3    3   1O=4:      1   4   6    4   1O=5:    1   5   10  10   5   1O=6:  1   6  15   20  15   6    1
*/
}void BezierLine::paintEvent(QPaintEvent *event)
{if(event->type() != QEvent::Paint){qDebug() << __FILE__ << __LINE__ <<  event->type();return;}QPainter painter(this);//    bezierOrder2(painter);
//    bezierOrder3(painter);
//    bezierOrder4(painter);bezierOrder6(painter);
}void BezierLine::bezierOrder2(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100),V2(100,50),V3(150,50);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t =  i * step;Q1 = (1-t)*(1-t)*V1 + 2* t* (1-t) * V2+ t*t*V3;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}void BezierLine::bezierOrder3(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100),V2(100,50),V3(150,50),V4(150,100);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t =  i * step;Q1 = (1-t)*(1-t)*(1-t)*V1 + 3* (1-t) * (1-t) * t * V2+ 3*(1-t) *t*t *V3 + t*t*t*V4;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}void BezierLine::bezierOrder4(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100);QVector2D V2(100,50);QVector2D V3(150,50);QVector2D V4(150,100);QVector2D V5(125,75);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t =  i * step;Q1 = (1-t)*(1-t)*(1-t)*(1-t)*V1 + 4*(1-t)*(1-t)*(1-t)*t*V2+ 6*(1-t)*(1-t) *t*t *V3 + 4*(1-t)* t*t*t*V4 + t*t*t*t *V5;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}void BezierLine::bezierOrder6(QPainter & painter)
{double t = 0;int number = 100;double step = 1.0 / number;QVector2D V1(100,100);QVector2D V2(100, 50);QVector2D V3(150, 50);QVector2D V4(200, 150);QVector2D V5(250, 50);QVector2D V6(300, 50);QVector2D V7(300, 100);QVector2D Q1;QPointF * arr;arr = new QPointF[number+1];int i = 0;for(i=0; i <= number; i++){t =  i * step;Q1 = (1-t)*(1-t)*(1-t)*(1-t)*(1-t)*(1-t)*V1 +  \6*(1-t)*(1-t)*(1-t)*(1-t)*(1-t)*t*V2  + \15*(1-t)*(1-t)*(1-t)*(1-t)*t*t*V3 + \20*(1-t)*(1-t)*(1-t)*t*t*t*V4 + \15*(1-t)*(1-t)*t*t*t*t*V5 + \6*(1-t)*t*t*t*t*t*V6 + \t*t*t*t*t*t*V7;arr[i].setX(Q1.x());arr[i].setY(Q1.y());}painter.drawPolyline(arr,number);delete []arr;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arthas常见使用姿势

文章目录 Arthas常见使用姿势官网基本命令通用参数解释表达式核心变量说明常用命令一些常用特殊案例举例其他技巧关于OGNLOGNL的常见使用OGNL的一些特殊用法与说明OGNL内置的虚拟属性OGNL的个人思考OGNL的杂碎&#xff0c;收集未做验证 Arthas常见使用姿势 官网 https://arth…

基于FPGA的DDS信号发生器

前言 此处仅为基于Vivado实现DDS信号发生器的仿真实现&#xff0c;Vivado的安装请看下面的文章&#xff0c;这里我只是安装了一个标准版本&#xff0c;只要能够仿真波形即可。 FPGA开发Vivado安装教程_vivado安装 csdn-CSDN博客 DDS原理 DDS技术是一种通过数字计算生成波形…

Pandas_DataFrame读写详解:案例解析(第24天)

系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、 读写文…

Web 基础与 HTTP 协议

Web 基础与 HTTP 协议 一、Web 基础1.1域名和 DNS域名的概念Hosts 文件DNS&#xff08;Domain Name System 域名系统&#xff09;域名注册 1.2网页与 HTML网页概述HTML 概述网站和主页Web1.0 与 Web2.0 1.3静态网页与动态网页静态网页动态网页 二、HTTP 协议1.1HTTP 协议概述1.…

秋招——MySQL补充——MySQL是如何加行级锁

文章目录 引言正文什么SQL语句会加行级锁查询操作增加对应的行级锁事务的写法 update和delete修改操作也会增加行级锁 行级锁有哪些种类记录锁间隙锁Next-Key锁 MySQL是如何加行级锁&#xff1f;唯一索引等值查询查询记录是存在的查询记录是不存在的 唯一索引范围查找针对大于或…

《梦醒蝶飞:释放Excel函数与公式的力量》8.4 COUNTIF函数

8.4 COUNTIF函数 COUNTIF函数是Excel中常用的统计函数之一&#xff0c;用于统计指定条件下的单元格数量。通过COUNTIF函数&#xff0c;我们可以轻松地对数据进行条件筛选和统计分析。下面将从函数简介、语法、基本用法、注意事项、高级应用、实战练习和小节几个方面展开介绍。…

爬虫笔记19——代理IP的使用

访问网站时IP被阻止 有些网站会设置特定规则来限制用户的访问&#xff0c;例如频率限制、单一账户多次登录等。 网站为了保护自身安全和用户体验&#xff0c;会设置防御机制&#xff0c;将涉嫌恶意行为的IP地址加入黑名单并屏蔽访问。如果用户在使用网站时违反了这些规则&…

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别

面对硬盘、U盘或移动硬盘的格式化决策&#xff0c;NTFS与exFAT作为主流的文件系统&#xff0c;用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT&#xff0c;格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…

十四、【源码】@Autowired、@Value、@Component

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/14-auto-property Autowired、Value、Component 注解注入属性的实现分散在refresh容器的各个方法中&#xff0c;梳理&#x…

玩转springboot之springboot使用外置tomcat进行运行

使用外置tomcat进行运行 springboot中是集成了tomcat容器的&#xff0c;如果我们不想使用springboot所集成的tomcat&#xff0c;而想要使用自己的Tomcat外部容器&#xff0c;该怎么做呢&#xff1f; 首先&#xff0c;需要更改打包方式&#xff0c;之前是打成jar包&#xff0c;现…

docker 搭建 AI大数据模型 --- 使用GPU

docker 搭建 AI大数据模型 — 使用GPU方式 搭建本地大模型&#xff0c;最简单的方法&#xff01;效果直逼GPT 服务器GPU系统HP580 G8P40Rocky9.2 安装程序AnythingLLM前端界面Open WebUIChatOllamaollama 一、AnythingLLM 介绍 AnythingLLM 是 Mintplex Labs Inc. 开发的一…

面试官:Rocketmq是推消息还是拉消息

RocketMQ消息模型 核心模型&#xff1a;RocketMQ本质上是基于拉模式的。长轮询技术&#xff1a;使用长轮询技术&#xff0c;减少了拉取消息的延迟&#xff0c;同时保持了拉模式的控制优势。 长轮询技术详解 工作原理&#xff1a; 请求保持开放&#xff1a;消费者向服务器发出…

MySQL 聚集索引与非聚集索引的概念以及优缺点

概念介绍&#xff1a; 聚集索引&#xff08;Clustered Index&#xff09;&#xff1a; 定义&#xff1a;聚集索引是一种数据存储方式&#xff0c;数据表中主键记录按照索引的顺序进行物理排序。每个表只能有一个聚集索引&#xff0c;因为数据物理上只能排序一次。实现&#x…

FreeDOS 已经30岁了

1994 年 6 月&#xff0c;微软发布了其 DOS 操作系统的最后一个版本 MS-DOS 6.22。 程序员 Jim Hall 对微软的 Windows 3.x 以及后来的 Windows 95 都不满意不感兴趣&#xff0c;他希望创建一个公共领域的 DOS 兼容系统&#xff0c;在越来越多的人拥抱图形用户界面的时代维持传…

9.(vue3.x+vite)修改el-input,el-data-picker样式

效果预览 二:相关代码 <template><div style="padding: 50px"><el-input placeholder="请输入模型名称" style="width: 260px" /><br /

Java灵活用工2.0报价单微信小程序+APP+微信公众号 源码

&#x1f680;【开篇&#xff1a;解锁灵活用工的高效时代】 在人力资源市场日益灵活的今天&#xff0c;如何快速、准确地生成报价单&#xff0c;成为企业吸引并管理自由职业者的关键。而“灵活用工报价单微信小程序APP微信公众号源码”正是这样一款集高效、便捷于一体的解决方…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…

YOLO-V2

一、V2版本细节升级 1、YOLO-V2&#xff1a; 更快&#xff01;更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout&#xff0c;卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化&#xff0c;收敛相对更容易经过Batch Norma…

【C++】相机标定源码笔记- RGB 相机与 ToF 深度传感器校准类

类的设计目标是为了实现 RGB 相机与 ToF 深度传感器之间的高精度校准&#xff0c;从而使两种类型的数据能够在同一个坐标框架内被整合使用。这在很多场景下都是非常有用的&#xff0c;比如在3D重建、增强现实、机器人导航等应用中&#xff0c;能够提供更丰富的场景信息。 -----…

MySQL锁机制详细笔记

1. MySQL锁的基本概念 共享锁&#xff08;Shared Lock&#xff09;&#xff1a;允许多个事务读取同一数据&#xff0c;不阻塞其他读操作。排它锁&#xff08;Exclusive Lock&#xff09;&#xff1a;写锁&#xff0c;阻塞其他读写操作。 2. 锁的分类 全局锁&#xff1a;锁定…