- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
实现的效果是这样的,使用QGraphicsEllipseItem和QGraphicsPolygonItem画“心”。
比如来个红心
再来个“黑心”:
这里需要用到高中数学。
①要了解圆的参数方程,其公式是这样的:
x = a + r · cosθ 和 y = b + r · sinθ
其中(a, b)为圆心的坐标,r为圆的半径,θ是角度取值范围为[0, 2π]。
②在C++或各种语言里面有专门的sin、cos函数,在Qt框架里面使用QtMath的头文件。这里传的参数需要弧度,所以,而在数学里面,圆的参数方程里面传入的参数是角度,所以还要需要了解,角度转弧度公式:
弧度 = 角度 · (π / 180)
了解了公式后,下面来说下,这个爱心的画法:
首先是画两个带角度的圆。
左边的圆:角度是从0度到225度。
右边的圆:角度是从-45度到180度。
如下图:
然后找到2个圆心点,用圆的参数方程,找边上的2个点
再到两圆之间找法线上找任意一点:
通过这5个点构造多边形,如下:
这样将这3个图形组合起来,就是一个“心”了。
程序结构如下:
源码如下:
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QGraphicsScene;
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void drawCricle(int x, int y, int height, int width, int startAngle, int endAngle);
void drawPolygon();
private:
Ui::Widget *ui;
QGraphicsScene *m_scene;
};
#endif // WIDGET_H
main.cpp
#include "Widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
Widget.cpp
#include "Widget.h"
#include "ui_Widget.h"
#include <QGraphicsEllipseItem>
#include <QGraphicsPolygonItem>
#include <QPolygonF>
#include <QPen>
#include <iostream>
#include <QtMath>
#include <QGraphicsScene>
#include <QDebug>
#include <QPoint>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->graphicsView->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
m_scene = new QGraphicsScene;
ui->graphicsView->setScene(m_scene);
drawCricle(-100, 0, 200, 200, 0, 360 * 10);
drawCricle(100, 0, 200, 200, 360 * 14, 360 * 10);
drawPolygon();
this->setWindowTitle("it1995.cn Designed by FengFanChen");
}
Widget::~Widget()
{
delete m_scene;
delete ui;
}
void Widget::drawCricle(int x, int y, int height, int width, int startAngle, int endAngle)
{
auto item(new QGraphicsEllipseItem(x, y, height, width));
item->setBrush(Qt::red);
item->setStartAngle(startAngle);
item->setSpanAngle(endAngle);
item->setPen(QPen(Qt::red));
m_scene->addItem(item);
}
void Widget::drawPolygon()
{
double oneCricleHeartX = -2.5;
double oneCricleHeartY = 95;
double oneX = oneCricleHeartX + 100 * cos(135 * ( M_PI /180));
double oneY = oneCricleHeartY + 100 * sin(135 * ( M_PI /180));
double endX = 100;
double endY = 100 + 200;
// auto item(new QGraphicsEllipseItem(x, y, 10, 10));
//auto item(new QGraphicsEllipseItem(100 - 5, 100 - 5 + 100, 10, 10));
// auto item(new QGraphicsEllipseItem(endX, endY, 10, 10));
// item->setBrush(Qt::blue);
// m_scene->addItem(item);
// auto line1Item(new QGraphicsLineItem(oneX, oneY + 2.5, endX + 1, endY + 1));
// m_scene->addItem(line1Item);
//第二个
double twoCricleHeartX = 200;
double twoCricleHeartY = 95;
// auto item(new QGraphicsEllipseItem(twoCricleHeartX - 5, twoCricleHeartY, 10, 10));
// item->setBrush(Qt::blue);
// m_scene->addItem(item);
double twoX = twoCricleHeartX + 100 * cos(45 * ( M_PI /180));
double twoY = twoCricleHeartY + 100 * sin(45 * ( M_PI /180));
// auto item(new QGraphicsEllipseItem(twoX - 5, twoY, 10, 10));
// item->setBrush(Qt::blue);
// m_scene->addItem(item);
// auto line2Item(new QGraphicsLineItem(twoX, twoY + 5, endX + 1, endY + 1));
// m_scene->addItem(line2Item);
auto polygonItem = (new QGraphicsPolygonItem());
QPolygonF pf;
pf.append(QPoint(endX + 1, endY + 1));
pf.append(QPoint(oneX + 2, oneY + 5));
pf.append(QPoint(oneCricleHeartX, oneCricleHeartY + 5));
pf.append(QPoint(twoCricleHeartX, twoCricleHeartY + 5));
pf.append(QPoint(twoX, twoY + 5));
polygonItem->setPolygon(pf);
polygonItem->setPen(QPen(Qt::red));
polygonItem->setBrush(Qt::red);
m_scene->addItem(polygonItem);
}
有几个关键点要说:
①QGraphic的坐标系和数学里面的不一样,他和屏幕里面的坐标一样,y轴下方为正,y轴上方为负。
②在QGraphicsEllipseItem中有按角度画圆的函数:
void QGraphicsEllipseItem::setStartAngle(int angle)
Sets the start angle for an ellipse segment to angle, which is in 16ths of a degree. This angle is used together with spanAngle() for representing an ellipse segment (a pie). By default, the start angle is 0.
从官方文档可以知道,他扩大了16倍,也就是说360 * 16是直角坐标系的360,所以如果是90度的角度,就是90 * 16。
③代码里面的这些代码:
QPolygonF pf;
pf.append(QPoint(endX + 1, endY + 1));
pf.append(QPoint(oneX + 2, oneY + 5));
pf.append(QPoint(oneCricleHeartX, oneCricleHeartY + 5));
pf.append(QPoint(twoCricleHeartX, twoCricleHeartY + 5));
pf.append(QPoint(twoX, twoY + 5));
这些+1,+2,+5是用来调节的,避免算点时因为精度丢失,导致要画的“心”不好看。
地址如下:
private boolean validateSno(double inSno) { //sno is the serial number int firstThree=(int)inSno
这个问题已经有答案了: How can I determine if a date is between two dates in Java? [duplicate] (11 个回答) 已关闭 6 年
我目前正在通过一本名为 Alex Allain - Jumping into c++ 的书学习 C++,但我卡在了第 21 章。它详细介绍了 C++ 构建过程,我明白了,除了 2 个部分: 首先: “
我有以下 Oracle 查询 SELECT * FROM table WHERE date_opened BETWEEN ((TO_DATE('2011-08-01', 'yyyy-mm-dd') -
use rand::Rng; fn main() { let mut zz = rand::thread_rng(); let mut a: [i32; 4096] = [0; 409
我正在使用 flatPickr(日历插件)来完成此任务。我将 minDate 和 maxDate(始终是星期日)从 PHP 函数发送到 JavaScript: $("#weeklySelector")
从 Eclipse 运行时,以下代码可以正常工作: System.setProperty("webdriver.gecko.driver", pathToGeckoDriver); FirefoxOp
我正在编写一个 Iphone 应用程序并使用 sqlite 作为我的数据库。如果对象在某个范围(MIN 和 MAX)之间,我有折扣,但问题是当我查询时,折扣似乎也适用于超出该范围的对象。不确定如何正确
Brunch 几乎适用于所有模板语言,并且有适用于它们的插件,但我无法使用 vanilla HTML。我只是希望在每次构建早午餐时只复制我的 html 文件(无论它们位于何处)并粘贴到公共(publi
首先我必须输入N,N成为第一个要检查的数字。 输入:79 输出应为:537.70。 int sum=0; while(1) { scanf("%d", &n
aa: { one: "hello", two: "good", three: "bye", four: "tomorrow",
我尝试解决方案,我知道这是不对的,因为程序的输出不正确。我做错了什么? 我有一个内部节点类,每个节点都有值字段。此方法应返回具有介于 int min 和 max 之间的值字段的节点数。 //-----
我正在尝试弄清楚如何执行 mysql 查询,在该查询中我返回以(例如)A-D 开头的结果,又名将返回: - 动物 - 银行 - 可乐 - 狗但不是:冰屋 看起来很简单,但找不到有效的方法。 我的意思是
我正在开发一个程序,我必须打印出 1 到 239 之间的素数,包括 1 和 239(我知道一和二可能不是素数,但我们会认为它们是素数这个程序)它一定是一个非常简单的程序,因为我们只讨论了一些基础知识。
我有一个错误,我在 jsbin 中复制了这个错误:https://jsbin.com/micinalacu/1/edit?html,console,output 铁形式,提交时serialize方法返
我正在尝试为 UIColor 定义扩展 import UIKit extension UIColor { convenience init(rgb:UInt){ let red
通过对 A 和 B(含)之间的一个或多个整数进行按位或运算,可以生成多少个不同的数字? 解释: 在这种情况下,A=7 和 B=9。对 {7, 8, 9} 的非空子集进行按位或运算可以生成四个整数:7,
在尝试将ignore_malformed添加到索引设置时,我需要帮助。 我有: from elasticsearch import Elasticsearch es = Elasticsearch(
我希望生成介于 1500 和 1650 之间的随机整数。 我已成功生成介于 25 和 55 之间的随机值(包括以下代码)。但是,我遇到的问题是,如果我修改代码以生成 1500 到 1650 之间的值(
背景 我正在使用 cx_Freeze 构建我的应用程序的 Windows 和 Mac 包;构建在两个平台上都成功执行,在 Windows 上生成 msi,在 Mac 上生成 dmg/app,我可以安装
我是一名优秀的程序员,十分优秀!