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.pswp.cn/diannao/72328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72328.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

繪制思維導圖畫布選型

在實現思維導圖/知識圖譜的繪制時&#xff0c;選擇合適的「畫布」技術方案至關重要。以下是不同技術路線的對比分析和推薦方案&#xff1a; 一、技術方案對比 技術類型實現方式優點缺點適用場景普通DOM元素使用<div>CSS布局&#x1f539; 開發簡單&#x1f539; 天然支持…

運維Splunk面試題及參考答案

目錄 通過轉發器導入數據的優勢有哪些(如帶寬控制、負載均衡等) 描述 Universal Forwarder 與 Heavy Forwarder 的差異 如何配置轉發器實現數據的過濾與預處理 轉發器的本地緩存機制如何保證數據可靠性 如何通過部署服務器統一管理多個轉發器的配置 什么是 “查找表(L…

年后寒假總結及計劃安排

年后寒假總結 年后主要學習了微服務&#xff0c;nacos (服務注冊中心)&#xff0c;feign&#xff08;遠程調用&#xff09;&#xff0c;網關&#xff0c;雙token&#xff08;相較于之前更加規范&#xff0c;更加符合企業級&#xff09;&#xff0c;配置管理 &#xff0c;mybati…

word中交叉引用多篇參考文獻格式[1-2]或[1-4]操作

劃重點 更改左域名&#xff0c;輸入 \#"[0" 更改中間域名&#xff0c;輸入\#"" 更改右域名&#xff0c;輸入 \#"0]" 1.[2-3]格式 首先點擊交叉引用&#xff0c;引用參考文獻 右擊鼠標&#xff0c;點擊切換域代碼&#xff0c;對于左域名 刪除 * …

【銀河麒麟高級服務器操作系統】服務器測試業務耗時問題分析及處理全流程分享

更多銀河麒麟操作系統產品及技術討論&#xff0c;歡迎加入銀河麒麟操作系統官方論壇 https://forum.kylinos.cn 了解更多銀河麒麟操作系統全新產品&#xff0c;請點擊訪問 麒麟軟件產品專區&#xff1a;https://product.kylinos.cn 開發者專區&#xff1a;https://developer…

opencv 模板匹配方法匯總

在OpenCV中&#xff0c;模板匹配是一種在較大圖像中查找特定模板圖像位置的技術。OpenCV提供了多種模板匹配方法&#xff0c;通過cv2.matchTemplate函數實現&#xff0c;該函數支持的匹配方式主要有以下6種&#xff0c;下面詳細介紹每種方法的原理、特點和適用場景。 1. cv2.T…

NAT,代理服務,內網穿透

NAT 把報文的源IP替換為途徑路由器的WAN口IP NAPT 如何將數據從公網轉回給內網的主機&#xff1f;通過NAPT&#xff08;轉換表&#xff09;來實現&#xff0c;每次從內網到公網&#xff0c;公網到內網都會根據轉換表來進行 細節&#xff1a; NAT轉換時&#xff0c;值替換源…

大模型分布式訓練和優化

1. 分布式訓練概述 隨著語言模型參數量和所需訓練數據量的急速增長,單個機器上有限的資源已無法滿足大語言模型訓練的要求。因此,設計分布式訓練(Distributed Training)系統來解決海量的計算和內存資源需求問題變得至關重要。 分布式訓練是指將機器學習或深度學習模型訓練任…

第三方機構有哪些接口?

1&#xff0c;網銀接口。2&#xff0c;代扣接口。3&#xff0c;POS接口。4&#xff0c;快捷支付接口 1.網銀接口 第三方支付平臺連接網銀接口&#xff0c;進行支付跳轉時&#xff0c;第三方支付平臺充當了一個網關的角色&#xff0c;或者充當了銀行的代 理。 2.代扣接口 銀…

JUnit 版本影響 Bean 找不到

JUnit 版本影響 Bean 找不到 在為實現類編寫測試類時&#xff0c;在測試類中使用構造器注入 Bean 時&#xff0c;提示找不到 Bean&#xff0c;代碼如下&#xff1a; Service public class WeChatServiceImpl implements IWeChatService {Overridepublic String getNumber(Str…

夸父工具箱(安卓版) 手機超強工具箱

如今&#xff0c;人們的互聯網活動日益頻繁&#xff0c;導致手機內存即便頻繁清理&#xff0c;也會莫名其妙地迅速填滿&#xff0c;許多無用的垃圾信息悄然占據空間。那么&#xff0c;如何有效應對這一難題呢&#xff1f;答案就是今天新推出的這款工具軟件&#xff0c;它能從根…

《深度學習進階》第7集:深度實戰 通過訓練一個智能體玩游戲 來洞察 強化學習(RL)與決策系統

深度學習進階 | 第7集&#xff1a;深度實戰 通過訓練一個智能體玩游戲 來洞察 強化學習&#xff08;RL&#xff09;與決策系統 在深度學習的廣闊領域中&#xff0c;強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種獨特的范式&#xff0c;它通過智能體與環境…

Linux端口映射

1. 方法一使用firewalld 1.1 開啟偽裝IP firewall-cmd --permanent --add-masquerade 1.2 配置端口轉發&#xff0c;將到達本機的12345端口的訪問轉發到另一臺服務器的22端口 firewall-cmd --permanent --add-forward-portport12345:prototcp:toaddr192.168.172.131:toport…

文本處理Bert面試內容整理-BERT的基本原理是什么?

BERT(Bidirectional Encoder Representations from Transformers)的基本原理可以從以下幾個方面來理解: 1. 雙向上下文建模 BERT的一個核心創新是它通過雙向(bidirectional)建模上下文來理解詞語的意義。傳統的語言模型(如GPT)是單向的,即它們只考慮文本的左到右(或右…

MAC 本地搭建部署 dify(含 github訪問超時+Docker鏡像源拉取超時解決方案)

目錄 一、什么是 dify&#xff1f; 二、安裝 docker 1. 什么是 docker&#xff1f; 2. docker下載地址 三、安裝 dify 1. dify下載地址 2.可能遇到問題一&#xff1a; github訪問超時 3.下載后完成解壓 4.進入到 cmd 終端環境&#xff0c;執行下面三個命令 5.可能遇到…

USB3.0設備控制器驅動分析

一、USB驅動框架分析 USB控制器作為device的驅動框架分為&#xff1a;gadget Function驅動、gadget Function API、Composite以及UDC驅動。 gadget Function 驅動&#xff1a; 解釋&#xff1a;是針對 USB 設備特定功能的驅動程序。功能&#xff1a;負責實現 USB 設備對外提供的…

《Redis 入門指南:快速掌握高性能緩存技術》

目錄 一、準備工作 二、操作數據庫 2.1 切換數據庫 2.2 存儲和查看數據 一、存儲語法 二、一次性存儲多個鍵值對 三、追加值 四、查看值的類型 五、查詢值 六、一次查詢多個值 七、查看當下數據庫所有的鍵 八、刪除鍵 九、查看 鍵 是否存在 十、重命名鍵 2.3 過期…

跨部門溝通與團隊協作

【跨部門協作&#xff1a;破局之道在冰山之下】 感謝太原市組織部信任&#xff0c;上海財經大學邀約 今日為財務精英拆解《跨部門溝通與團隊協作》迷局。從本位思維到共同愿景&#xff0c;用因果回路圖透視沖突本質&#xff0c;當財務人開始用"延遲反饋"視角看預算博…

【零基礎到精通Java合集】第一集:Java開發環境搭建

以下是針對**“Java開發環境搭建”**的15分鐘課程內容設計,包含知識點拆分、實操演示與互動練習: 課程標題:Java開發環境搭建(15分鐘) 目標:完成JDK安裝、IDE配置并運行第一個Java程序 一、課程內容與時間分配 0-2分鐘 課程目標與前置準備 明確學習目標:JDK安裝、環境…

【JavaEE】wait 、notify和單例模式

【JavaEE】wait 、notify 和單例模式 一、引言一、wait()方法二、notify()方法三、notifyAll()方法四、wait&#xff08;&#xff09;和sleep&#xff08;&#xff09;對比五、單例模式5.1 餓漢模式5.2 懶漢模式5.2 懶漢模式-線程安全&#xff08;改進&#xff09; 博客結尾有此…