c++ 实现图形计算
2015-02-10 11:24
155 查看
基础知识,我会讲解原理:
一切都是基于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)为中心,移动图元时,它的坐标不会改变
实践中,主要关注场景坐标(定位顶级图元)和图元坐标(定位子图元和绘制图元)
在图元自己的坐标系统里面绘图意味着我们不用担心它在场景中的位置和应用于它的坐标转换
文件结构:
源码下载:
点击打开链接
一切都是基于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)为中心,移动图元时,它的坐标不会改变
实践中,主要关注场景坐标(定位顶级图元)和图元坐标(定位子图元和绘制图元)
在图元自己的坐标系统里面绘图意味着我们不用担心它在场景中的位置和应用于它的坐标转换
文件结构:
源码下载:
点击打开链接
相关文章推荐
- C++实现BP 神经网络两类图形分辨出来_智能计算期末1
- C++实现计算程序运行时间 高精度
- 用 C++ 实现的加、减、乘、除表达式计算
- C++ Vector实现计算多个学生成绩
- C++实现计算程序运行时间 高精度
- c++实现根据地图上两点经纬度计算两点间实际距离
- 实现园、长方形和直角三角形3种图形的面积计算!
- 使用MATLAB实现计算结果的图形表示
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- c++实现计算多项式的霍纳规则
- 用C++程序实现复杂表达式的计算问题
- C++实现大小写字母转换及个数计算
- C++高精度实现计算程序运行时间
- 计算加权平均成绩----C++实现
- C++Switch语句实现输入日期计算为改年的第几天
- C++实现计算程序运行时间 高精度
- C++实现计算程序运行时间 高精度
- C++实现的线性代数矩阵计算
- C++高精度实现计算程序运行时间
- 行列式计算之降阶--C++模板实现