Beispiel #1
0
void QhullPoints_test::
t_convert()
{
    Qhull q;
    //defineAs tested above
    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    QhullPoints ps(q, 3, 6, c);
    QCOMPARE(ps.dimension(), 3);
    QCOMPARE(ps.size(), 2u);
    const coordT *c2= ps.constData();
    QCOMPARE(c, c2);
    const coordT *c3= ps.data();
    QCOMPARE(c, c3);
    coordT *c4= ps.data();
    QCOMPARE(c, c4);
    std::vector<QhullPoint> vs= ps.toStdVector();
    QCOMPARE(vs.size(), 2u);
    QhullPoint p= vs[1];
    QCOMPARE(p[2], 5.0);
    QList<QhullPoint> qs= ps.toQList();
    QCOMPARE(qs.size(), 2);
    QhullPoint p2= qs[1];
    QCOMPARE(p2[2], 5.0);
    q.checkAndFreeQhullMemory();
}//t_convert
Beispiel #2
0
void QhullPoints_test::
t_construct_qh()
{
    Qhull q;
    QhullQh *qh= q.qh();
    QhullPoints ps(qh);
    QCOMPARE(ps.dimension(), 0);
    QVERIFY(ps.isEmpty());
    QCOMPARE(ps.count(), 0);
    QCOMPARE(ps.size(), 0u);
    QCOMPARE(ps.coordinateCount(), 0);
    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    QhullPoints ps2(qh);
    ps2.defineAs(2, 6, c);
    QCOMPARE(ps2.dimension(), 2);
    QVERIFY(!ps2.isEmpty());
    QCOMPARE(ps2.count(), 3);
    QCOMPARE(ps2.size(), 3u);
    QCOMPARE(ps2.coordinates(), c);
    QhullPoints ps3(qh, 2, 6, c);
    QCOMPARE(ps3.dimension(), 2);
    QVERIFY(!ps3.isEmpty());
    QCOMPARE(ps3.coordinates(), ps2.coordinates());
    QVERIFY(ps3==ps2);
    QVERIFY(ps3!=ps);
    QhullPoints ps4= ps3;
    QVERIFY(ps4==ps3);
    // ps4= ps3; //compiler error
    QhullPoints ps5(ps4);
    QVERIFY(ps5==ps4);
    QVERIFY(!(ps5!=ps4));
    coordT c2[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    QhullPoints ps6(qh, 2, 6, c2);
    QVERIFY(ps6==ps2);

    RboxPoints rbox("c D2");
    Qhull q2(rbox, "");
    QhullPoints ps8(q2.qh());
    QCOMPARE(ps8.dimension(), 2);
    QCOMPARE(ps8.count(), 0);
    QCOMPARE(ps8.size(), 0u);
    QCOMPARE(ps8.coordinateCount(), 0);
    coordT c3[]= {10.0, 11.0, 12.0, 13.0, 14.0, 15.0};
    QhullPoints ps9(q2.qh(), 6, c3);
    QCOMPARE(ps9.dimension(), 2);
    QCOMPARE(ps9.coordinateCount(), 6);
    QCOMPARE(ps9.count(), 3);
    QCOMPARE(ps9.coordinates(), c3);
    ps9.defineAs(6, c2);
    QCOMPARE(ps9.dimension(), 2);
    QCOMPARE(ps9.coordinateCount(), 6);
    QCOMPARE(ps9.count(), 3);
    QCOMPARE(ps9.coordinates(), c2);
    q2.checkAndFreeQhullMemory();
}//t_construct_qh
Beispiel #3
0
void Qhull_test::
t_getValue()
{
    RboxPoints rcube("c");
    {
        Qhull q;
        q.runQhull(rcube, "");
        QCOMPARE(q.area(), 6.0);
        QCOMPARE(q.volume(), 1.0);
    }
}//t_getValue
Beispiel #4
0
void QhullPoints_test::
t_getset()
{
    Qhull q;
    //See t_construct for coordinates, count, defineAs, dimension, isempty, ==, !=, size
    coordT c[]= {0.0, 1.0, 2.0, 3.0, 4.0, 5.0};
    QhullPoints ps(q, 3, 6, c);
    QhullPoints ps2(q, 3, 6, c);
    QCOMPARE(ps2.dimension(), 3);
    QCOMPARE(ps2.coordinates(), c);
    QCOMPARE(ps2.count(), 2);
    QCOMPARE(ps2.coordinateCount(), 6);
    coordT c2[]= {-1.0, -2.0, -3.0, -4.0, -5.0, -6.0};
    ps2.defineAs(6, c2);
    QCOMPARE(ps2.coordinates(), c2);
    QCOMPARE(ps2.count(), 2);
    QCOMPARE(ps2.size(), 2u);
    QCOMPARE(ps2.dimension(), 3);
    QVERIFY(!ps2.isEmpty());
    QVERIFY(ps!=ps2);
    // ps2= ps; // assignment not available, compiler error
    ps2.defineAs(ps);
    QVERIFY(ps==ps2);
    ps2.setDimension(2);
    QCOMPARE(ps2.dimension(), 2);
    QCOMPARE(ps2.coordinates(), c);
    QVERIFY(!ps2.isEmpty());
    QCOMPARE(ps2.count(), 3);
    QCOMPARE(ps2.size(), 3u);
    QVERIFY(ps!=ps2);
    QhullPoints ps3(ps2);
    ps3.setDimension(3);
    ps3.defineAs(5, c2);
    QCOMPARE(ps3.count(), 1);
    QCOMPARE(ps3.extraCoordinatesCount(), 2);
    QCOMPARE(ps3.extraCoordinates()[0], -4.0);
    QVERIFY(ps3.includesCoordinates(ps3.data()));
    QVERIFY(ps3.includesCoordinates(ps3.data()+ps3.count()-1));
    QVERIFY(!ps3.includesCoordinates(ps3.data()-1));
    QVERIFY(!ps3.includesCoordinates(ps3.data()+ps3.coordinateCount()));
    q.checkAndFreeQhullMemory();
}//t_getset
Beispiel #5
0
void Qhull_test::
t_attribute()
{
    RboxPoints rcube("c");
    {
        double normals[] = {
            0,  -1, -0.5,
           -1,   0, -0.5,
            1,   0, -0.5,
            0,   1, -0.5
        };
        Qhull q;
        q.feasiblePoint << 0.0 << 0.0;
        Coordinates c(std::vector<double>(2, 0.0));
        QVERIFY(q.feasiblePoint==c);
        q.setOutputStream(&cout);
        q.runQhull("normals of square", 3, 4, normals, "H"); // halfspace intersect
        QCOMPARE(q.facetList().count(), 4); // Vertices of square
        cout << "Expecting summary of halfspace intersect\n";
        q.outputQhull();
        q.useOutputStream= false;
        cout << "Expecting no output from qh_fprintf() in Qhull.cpp\n";
        q.outputQhull();
    }
}//t_attribute
Beispiel #6
0
void Qhull_test::
t_construct()
{
    {
        Qhull q;
        QCOMPARE(q.dimension(),0);
        QVERIFY(q.qhullQh()!=0);
        QVERIFY(q.runId()!=0);
        QCOMPARE(QString(q.qhullCommand()),QString(""));
        QCOMPARE(QString(q.rboxCommand()),QString(""));
        try{
            QCOMPARE(q.area(),0.0);
            QFAIL("area() did not fail.");
        }catch (const std::exception &e) {
            cout << "INFO   : Caught " << e.what();
        }
        Qhull q2(q);  // Copy constructor and copy assignment OK if not q.initialized()
        QCOMPARE(q2.dimension(),0);
        q= q2;
        QCOMPARE(q.dimension(),0);
    }
    {
        RboxPoints rbox("10000");
        Qhull q(rbox, "QR0"); // Random points in a randomly rotated cube.
        QCOMPARE(q.dimension(),3);
        QVERIFY(q.volume() < 1.0);
        QVERIFY(q.volume() > 0.99);
        try{
            Qhull q2(q);
            QFAIL("Copy constructor did not fail for initialized Qhull.");
        }catch (const std::exception &e) {
            cout << "INFO   : Caught " << e.what();
        }
        try{
            Qhull q3;
            q3= q;
            QFAIL("Copy assignment did not fail for initialized Qhull source.");
        }catch (const std::exception &e) {
            cout << "INFO   : Caught " << e.what();
        }
        QCOMPARE(q.dimension(),3);
        try{
            Qhull q4;
            q= q4;
            QFAIL("Copy assignment did not fail for initialized Qhull destination.");
        }catch (const std::exception &e) {
            cout << "INFO   : Caught " << e.what();
        }
        QCOMPARE(q.dimension(),3);
    }
    {
        double points[] = {
            0, 0,
            1, 0,
            1, 1
        };
        Qhull q("triangle", 2, 3, points, "");
        QCOMPARE(q.dimension(),2);
        QCOMPARE(q.facetCount(),3);
        QCOMPARE(q.vertexCount(),3);
        QCOMPARE(q.dimension(),2);
        QCOMPARE(q.area(), 2.0+sqrt(2.0)); // length of boundary
        QCOMPARE(q.volume(), 0.5);        // the 2-d area
    }
}//t_construct
Beispiel #7
0
void Qhull_test::
t_foreach()
{
    RboxPoints rcube("c");
    {
        Qhull q;
        QCOMPARE(q.beginFacet(),q.endFacet());
        QCOMPARE(q.beginVertex(),q.endVertex());
        q.runQhull(rcube, "");
        QCOMPARE(q.facetList().count(), 6);

        // defineVertexNeighborFacets() tested in QhullVertex_test::t_io()

        QhullFacetList facets(q.beginFacet(), q.endFacet());
        QCOMPARE(facets.count(), 6);
        QCOMPARE(q.firstFacet(), q.beginFacet());
        QhullVertexList vertices(q.beginVertex(), q.endVertex());
        QCOMPARE(vertices.count(), 8);
        QCOMPARE(q.firstVertex(), q.beginVertex());
        QhullPoints ps= q.points();
        QCOMPARE(ps.count(), 8);
        QhullPointSet ps2= q.otherPoints();
        QCOMPARE(ps2.count(), 0);
        // ps2= q.otherPoints(); //disabled, would not copy the points 
        QCOMPARE(q.facetCount(), 6);
        QCOMPARE(q.vertexCount(), 8);
        coordT *c= q.pointCoordinateBegin(); // of q.points()
        QVERIFY(*c==0.5 || *c==-0.5);
        coordT *c3= q.pointCoordinateEnd();
        QVERIFY(c3[-1]==0.5 || c3[-1]==-0.5);
        QCOMPARE(c3-c, 8*3);
        QCOMPARE(q.vertexList().count(), 8);
    }
}//t_foreach
Beispiel #8
0
void Qhull_test::
t_getQh()
{
    RboxPoints rcube("c");
    {
        Qhull q;
        q.runQhull(rcube, "s");
        QCOMPARE(QString(q.qhullCommand()), QString("qhull s"));
        QCOMPARE(QString(q.rboxCommand()), QString("rbox \"c\""));
        QCOMPARE(q.facetCount(), 6);
        QCOMPARE(q.vertexCount(), 8);
        // Sample fields from Qhull's qhT [libqhull.h]
        QCOMPARE(q.qhullQh()->ALLpoints, 0u);
        QCOMPARE(q.qhullQh()->GOODpoint, 0);
        QCOMPARE(q.qhullQh()->IStracing, 0);
        QCOMPARE(q.qhullQh()->MAXcoplanar+1.0, 1.0); // fuzzy compare
        QCOMPARE(q.qhullQh()->MERGING, 1u);
        QCOMPARE(q.qhullQh()->input_dim, 3);
        QCOMPARE(QString(q.qhullQh()->qhull_options).left(8), QString("  run-id"));
        QCOMPARE(q.qhullQh()->run_id, q.runId());
        QCOMPARE(q.qhullQh()->num_facets, 6);
        QCOMPARE(q.qhullQh()->hasTriangulation, 0u);
        QCOMPARE(q.qhullQh()->max_outside - q.qhullQh()->min_vertex + 1.0, 1.0); // fuzzy compare
        QCOMPARE(*q.qhullQh()->gm_matrix+1.0, 1.0); // fuzzy compare
    }
}//t_getQh
Beispiel #9
0
void Qhull_test::
t_getSet()
{
    RboxPoints rcube("c");
    {
        Qhull q;
        QVERIFY(!q.initialized());
        q.runQhull(rcube, "s");
        QVERIFY(q.initialized());
        QCOMPARE(q.dimension(), 3);
        QhullPoint p= q.origin();
        QCOMPARE(p.dimension(), 3);
        QCOMPARE(p[0]+p[1]+p[2], 0.0);
        QVERIFY(q.runId()!=0);
        q.setErrorStream(&cout);
        q.outputQhull();
    }
    {
        Qhull q;
        q.runQhull(rcube, "");
        q.setOutputStream(&cout);
        q.outputQhull();
    }
    // qhullQh -- UsingLibQhull [Qhull.cpp]
    // runId -- UsingLibQhull [Qhull.cpp]
}//t_getSet
Beispiel #10
0
//! No QhullMessage for errors outside of qhull
void Qhull_test::
t_message()
{
    RboxPoints rcube("c");
    {
        Qhull q;
        QCOMPARE(q.qhullMessage(), string(""));
        QCOMPARE(q.qhullStatus(), qh_ERRnone);
        QVERIFY(!q.hasQhullMessage());
        try{
            q.runQhull(rcube, "Fd");
            QFAIL("runQhull Fd did not fail.");
        }catch (const std::exception &e) {
            const char *s= e.what();
            cout << "INFO   : Caught " << s;
            QCOMPARE(QString::fromStdString(s).left(6), QString("QH6029"));
            // FIXUP QH11025 -- review decision to clearQhullMessage at QhullError()            // Cleared when copied to QhullError
            QVERIFY(!q.hasQhullMessage());
            // QCOMPARE(q.qhullMessage(), QString::fromStdString(s).remove(0, 7));
            // QCOMPARE(q.qhullStatus(), 6029);
            q.clearQhullMessage();  
            QVERIFY(!q.hasQhullMessage());
        }
        q.appendQhullMessage("Append 1");
        QVERIFY(q.hasQhullMessage());
        QCOMPARE(QString::fromStdString(q.qhullMessage()), QString("Append 1"));
        q.appendQhullMessage("\nAppend 2\n");
        QCOMPARE(QString::fromStdString(q.qhullMessage()), QString("Append 1\nAppend 2\n"));
        q.clearQhullMessage();
        QVERIFY(!q.hasQhullMessage());
        QCOMPARE(QString::fromStdString(q.qhullMessage()), QString(""));
    }
    {
        cout << "INFO   : Error stream without output stream\n";
        Qhull q;
        q.setErrorStream(&cout);
        q.setOutputStream(0);
        try{
            q.runQhull(rcube, "Fd");
            QFAIL("runQhull Fd did not fail.");
        }catch (const QhullError &e) {
            cout << "INFO   : Caught " << e;
            QCOMPARE(e.errorCode(), 6029);
        }
        //FIXUP QH11026 Qhullmessage cleared when QhullError thrown.  Switched to e
        //QVERIFY(q.hasQhullMessage());
        //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(6), QString("QH6029"));
        q.clearQhullMessage();
        QVERIFY(!q.hasQhullMessage());
    }
    {
        cout << "INFO   : Error output sent to output stream without error stream\n";
        Qhull q;
        q.setErrorStream(0);
        q.setOutputStream(&cout);
        try{
            q.runQhull(rcube, "Tz H0");
            QFAIL("runQhull TZ did not fail.");
        }catch (const std::exception &e) {
            const char *s= e.what();
            cout << "INFO   : Caught " << s;
            QCOMPARE(QString::fromAscii(s).left(6), QString("QH6023"));
        }
        //FIXUP QH11026 Qhullmessage cleared when QhullError thrown.  Switched to e
        //QVERIFY(q.hasQhullMessage());
        //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(17), QString("qhull: no message"));
        //QCOMPARE(q.qhullStatus(), 6023);
        q.clearQhullMessage();
        QVERIFY(!q.hasQhullMessage());
    }
    {
        cout << "INFO   : No error stream or output stream\n";
        Qhull q;
        q.setErrorStream(0);
        q.setOutputStream(0);
        try{
            q.runQhull(rcube, "Fd");
            QFAIL("outputQhull did not fail.");
        }catch (const std::exception &e) {
            const char *s= e.what();
            cout << "INFO   : Caught " << s;
            QCOMPARE(QString::fromAscii(s).left(6), QString("QH6029"));
        }
        //FIXUP QH11026 Qhullmessage cleared when QhullError thrown.  Switched to e
        //QVERIFY(q.hasQhullMessage());
        //QCOMPARE(QString::fromStdString(q.qhullMessage()).left(9), QString("qhull err"));
        //QCOMPARE(q.qhullStatus(), 6029);
        q.clearQhullMessage();
        QVERIFY(!q.hasQhullMessage());
    }
}//t_message
Beispiel #11
0
QhullVertex::QhullVertex(const Qhull &q, vertexT *v)
: qh_vertex(v ? v : &s_empty_vertex)
, qh_qh(q.qh())
{
}//vertexT
Beispiel #12
0
QhullVertex::QhullVertex(const Qhull &q)
: qh_vertex(&s_empty_vertex)
, qh_qh(q.qh())
{
}//Default
Beispiel #13
0
QhullRidge::QhullRidge(const Qhull &q, ridgeT *r)
: qh_ridge(r ? r : &s_empty_ridge)
, qh_qh(q.qh())
{
}//ridgeT
Beispiel #14
0
QhullRidge::QhullRidge(const Qhull &q)
: qh_ridge(&s_empty_ridge)
, qh_qh(q.qh())
{
}//Default
Beispiel #15
0
QhullSetBase::
QhullSetBase(const Qhull &q, setT *s) 
: qh_set(s ? s : &s_empty_set)
, qh_qh(q.qh())
{
}