QPainterPath与直线的交点(通过x查找QPainterPath的y值)

5
我有一个QPainterPath对象,我需要根据x坐标找到其y坐标。
我发现了QPainterPath中的intersected()方法。因此,我创建了一个新的QPainterPath,该路径是从我的路径的边界矩形的左侧到右侧的一条直线,以x坐标为结果找到交点。
intersects()方法返回true。但是intersected()返回一个空路径。
如果我使用高度为1的矩形而不是线,则一切正常。
也许您有更好的想法如何找到QPainterPath与线的交点?

我已经创建了一个建议,希望添加类似的功能:https://bugreports.qt-project.org/browse/QTBUG-32123 - Mitch
正确的链接是:https://bugreports.qt.io/browse/QTBUG-32313 - Mitch
1个回答

2
根据文档:
QPainterPath QPainterPath::intersected ( const QPainterPath & p ) const
返回一个路径,该路径是此路径填充区域和p的填充区域的交集。 由于进行贝塞尔曲线交点时存在数值不稳定性,因此可能会将贝塞尔曲线平铺成线段。
由于您的线没有填充区域,因此似乎这个函数对您无效。
如果您正在使用QGraphicsScene来显示QPainterPath,则可以使用collidingItems方法:
QList QGraphicsScene::collidingItems ( const QGraphicsItem * item, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const
返回与项目碰撞的所有项目列表。 碰撞是通过调用QGraphicsItem :: collidesWithItem()确定的; 碰撞检测由模式确定。 默认情况下,返回所有形状与项目相交或包含在项目形状内的项目。 这些项目按降序堆叠顺序返回(即,列表中的第一个项目是最上面的项目,而最后一个项目是最下面的项目)。
不幸的是,QPainter似乎没有相同的功能。 我认为创建长矩形的方法可能是更简单的方法。

谢谢你的回答。 不幸的是,我不使用QGraphicsScene。 而且我发现当intersected()方法导致堆栈溢出时,会出现一个问题 :( 所以看来我只需要找到y最接近我需要的QPainterPath::Element。 - Funt
你应该考虑使用QGraphicsScene,它最适合处理多个项目。否则,创建一个QList<QPainterPath*>并跟踪您在QPainter上绘制的每个路径,然后您只需迭代列表并搜索具有适当x坐标的路径即可。 - buster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接