c++ 实现图形计算

基础知识,我会讲解原理:

一切都是基于Qt 的图形视图框架,数学知识要求基本的线性变换,几何知识,向量使用技巧。 好了我们开始。


在Qt 里面,如果要编写一如 绘图软件,地图显示软件 涉及大量的绘图应用将会非常有用。


其工作原理便是:一个场景中有多个图元,而图元可以拖动 单击 选择,然后通过视图显示


当使用没有变换的视图观察场景时,场景中的一个单元对应屏幕上的一个像素

图元坐标通常以图元中心为原点,X轴正方向为向右,Y轴正方向为向下
场景坐标的原点在场景中心,X轴正方向为向右,Y轴正方向为向下
视图坐标以左上角为原点,X轴正方向为向右,Y轴正方向为向下
所有的鼠标事件最开始都是使用视图坐标



场景:图元的容器
1.提供管理很多图元的接口
2.传播事件到图元中
3.管理图元状态,例如选择和焦点处理
4.提供非转换的绘制功能,主要用于打印


视图:
一个可视的子部件,可视化场景的内容
多个视图可以显示同一个场景
坐标转换:QGraphicsView::mapToScene(), QGraphicsView::mapFromScene()

图元:
支持鼠标事件,滚轮事件,上下文菜单事件
支持键盘输入焦点,按键事件
支持拖放
支持分组
冲突探测
提供坐标转换,图元与场景,图元与图元之间
利用QGraphicsItem::shape()和QGraphicsItem::collidesWith()
实现冲突探测,这2个函数都是虚函数

QGraphicsItem子类:

QGraphicsEllipseItem     provides an ellipse item
QGraphicsLineItem        provides a line item
QGraphicsPathItem        provides an arbitrary path item
QGraphicsPixmapItem      provides a pixmap item
QGraphicsPolygonItem     provides a polygon item
QGraphicsRectItem        provides a rectangular item
QGraphicsSimpleTextItem  provides a simple text label item
QGraphicsTextItem        provides an advanced text browser item
QGraphicsSvgItem         provides a SVG file item

QGraphicsScene:
拥有多个图元,包含三层:背景层,图元层,前景层

背景层和前景层可以使用QBrush绘制,也可以使用drawBackground(),drawForeground()实现
如果使用图片作为背景,可以用texture QBrush(pixmap)实现
前景层brush可以使用半透明的白色实现褪色效果,或者使用交叉模式实现网格重叠

场景可以告诉我们,哪些图元发生冲突,哪些图元被选择,哪些图元位于一个特定的点或者区域

每个图元可以是:1.顶级图元,场景是它的父亲;2.孩子,它的父亲是另一个图元,任何作用于父图元的转换
都将自动应用于它的孩子

2种分组方式:1.一个图元成为另一个图元的孩子; 2.使用QGraphicsItemGroup。使用分组,可以使位于同一个
组的所有图元的操作都相同

QGraphicsView:
是一个Widget,用于显示一个场景,提供滚动条功能和转换功能,可以缩放和旋转场景。
默认使用内建的2D画图引擎,可以使用OpenGL:在构造后,调用setViewport()

坐标系统:
使用3种坐标系统:viewport, scene, item
viewport: 位于QGraphicsView内部
scene: 逻辑坐标用于定位顶级图元
item: 与图元相关,以图元的(0,0)为中心,移动图元时,它的坐标不会改变
实践中,主要关注场景坐标(定位顶级图元)和图元坐标(定位子图元和绘制图元)

在图元自己的坐标系统里面绘图意味着我们不用担心它在场景中的位置和应用于它的坐标转换



文件结构:



源码下载:

点击打开链接







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值