首页 > 代码库 > Qt获取多边形(QGraphicsPolygonItem)或Qt图形组件与直线(QLineF)的交点 - 推酷
Qt获取多边形(QGraphicsPolygonItem)或Qt图形组件与直线(QLineF)的交点 - 推酷
<link id="syntaxhighlighter_css" rel="stylesheet" type="text/css" href="http://www.mamicode.com/1e1e0ce2-a608-432b-be0f-e439f2fe1f42_files/shCoreDefault.css"><body spellcheck="false" style="height: 636px;">
有时需要获取直线与各种图形的交点,包括多边形和各种Qt图形框。
例如上图中,要想使连接线始终在多边形的边上,且能指向多边形中心,那么我们就要获取连线AB与多边形的交点。
1.多边形(QGraphicsPolygonItem)与直线(QLineF)的交点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //已知点和多边形//A、B点可通过多边形的boundingRect().width()/2获取; QPointF A; QPointF B; QGraphicsPolygonItem yellowItem; QLineF lineAB(A,B); //AB连线QPointF arrowPoint; //设置交点 QPolygonF yellowtPolygon = yellowItem->polygon(); QPointF p1 = yellowtPolygon.first() + yellowItem->pos(); //遍历各边连线for (int i = 1; i < yellowtPolygon.count(); ++i) { QPointF p2 = yellowtPolygon.at(i) + yellowItem->pos(); QLineF polyLine = QLineF(p1, p2); //核心:判断是否相交 QLineF::IntersectType intersectType = polyLine.intersect(lineAB, &arrowPoint); if (intersectType == QLineF::BoundedIntersection) break; p1 = p2; } //arrowPoint 即为交点 |
从上面代码可以看到,一个多边形和直线的交点的实现,就是遍历直线与所有边的联系,推而广之,所有Qt的图形化组件,比如QPushButton,QQGraphicsTextItem等,只要有边界的图形化组件都能获取其与直线的交点。即遍历所有边与直线的交点即可。
2.Qt图形组件与直线(QLineF)的交点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | QPointF A; QPointF B; QLineF lineAB(A,B); //AB连线 Q普通组件 m_CommentItem; qreal commentWidth = m_CommentItem->boundingRect().width(); qreal commentHeight = m_CommentItem->boundingRect().height(); QPointF intersectPoint; //四个边-四条线QLineF line1(0,0,commentWidth,0 ); QLineF line2( 0,0,0 ,commentHeight); QLineF line3(commentWidth, 0 ,commentWidth,commentHeight); QLineF line4( 0 ,commentHeight,commentWidth,commentHeight); QList<QLineF> lineList; lineList.append(line1); lineList.append(line2); lineList.append(line3); lineList.append(line4); //遍历四条线foreach (QLineF oneline,lineList) { QLineF::IntersectType intersectType = oneline.intersect(lineAB, &intersectPoint); if (intersectType == QLineF::BoundedIntersection) break ; } //intersectPoint 即为交点 |
3.可参考例子:
Qt Examples and Demos -> Graphics View ->Diagram Scene
来自为知笔记(Wiz)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。