QT实现单个控制点在曲线上的贝塞尔曲线

最终效果:
在这里插入图片描述
一共三个文件
main.cpp

#include <QApplication>
#include "SplineBoard.h"
int main(int argc,char** argv) {QApplication a(argc, argv);SplineBoard b;b.setWindowTitle("标准的贝塞尔曲线");b.show();SplineBoard b2(0.0001);b2.show();b2.setWindowTitle("控制点在曲线上的贝塞尔曲线");b.move(0,0);b2.move(800,0);return a.exec();
}

SplineBoard.h

#ifndef SPLINEBOARD_H
#define SPLINEBOARD_H
#include <QPainter>
#include <QWidget>
class SplineBoard:public QWidget
{Q_OBJECT
public:SplineBoard(double terminalRatio = 0.25);protected:void mouseMoveEvent(QMouseEvent* e);void mousePressEvent(QMouseEvent* e);void mouseReleaseEvent(QMouseEvent* e);void paintEvent(QPaintEvent* e);int mPressedPos;QPointF mStart;QPointF mEnd;QPointF mCont;const double termRatio;
};#endif // SPLINEBOARD_H

SplineBoard.cpp

#include "SplineBoard.h"
#include <QDebug>
#include <QMouseEvent>
#include <QPainterPath>static int radius = 8;
static const int PosEmpty = 0;
static const int PosStart = 1;
static const int PosCont = 2;
static const int PosEnd = 4;static void buildQuadBezier(QPainterPath& pp, const QPointF& p0,const QPointF& p1,const QPointF& p2, qreal term){pp.moveTo(p0);const qreal a = (term-0.5)*-4;const qreal d = (1-2*term)*-4;for (qreal t = 0; t < 1.01; t += 0.01) {qreal A = a*t*t+(-1-a)*t+1;qreal B = d*t*t - d*t;qreal C = a*t*t + (1-a)*t;qreal x = A * p0.x() + B * p1.x() + C * p2.x();qreal y = A * p0.y() + B * p1.y() + C * p2.y();pp.lineTo(x, y);}
}
SplineBoard::SplineBoard(double terminalRatio):mPressedPos(PosEmpty),termRatio(terminalRatio)
{resize(800,600);setWindowTitle("spline board");mStart = QPointF(50,300);mEnd = QPointF(750,300);mCont = QPointF(400,300);
}void SplineBoard::mouseMoveEvent(QMouseEvent* e){auto cur = e->pos();if(mPressedPos == PosStart){mStart = cur;}else if(mPressedPos == PosCont){mCont = cur;}else if(PosEnd == mPressedPos){mEnd = cur;}else{return;}update();
}
void SplineBoard::mousePressEvent(QMouseEvent* e){auto pos = e->pos();auto startRect = QRectF(mStart,QSize(radius*2,radius*2));startRect.translate(-radius,-radius);auto contRect = QRectF(mCont,QSize(radius*2, radius*2));contRect.translate(-radius,-radius);auto endRect = QRectF(mEnd , QSize(radius*2, radius*2));endRect.translate(-radius,-radius);if(startRect.contains(pos)){mPressedPos = PosStart;}else if(contRect.contains(pos)) {mPressedPos = PosCont;}else if(endRect.contains(pos)){mPressedPos = PosEnd;}else{mPressedPos = PosEmpty;}}
void SplineBoard::mouseReleaseEvent(QMouseEvent* e){mPressedPos = PosEmpty;
}void SplineBoard::paintEvent(QPaintEvent* e){QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);QPen pen(Qt::blue);pen.setWidth(2);painter.setPen(pen);QPainterPath path;buildQuadBezier(path,mStart,mCont,mEnd,termRatio);painter.drawPath(path);painter.setPen(Qt::NoPen);painter.setBrush(Qt::magenta);painter.drawEllipse(mStart,radius,radius);  // Draw start pointpainter.drawEllipse(mCont, radius,radius);  // Draw control pointpainter.drawEllipse(mEnd, radius,radius);  // Draw end pointQWidget::paintEvent(e);}

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

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

相关文章

深入探索Python机器学习算法:监督学习(线性回归,逻辑回归,决策树与随机森林,支持向量机,K近邻算法)

文章目录 深入探索Python机器学习算法&#xff1a;监督学习一、线性回归二、逻辑回归三、决策树与随机森林四、支持向量机五、K近邻算法 深入探索Python机器学习算法&#xff1a;监督学习 在机器学习领域&#xff0c;Python凭借其丰富的库和简洁的语法成为了众多数据科学家和机…

二、QT和驱动模块实现智能家居-----问题汇总1

1、文件地址改变后必须在QT下更改地址 2、指定了QT内Kits下的Sysroot头文件地址&#xff0c;但是还是找不到头文件&#xff1a; 3、提示无法执行QT程序&#xff1a;先干掉之前的QT程序 ps //查看程序PIDkill -9 PID 4、无法执行QT程序 1&#xff09;未设置环境变量 …

【Linux专栏_1】Linux中常用的指令

文章目录 前言1、查看Linux主机ip2、 Linux下的常用指令集合(1)、ls指令(2)、pwd指令(3)、cd指令(4)、touch指令(5)、mkdir指令(6)、rmdir和rm删除指令(7)、man指令(8)、cp指令(9)、mv指令(10)、cat指令(11)、more指令(12)、date指令(13)、cal指令(14)、find指令(15)、which指令…

Android+SpringBoot的老年人健康饮食小程序平台

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 我将从经济、生活节奏、技术融合等方面入手&#xff0c;详细阐述居家养老管理模式兴起的…

yoloV5的学习-pycharm版本

真的很让人气愤的一点&#xff0c;老师把我的pycharm给卸载了&#xff0c;我那个上面不仅有gpu-torch&#xff0c;还有gpu-torch&#xff0c;他给俺删了&#xff0c;删了很久&#xff0c;我心都碎了&#xff0c;过几天我就去找他负责&#xff0c;让他给我装回来我的环境&#x…

DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!

今天跟大家分享下我们如何将DeepSeek生成的VBA代码&#xff0c;做成按钮&#xff0c;将其永久保存在我们的Excel表格中&#xff0c;下次遇到类似的问题&#xff0c;直接在Excel中点击按钮&#xff0c;就能10秒搞定&#xff0c;操作也非常的简单. 一、代码准备 代码可以直接询问…

零信任架构和传统网络安全模式的

零信任到底是一个什么类型的模型&#xff1f;什么类型的思想或思路&#xff0c;它是如何实现的&#xff0c;我们要做零信任&#xff0c;需要考虑哪些问题&#xff1f; 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…

Leetcode 刷题记录 02 —— 双指针

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 移动零 02 盛最多水的容器 03 三数之和 04 接雨水 01 移动零 //双指针法 class Sol…

双碳战略下的智慧能源实践:安科瑞储能管理系统助力企业绿色转型

在全球碳中和目标加速推进的背景下&#xff0c;中国“十四五”规划明确提出构建以新能源为主体的新型电力系统&#xff0c;储能技术成为支撑能源结构转型的核心要素。安科瑞储能能量管理系统作为企业级智慧能源解决方案的核心载体&#xff0c;凭借其技术创新与场景适配能力&…

计算机组成与接口14

1.操作系统属于硬件物理机和软件虚拟机的分界层 2.当PE1时表示微处理器进入保护模式&#xff1b;当PE0时表示微处理器进入实地址模式 3.辅助存储器的概念&#xff1a;辅助存储器&#xff0c;也叫外存储器&#xff0c;读取速度最慢&#xff0c;容量最大&#xff0c;价格最低。…

k8s命名空间和资源配额

在现代的云计算环境中&#xff0c;容器化技术已成为主流。而 Kubernetes&#xff08;简称 k8s&#xff09;作为一项开源的容器编排系统&#xff0c;广泛应用于各类场景。本文将详细介绍关于 k8s 中的命名空间和资源配额&#xff0c;帮助你更好地理解和管理你的集群资源。 k8s …

matlab 包围盒中心匹配法实现点云粗配准

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果本文由CSDN点云侠原创,原文链接,首发于:20255年3月3日。 一、算法原理 1、原理概述 包围盒中心匹配法是将源点云 P P P

Mermaid语法介绍

一、基础语法 图表声明 使用 graph TD&#xff08;自上而下&#xff09;或 graph LR&#xff08;从左到右&#xff09;定义图表方向&#xff0c;节点间用箭头连接。例如&#xff1a; #mermaid-svg-WLayaaK0Ui6cKr5Z {font-family:"trebuchet ms",verdana,arial,sans…

小红书湖仓架构的跃迁之路

作者&#xff1a;李鹏霖(丁典)&#xff0c;小红书-研发工程师&#xff0c;StarRocks Contributor & Apache Impala Committer 本文整理自小红书工程师在 StarRocks 年度峰会上的分享&#xff0c;介绍了小红书自助分析平台中&#xff0c;StarRocks 与 Iceberg 结合后&#x…

Pycharm操作(二)设置字体大小

pycharm默认代码字体很小&#xff0c;看起来不方便&#xff0c;可以在设置里边设置字体大小。 1&#xff09;点击文件下拉菜单&#xff0c;选择设置选项&#xff1b; 2&#xff09;依次点击编辑器、字体&#xff0c;设置文字大小与行高&#xff0c;根据个人习惯进行设置&#…

Github 2025-03-03 开源项目周报Top14

根据Github Trendings的统计,本周(2025-03-03统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目4Jupyter Notebook项目3Go项目2JavaScript项目2C++项目2Vue项目1Rust项目1Dify.AI: 开源的LLM应用程序开发平台 创建…

音视频-WAV格式

1. WAV格式说明&#xff1a; 2. 格式说明&#xff1a; chunkId&#xff1a;通常是 “RIFF” 四个字节&#xff0c;用于标识文件类型。&#xff08;wav文件格式表示&#xff09;chunkSize&#xff1a;表示整个文件除了chunkId和chunkSize这 8 个字节外的其余部分的大小。Forma…

MySQL零基础教程14—子查询

子查询比较简单&#xff0c;我们还是通过案例引入。 有时候我们查询的时候&#xff0c;需要用到的不止一个表的数据&#xff0c;比如下面的场景&#xff1a; 查询名字叫李晓红同学的班主任姓名 我们提供三个表的基础信息如下&#xff1a; 从三张表的结构&#xff0c;我们不难…

爬虫系列之【数据解析之正则】《二》

目录 前言 一、正则基本使用 1.1 导包 1.2 接口方法 1.3 换行匹配问题 二、实战案例 完整代码 前言 在爬虫工作中&#xff0c;我们主要会遇到两种类型的文本数据&#xff1a; JSON格式数据 HTML文档数据 对于JSON字符串数据&#xff0c;通常使用Python的字典操作进行键…

新一代跨境电商ERP系统:从订单到发货的全流程自动化管理

随着全球电商市场的持续扩张&#xff0c;跨境电商卖家面临着多平台运营、国际物流、税务合规等复杂挑战。如何高效整合订单、库存、物流和财务数据&#xff0c;实现从客户下单到商品交付的无缝衔接&#xff0c;成为企业降本增效的关键。Zoho Books作为一款专为跨境商家设计的智…