SICP :讨论分层及封装性的又一极好例子。

.h文件


#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


    void Draw_Element(QPainter *p, QPoint point, float height);
    void Draw_Level_One(QPainter *p, QPoint point, float height);
    void Draw_Level_Two(QPainter *p, QPoint point, float height);
    void Draw_Level_Third(QPainter *p, QPoint point, float height);
    void Draw_Level_Four(QPainter *p, QPoint point, float height);
    void Draw_Level_Five(QPainter *p, QPoint point, float height);
private:
    Ui::Widget *ui;

    // QWidget interface
protected:

    virtual void paintEvent(QPaintEvent *event) override;

};
#endif // WIDGET_H

.cpp文件


#include "widget.h"
#include "ui_widget.h"

#include <QPaintEvent>
#include <QPainter>
#include <QPoint>
#include <QtMath>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::Draw_Element(QPainter* p,QPoint point,float height)
{
    // first point
    QPoint point_1 = point;

    // second point
    QPoint point_2 = QPoint(point_1.x() - (2 * height) / qSqrt(3),point_1.y() + height);

    // third point
    QPoint point_3 = QPoint(point_1.x() + (2 * height) / qSqrt(3),point_1.y() + height);

    p->drawLine(point_1,point_2);
    p->drawLine(point_2,point_3);
    p->drawLine(point_3,point_1);
}

void Widget::Draw_Level_One(QPainter* p,QPoint point,float height)
{
    // draw around triangle
    Draw_Element(p,point,height);

    // draw internal triangle
    QPoint point_1 = QPoint(point.x() - height / qSqrt(3),point.y() + height / 2);

    QPoint point_2 = QPoint(point.x() + height / qSqrt(3),point.y() + height / 2);

    QPoint point_3 = QPoint(point.x(),point.y() + height);

    p->drawLine(point_1,point_2);
    p->drawLine(point_2,point_3);
    p->drawLine(point_3,point_2);
    p->drawLine(point_3,point_1);

}

void Widget::Draw_Level_Two(QPainter* p,QPoint point,float height)
{
    // draw around triangle
    Draw_Element(p,point,height);

    // draw internal triangle
    QPoint point_1 = QPoint(point.x() - height / qSqrt(3),point.y() + height / 2);

    QPoint point_2 = QPoint(point.x() + height / qSqrt(3),point.y() + height / 2);

    QPoint point_3 = QPoint(point.x(),point.y() + height);

    // first triangle
    Draw_Level_One(p,point,height / 2);

    // second triangle
    Draw_Level_One(p,point_1,height / 2);

    // third triangle
    Draw_Level_One(p,point_2,height / 2);

}

void Widget::Draw_Level_Third(QPainter* p,QPoint point,float height)
{
    // draw around triangle
    Draw_Element(p,point,height);

    // draw internal triangle
    QPoint point_1 = QPoint(point.x() - height / qSqrt(3),point.y() + height / 2);

    QPoint point_2 = QPoint(point.x() + height / qSqrt(3),point.y() + height / 2);

    QPoint point_3 = QPoint(point.x(),point.y() + height);

    // first triangle
    Draw_Level_Two(p,point,height / 2);

    // second triangle
    Draw_Level_Two(p,point_1,height / 2);

    // third triangle
    Draw_Level_Two(p,point_2,height / 2);
}

void Widget::Draw_Level_Four(QPainter* p,QPoint point,float height)
{
    // draw around triangle
    Draw_Element(p,point,height);

    // draw internal triangle
    QPoint point_1 = QPoint(point.x() - height / qSqrt(3),point.y() + height / 2);

    QPoint point_2 = QPoint(point.x() + height / qSqrt(3),point.y() + height / 2);

    QPoint point_3 = QPoint(point.x(),point.y() + height);

    // first triangle
    Draw_Level_Third(p,point,height / 2);

    // second triangle
    Draw_Level_Third(p,point_1,height / 2);

    // third triangle
    Draw_Level_Third(p,point_2,height / 2);
}

void Widget::Draw_Level_Five(QPainter* p,QPoint point,float height)
{
    // draw around triangle
    Draw_Element(p,point,height);

    // draw internal triangle
    QPoint point_1 = QPoint(point.x() - height / qSqrt(3),point.y() + height / 2);

    QPoint point_2 = QPoint(point.x() + height / qSqrt(3),point.y() + height / 2);

    QPoint point_3 = QPoint(point.x(),point.y() + height);

    // first triangle
    Draw_Level_Four(p,point,height / 2);

    // second triangle
    Draw_Level_Four(p,point_1,height / 2);

    // third triangle
    Draw_Level_Four(p,point_2,height / 2);
}
void Widget::paintEvent(QPaintEvent *event)
{
    /*
     * left: 10px element 10px level1 10px level2
     * */

    QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setRenderHint(QPainter::Antialiasing, true);

    float element_hight = 100;
    int init_point_x = 120;
    float init_point_y = 40;

    // element
    Draw_Element(&painter,QPoint(init_point_x,init_point_y),element_hight);

    // level 1
    init_point_x = 360;
    Draw_Level_One(&painter,QPoint(init_point_x,init_point_y),element_hight);

    // level 2
    init_point_x = 600;
    Draw_Level_Two(&painter,QPoint(init_point_x,init_point_y),element_hight);

    // level 3
    init_point_x = 850;
    Draw_Level_Third(&painter,QPoint(init_point_x,init_point_y),element_hight);


    // level 4
    init_point_x = 1100;
    Draw_Level_Four(&painter,QPoint(init_point_x,init_point_y),element_hight);

    // level 5
    init_point_x = 1350;
    Draw_Level_Five(&painter,QPoint(init_point_x,init_point_y),element_hight);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink 运行时[Runtime] 整体架构

一、基本组件栈 在Flink整个软件架构体系中&#xff0c;同样遵循着分层的架构设计理念&#xff0c;在降低系统耦合度的同时&#xff0c;也为上层用户构建Flink应用提供了丰富且友好的接口。从下图中可以看出整个Flink的架构体系基本上可以分为三层&#xff0c;由上往下依次是 …

融资项目——vue之数据绑定

如上图&#xff0c;当变量{{title}}不在标签内的时候&#xff0c;vue可以正常渲染&#xff0c;点击链接后可正常跳转到百度。但如下图&#xff0c;如果{{title}}在标签内&#xff0c;则此时会产生错误&#xff0c;点击链接后并没有如愿跳转到百度页面。 此时&#xff0c;需要使…

加密算法学习

最近在写一些加密的东西。所以就整理一下常见的加密算法。 欢迎帮助纠错&#xff0c;谢谢。 废话不多直接上图&#xff1a; 加密学习一级介绍描述常见算法常见算法细分非对称加密解释 非对称加密需要两个密钥&#xff1a;公钥 (publickey) 和私钥 (privatekey)。公钥和私钥是…

到底需要会那些技能?才算一个5年经验合格的软件测试工程师

一&#xff1a;经历讲解 微软外包自动化测试两年&#xff0c;而后转入互联网公司做移动端自动化测试一年&#xff0c;经历了入行时的迷茫&#xff0c;而后的笃定&#xff0c;转入移动后对自身定位和价值的怀疑&#xff0c;继而对自动化测试的重新认识&#xff0c;职场三年&…

HrSegNet 23年裂缝检测新文章基于PaddelPaddle和Paddleseg的复现

本文章是对2023年发表在Automation in Construction上论文 Real-time High-Resolution Neural Network with Semantic Guidance for Crack Segmentation 的复现。 我参考了作者上传至github的代码&#xff0c;并得到了作者的帮助。https://github.com/CHDyshli/HrSegNet4Cra…

【机器学习】【线性回归】梯度下降

文章目录 [toc]数据集实际值估计值估计误差代价函数学习率参数更新Python实现线性拟合结果代价结果 数据集 ( x ( i ) , y ( i ) ) , i 1 , 2 , ⋯ , m \left(x^{(i)} , y^{(i)}\right) , i 1 , 2 , \cdots , m (x(i),y(i)),i1,2,⋯,m 实际值 y ( i ) y^{(i)} y(i) 估计值 h …

销量影响因素分析:从多维度解析商品市场表现

在商品市场中&#xff0c;销量是衡量一个商品或品牌成功与否的关键指标。然而&#xff0c;销量的影响因素众多&#xff0c;包括产品品质、价格、品牌知名度、营销策略、竞争环境等。为了深入了解商品市场的表现&#xff0c;我们需要从多个维度对销量影响因素进行分析。本文将通…

FreeRTOS之二值信号量(实践)

信号量相当于一个标志&#xff0c;实现对资源多少的管理。 比如停车场空位的数量。 这里使用的是二值信号量&#xff0c;其队列长度为1&#xff0c;只有空或满两种状态。 1、步骤&#xff1a; 1.1、创建信号量 1.2、释放信号量 1.3、获取信号量 注&#xff1a;若想深入还…

c++11特新:弱引用智能指针

弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手&#xff0c;它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c;不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;析构也不会减少引用计数…

DMR与DPMR以及DMR的分层

数字移动无线电 (DMR) 和数字专用移动无线电 (dPMR) 是数字对讲机中使用的流行通信技术。 与传统模拟无线电相比&#xff0c;这两种技术都提供了改进的音频质量、增强的安全功能和增加的网络容量。 但是&#xff0c;DMR 和 dPMR 无线电之间使用的技术存在重大差异&#xff…

【三维生成与重建】ZeroRF:Zero Pretraining的快速稀疏视图360°重建

系列文章目录 题目&#xff1a;ZeroRF: Fast Sparse View 360◦ Reconstruction with Zero Pretraining 任务&#xff1a;稀疏重建&#xff1b;拓展&#xff1a;Image to 3D、文本到3D 作者&#xff1a;Ruoxi Shi* Xinyue Wei* Cheng Wang Hao Su &#xff0c;来自UC San Dieg…

Redis 6 性能大揭秘:如何优化缓存命中率?

Redis 6的性能优化&#xff0c;特别是关于如何优化缓存命中率。 这篇文章会包含10个代码示例&#xff0c;帮助深入理解和应用相关的技巧 1、 监控缓存命中率 在优化之前&#xff0c;首先要了解当前的缓存命中率。Redis提供了INFO命令来查看性能指标&#xff0c;包括命中率。…

51单片机模数转换ADC原理与代码一

51单片机模数转换ADC原理与代码一 1.概述 这篇文章是模数转换的入门文章&#xff0c;这篇文章主要介绍模数的概念、原理、核心指标、专业术语&#xff0c;以及一个模数转换的实例代码实现检测电位器的数值变化。 2.ADC介绍 2.1.ADC概念 ADC(Analog-to-Digital Converter)是…

TrustZone之安全启动与引导失败处理

一、引导和信任链 引导是任何TrustZone系统的关键部分。只有在引导流程中之前运行的所有软件组件都是可信的情况下,才能信任某个软件组件。这通常被称为信任链。下图显示了一个简化的信任链: 在我们的示例中,首先运行的代码是boot ROM。我们必须隐式信任boot ROM,因…

「完美世界」石昊调戏清漪,告白欲以身相许,渡劫神莲淬炼肉身

Hello,小伙伴们&#xff0c;我是拾荒君。 《完美世界》第142集已经更新。石昊在齐道临赠予的令牌庇护下&#xff0c;成功潜入仙池&#xff0c;借助着他的重瞳&#xff0c;他发现那神秘的渡劫神莲正位于这仙池之中。然而&#xff0c;渡劫神莲的位置上空雷云翻滚&#xff0c;宛如…

【JavaWeb学习笔记】14 - 三大组件其二 Listener Filter

API文档JAVA_EE_api_中英文对照版 Listener 一、监听器Listener 1. Listener监听器它是JavaWeb的三大组件之一。 JavaWeb的三大组件分别是: Servlet程序、Listener监听器、Filter过滤器 2. Listener是JavaEE的规范&#xff0c;就是接口 3.监听器的作用是&#xff0c;监听某…

uniapp纯CSS实现圆形进度条组件

uniapp纯CSS实现圆形进度条组件。圆形进度条组件组合做一个步骤进度组件是非常常见。 纯 CSS 实现圆形进度条组件有以下几个好处&#xff1a; 轻量级&#xff1a;由于纯 CSS 实现&#xff0c;无需额外的 JavaScript 或图像资源&#xff0c;所以组件的文件大小相对较小&#xf…

HTML5文档

目录 HTML5文档结构1.HTML5页面结构2.HTML5新增结构元素 HTML5新增页面元素1.hgroup标记2.figure标记与figcaption标记3.mark标记与time标记4.details标记与summary标记5.progress标记与meter标记6.input标记与datalist标记 HTML5文档结构 HTML5文档结构同样是由头部和主体两部…

Postman报:400 Bad Request

● 使用Postman发送Post请求报400&#xff0c;入参为JSON&#xff1b; 二、分析 1、Postman请求并没有请求到后台Api&#xff08;由于语法错误&#xff0c;服务器无法理解请求&#xff09;&#xff1b; 2、入参出错范围&#xff1a;cookie、header、body、form-data、x-www-f…

3.[BUU]warmup_csaw_20161

1.checksec 检查文件类型 ELF-64-little &#xff0c;无其他限权&#xff0c;直接用ida检查代码。 2.IDA进行反编译&#xff0c;进行代码审计 查看各个名称的内容&#xff1a; 了解基本攻击思路&#xff1a; 攻击思路&#xff1a;gets输入垃圾数据覆盖v5内容&#xff0c;再将s…