QPolygonF/QLineF 相交

spr*_*aff 4 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;
Run Code Online (Sandbox Code Playgroud)

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

Qt API 中是否有我看不到的提供的方法?

hmu*_*ner 5

QPolygonF::intersected 的实现是:

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

return subject.intersected(clip).toFillPolygon();
Run Code Online (Sandbox Code Playgroud)

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

  • 从多边形的线创建一个 QPainterPath
  • 从你的行创建一个 QPainterPath
  • 使它们相交
  • 使用 isEmpty() 检查结果
  • 使用boundingRect()获取交点

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