QPolygonF / QLineF交叉点

时间:2012-01-12 14:57:14

标签: qt computational-geometry

QPolygonF具有与其他QPolygonF结合,相交和减法的方法,但我需要使用QLineF执行相交测试。这似乎在API中缺失。

我想我可以这样做:

if (polygon .containsPoint (line .p1 ()) != polygon .containsPoint (line .p2 ())
    return true;

QPointF a = polygon .back ();
foreach (QPointF b, polygon)
{
    if (QLineF :: BoundedIntersection == line .intersect (QPointF (a, b))
       return true;
    a = b;
}

return false;

上面可能存在一些数字或边缘情况的惊喜,所以我宁愿不这样做。

在Qt API的某个地方是否有我无法看到的提供方法?

2 个答案:

答案 0 :(得分:4)

QPolygonF :: intersectcted的实现是:

QPainterPath subject; subject.addPolygon(*this);
QPainterPath clip; clip.addPolygon(r);

return subject.intersected(clip).toFillPolygon();

即。 QPolygonF使用QPainterPath方法来执行交叉。 所以你可以这样做:

  • 从多边形的行
  • 制作QPainterPath
  • 从您的行中制作QPainterPath
  • 与他们相交
  • 使用isEmpty()
  • 检查结果
  • 获取与boundingRect()
  • 的交点

我没有尝试过这个!你必须自己检查一下。我不确定这在数值稳定性和性能方面是否比你的解决方案更好,所以你应该写一些测试。

答案 1 :(得分:1)

不幸的是,答案是“不”。