Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-3778

Bug in QPainterPath::intersected()

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • P3: Somewhat important
    • 4.7.0
    • 4.5.0
    • GUI: Painting
    • None
    • bf195e57ff96c326fa26c6b3a4f64e26d18fd9bd

    Description

      Looks more likely to be in the QPathClipper::clip() method itself.

      Attached you can find a very small testcase that shows an incorrect
      behaviour in QPainterPath::intersected().

      First the app creates two painterpaths called path1 and path2.
      Then it calculates

      • path1.intersected(path2) and
      • path2.intersected(paht1)

      The results should be the same. However, in the given example the
      intersection of path1 with path2 results in an empty path which obviously is
      incorrect. The other way works. plot.png shows that the two paths indeed
      intersect.

      example:

       
      #include <QApplication>
      #include <QPainterPath>
      #include <QString>
      #include <QDebug>
      
      static void print(const QString& str, const QPainterPath& pp)
      {
          qDebug() << "Subject:" << str;
          for (int i = 0; i < pp.elementCount(); ++i) {
              const QPainterPath::Element& el = pp.elementAt(i);
              qDebug() << el.type << el.x << el.y;
          }
          if (pp.isEmpty()) qDebug() << '\t' << "!!! Empty path, this is incorrect !!!";
      }
      
      int main(int argc, char* argv[])
      {
          QApplication app(argc, argv);
      
          QPainterPath path1;
          path1.moveTo(200, 3.22409e-5); // e-5 and higher leads to a bug
                                         // Using 3.22409e-4 starts to work correctly
          path1.lineTo(0, 0);
          path1.lineTo(1.07025e-13, 1450);
          path1.lineTo(750, 950);
          path1.lineTo(950, 750);
          path1.lineTo(200, 3.22409e-13);
      
          QPainterPath path2;
          path2.moveTo(0, 0);
          path2.lineTo(200, 800);
          path2.lineTo(600, 1500);
          path2.lineTo(1500, 1400);
          path2.lineTo(1900, 1200);
          path2.lineTo(2000, 1000);
          path2.lineTo(1400, 0);
          path2.lineTo(0, 0);
          
          QPainterPath p12 = path1.intersected(path2);
          QPainterPath p21 = path2.intersected(path1);
      
          print("path 1", path1);
          print("path 2", path2);
          print("intersected 1 with 2", p12);
          print("intersected 2 with 1", p21);
      
          return 0;
      }
      

      Attachments

        Activity

          People

            rodal Samuel Rødal
            janichol Andy Nichols
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: