Пересечение QPolygonF / QLineF - PullRequest
       1

Пересечение QPolygonF / QLineF

3 голосов
/ 12 января 2012

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 ]

4 голосов
/ 06 февраля 2012

Реализация QPolygonF :: intersected:

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

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

т.е. QPolygonF использует методы QPainterPath для пересечений. Так что вы могли бы сделать:

  • сделать QPainterPath из линий многоугольника
  • сделать QPainterPath из вашей линии
  • пересекают их
  • проверить результат с помощью isEmpty ()
  • получить точку пересечения с boundingRect ()

Я не пробовал это! Вы должны проверить это сами. Я не уверен, что это лучше в отношении числовой стабильности и производительности, чем ваше решение, поэтому вам следует написать несколько тестов.

1 голос
/ 08 февраля 2012

К сожалению, ответ «нет».

...