Qt Qt 绘制折线图 计算线段交点
2017-02-26 23:03
218 查看
[align=left]
[/align]
[align=left](2)vs2010[/align]
[align=left](3)windows操作系统[/align]
[align=left]
[/align]
[align=center][/align]
[align=left](2)画折线图[/align]
[align=left](3)实时求鼠标线与折线得交点,并显示在窗口[/align]
[/align]
[/align]
Qt 绘制折线图
先看一张图片工程文件见下方链接
本程序的开发环境:
[align=left](1)qt4.8.6[/align][align=left](2)vs2010[/align]
[align=left](3)windows操作系统[/align]
[align=left]
[/align]
[align=center][/align]
本程序实现了一下功能:
[align=left](1)实时画鼠标线[/align][align=left](2)画折线图[/align]
[align=left](3)实时求鼠标线与折线得交点,并显示在窗口[/align]
本程序用到得方法:
(1)从写QGriphicsItem,(坐标轴部分和鼠标线和折线焦点得小圆点部分)
首先继承QGraphicsItem类,从写这两个方法
virtual QRectF boundingRect() const ; virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) ;
在这里要注意的是item的坐标,坐标轴的方向和Qt定义的屏幕坐标轴的方向一样,及从屏幕左上角开始,向下是y轴的正半轴,向右是x轴的正半轴
还有其中BoundingRect函数返回的矩形可以用在碰撞检测中,不再本文讨论的范畴
在paint方法中,可以重新绘制你想要的item的形状,比如在本文中绘制的坐标轴item。其代码实现如下
void AxisItem::DrawYAxis( QPainter *painter ) { //y轴 painter->drawLine(_boundingRect.width(),0,_boundingRect.width(),_boundingRect.height()); if (_data._isArrow) { painter->drawLine(5,0,0,5); painter->drawLine(5,0,10,5); } int space = _boundingRect.height()/_data._space; //每格所占的高度 int increment = (_data._maxVal - _data._minVal)/ _data._space; //刻度和文字 if (_data._isCenter) { space = _boundingRect.height()/2/_data._space; //每格所占的高度 increment = (_data._maxVal - _data._minVal)/ _data._space; for (int i = 1; i <= _data._space; i++) { painter->drawLine(0,i * space,_boundingRect.width(),i *space); //从上往下画的 QString text = QString::number((_data._space - i)*increment + _data._minVal); QFontMetrics fontMetrics(painter->font()); painter->drawText(QRectF(-fontMetrics.width(text) - 5,space * i - 5,fontMetrics.width(text),fontMetrics.height()),text); } for (int i = _data._space; i <= 2*_data._space; i++) { painter->drawLine(0,i * space,_boundingRect.width(),i *space); //从上往下画的 QString text = QString::number((_data._space - i)*increment + _data._minVal); QFontMetrics fontMetrics(painter->font()); painter->drawText(QRectF(-fontMetrics.width(text) - 5,space * i - 5,fontMetrics.width(text),fontMetrics.height()),text); } } else { for (int i = 1; i <= _data._space; i++) { painter->drawLine(0,i * space,_boundingRect.width(),i *space); QString text = QString::number((_data._space - i)*increment + _data._minVal); QFontMetrics fontMetrics(painter->font()); painter->drawText(QRectF(-fontMetrics.width(text) - 5,space * i - 5,fontMetrics.width(text),fontMetrics.height()),text); } } QPen pen(QColor(_data._titleColor)); painter->setPen(pen); QString text = _data._title; QFontMetrics fontMetrics(painter->font()); painter->drawText(QRectF(-fontMetrics.width(text)/2,-fontMetrics.height(),fontMetrics.width(text),fontMetrics.height()),text); }
在这里需要注意的是所有的坐标都是相对与看刚开始定义的boundingRect函数返回的区域,一般将区域的中心 定义为0,0点。
x轴的实现同理,不在重复
(2)qt判断两条相交线的交点的方法
判断两条线相交的交点,大家可以看一下QLine类,其中有一个叫做Intersect的方法可以判断两天线段的交点,我的检测代码如下:
for(int i = 0 ; i < polygonPos.size(); i++) { if (i > 0) { tline.setLine(polygonPos[i-1].x(),polygonPos[i-1].y(),polygonPos[i].x(),polygonPos[i].y()); QLineF::IntersectType itpye = tline.intersect(mouseLine,&interPos); if (QLineF::IntersectType::BoundedIntersection == itpye ) { /*添加相交后的代码 } } }
(3)鼠标移动事件的实现
这里的鼠标移动事件,我重写了QGraphicsScene的鼠标移动事件,之所以选这类的事件,是因为对其上的Item做操作是,不需要在对鼠标的坐标进行转换,
可以方法的获取鼠标在Scene上的位子坐标,得到位置坐标的方法与普通的鼠标事件相似
void MyScene::mouseMoveEvent( QGraphicsSceneMouseEvent *event ) { _mousePos = event->scenePos(); }
(4)qt字体的宽度和高度的计算
字体高度的技术俺计算用到了QFontMetrics类,该类中有方法可以算出字体的宽度和高度,可以防止在绘图的时候放生字体绘出item的区域而看不到的问题
本工程的下载地址点击打开链接
[align=center][/align]
相关文章推荐
- vtk实战(五十)—计算线段与多边形的交点
- 【计算几何初步-线段相交】【HDU1089】线段交点
- Qt5.9中在Pixmap图片设备上绘制线段实例
- ObjectARX学习笔记(廿八)---如何计算两条线段的交点AcGeLineSeg3d
- hdu 1086(计算几何入门题——计算线段交点个数)
- 两条线段是否相交,计算交点公式。
- QT5简易坐标系和折线图的绘制
- HDU2528-Area(计算凸多边形面积,线段和直线交点)
- HTML5 Canvas 绘制库存变化折线 计算出最高最低库存
- [从头学数学] 第265节 [计算几何] 多线段求交点(扫描线法)
- 线段与矩形相交计算(QT方法)
- 两条线段是否相交,计算交点公式。
- hdu1086+You can Solve a Geometry Problem too(计算几何,计算线段交点个数)
- sgu 129 Inheritance 凸包,线段交点,计算几何 难度:2
- 计算线段的交点
- C# 计算两条线段交点的位置
- PKU1039 Pipe 计算几何线段交点
- 计算几何——HDUOJ 1086 - YouCanSolveAGeometryProblemToo(线段交点)
- hdu1086 You can Solve a Geometry Problem too 计算几何求线段交点个数,快速排斥实验+跨立实验
- [从头学数学] 第266节 [计算几何] 多线段求交点