summaryrefslogtreecommitdiffstats
path: root/tests/auto/threed/qtriangle3d/tst_qtriangle3d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/threed/qtriangle3d/tst_qtriangle3d.cpp')
-rw-r--r--tests/auto/threed/qtriangle3d/tst_qtriangle3d.cpp714
1 files changed, 0 insertions, 714 deletions
diff --git a/tests/auto/threed/qtriangle3d/tst_qtriangle3d.cpp b/tests/auto/threed/qtriangle3d/tst_qtriangle3d.cpp
deleted file mode 100644
index e9df6abe..00000000
--- a/tests/auto/threed/qtriangle3d/tst_qtriangle3d.cpp
+++ /dev/null
@@ -1,714 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtQuick3D module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtTest/QtTest>
-#include "qtriangle3d.h"
-#include "qplane3d.h"
-
-class tst_QTriangle3D : public QObject
-{
- Q_OBJECT
-public:
- tst_QTriangle3D() {}
- ~tst_QTriangle3D() {}
-
-private slots:
- void defaultTriangle();
-
- void create_data();
- void create();
-
- void contains_data();
- void contains();
-
- void intersect_data();
- void intersect();
-
- void uv_data();
- void uv();
-
- void transform_data();
- void transform();
-
- void compare();
-
- void dataStream();
-
- void properties();
- void metaTypes();
-};
-
-void tst_QTriangle3D::defaultTriangle()
-{
- QTriangle3D triangle;
- QCOMPARE(triangle.p(), QVector3D(0.0f, 0.0f, 0.0f));
- QCOMPARE(triangle.q(), QVector3D(1.0f, 0.0f, 0.0f));
- QCOMPARE(triangle.r(), QVector3D(0.0f, 1.0f, 0.0f));
-}
-
-void tst_QTriangle3D::create_data()
-{
- QTest::addColumn<QVector3D>("p");
- QTest::addColumn<QVector3D>("q");
- QTest::addColumn<QVector3D>("r");
- QTest::addColumn<bool>("isDegenerate");
- QTest::addColumn<QPlane3D>("plane");
- QTest::addColumn<QVector3D>("centroid");
-
- QTest::newRow("minimal at null")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 0.0f, 0.0f) // q
- << QVector3D(0.0f, 0.0f, 0.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 0.0f);
- QTest::newRow("minimal at offset")
- << QVector3D(2.0f, 2.0f, 2.0f) // p
- << QVector3D(2.0f, 2.0f, 2.0f) // q
- << QVector3D(2.0f, 2.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(2.0f, 2.0f, 2.0f); // centroid
- QTest::newRow("line from 0(p) [a]")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 0.0f, 0.5f) // q
- << QVector3D(0.0f, 0.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 2.5f/3.0f); // centroid
- QTest::newRow("line from 0(p) [b]")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 0.0f, 1.0f) // q
- << QVector3D(0.0f, 0.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 1.0f); // centroid
- QTest::newRow("line from 0(p) [c]")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 0.0f, 1.5f) // q
- << QVector3D(0.0f, 0.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 3.5f/3.0f); // centroid
- QTest::newRow("line from 0(q) [a]")
- << QVector3D(0.0f, 0.0f, 0.5f) // p
- << QVector3D(0.0f, 0.0f, 0.0f) // q
- << QVector3D(0.0f, 0.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 2.5f/3.0f); // centroid
- QTest::newRow("line from 0(q) [b]")
- << QVector3D(0.0f, 0.0f, 1.0f) // p
- << QVector3D(0.0f, 0.0f, 0.0f) // q
- << QVector3D(0.0f, 0.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 1.0f); // centroid
- QTest::newRow("line from 0(q) [c]")
- << QVector3D(0.0f, 0.0f, 1.5f) // p
- << QVector3D(0.0f, 0.0f, 0.0f) // q
- << QVector3D(0.0f, 0.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 3.5f/3.0f); // centroid
- QTest::newRow("line from 0(r) [a]")
- << QVector3D(0.0f, 0.0f, 0.5f) // p
- << QVector3D(0.0f, 0.0f, 2.0f) // q
- << QVector3D(0.0f, 0.0f, 0.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 2.5f/3.0f); // centroid
- QTest::newRow("line from 0(r) [b]")
- << QVector3D(0.0f, 0.0f, 1.0f) // p
- << QVector3D(0.0f, 0.0f, 2.0f) // q
- << QVector3D(0.0f, 0.0f, 0.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 1.0f); // centroid
- QTest::newRow("line from 0(r) [c]")
- << QVector3D(0.0f, 0.0f, 1.5f) // p
- << QVector3D(0.0f, 0.0f, 2.0f) // q
- << QVector3D(0.0f, 0.0f, 0.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 3.5f/3.0f); // centroid
- QTest::newRow("width 0 [a]")
- << QVector3D(0.0f, 0.0f, 2.0f) // p
- << QVector3D(0.0f, 0.0f, 2.0f) // q
- << QVector3D(0.0f, 0.0f, 0.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 4.0f/3.0f); // centroid
- QTest::newRow("width 0 [b]")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 0.0f, 0.0f) // q
- << QVector3D(0.0f, 0.0f, 2.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 2.0f/3.0f); // centroid
- QTest::newRow("width 0 [c]")
- << QVector3D(0.0f, 0.0f, 2.0f) // p
- << QVector3D(0.0f, 0.0f, 2.0f) // q
- << QVector3D(0.0f, 0.0f, 4.0f) // r
- << true // degenerate
- << QPlane3D() // plane (degenerate, meaning meaningless)
- << QVector3D(0.0f, 0.0f, 8.0f/3.0f); // centroid
-
- /* The above only tests degenerate triangles colinear with the z axis.
- May also want to tests degenerate triangles offset from origin and
- degenerate triangles on other angles (e.g. x axis, y axis, not colinear
- with any axis)
- */
-
- QTest::newRow("simple at origin")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 4.0f, 0.0f) // q
- << QVector3D(0.0f, 2.0f, 5.0f) // r
- << false // degenerate
- << QPlane3D(QVector3D(0.0f, 0.0f, 0.0f), QVector3D(1.0f, 0.0f, 0.0f)) // plane
- << QVector3D(0.0f, 6.0f/3.0f, 5.0f/3.0f); // centroid
-
- QTest::newRow("simple offset from origin")
- << QVector3D(1.0f, 1.0f, 0.0f) // p
- << QVector3D(1.0f, 5.0f, 0.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << false // degenerate
- << QPlane3D(QVector3D(1.0f, 0.0f, 0.0f), QVector3D(1.0f, 0.0f, 0.0f)) // plane
- << QVector3D(1.0f, 3.0f, 5.0f/3.0f); // centroid
-}
-
-void tst_QTriangle3D::create()
-{
- QFETCH(QVector3D, p);
- QFETCH(QVector3D, q);
- QFETCH(QVector3D, r);
- QFETCH(bool, isDegenerate);
- QFETCH(QPlane3D, plane);
- QFETCH(QVector3D, centroid);
-
- QTriangle3D triangle(p, q, r);
-
- QCOMPARE(triangle.p(), p);
- QCOMPARE(triangle.q(), q);
- QCOMPARE(triangle.r(), r);
-
- QCOMPARE(triangle.faceNormal(), QVector3D::crossProduct(q - p, r - q));
-
- if (!isDegenerate) {
- QPlane3D trianglePlane = triangle.plane();
- QVERIFY(plane.contains(trianglePlane.origin()));
- QCOMPARE(plane.normal().normalized(),
- trianglePlane.normal().normalized());
- }
- QCOMPARE(triangle.center(), centroid);
-
- QTriangle3D triangle2;
- triangle2.setP(p);
- triangle2.setQ(q);
- triangle2.setR(r);
- QCOMPARE(triangle2.p(), p);
- QCOMPARE(triangle2.q(), q);
- QCOMPARE(triangle2.r(), r);
- QVERIFY(triangle == triangle2);
-}
-
-void tst_QTriangle3D::contains_data()
-{
- QTest::addColumn<QVector3D>("p");
- QTest::addColumn<QVector3D>("q");
- QTest::addColumn<QVector3D>("r");
- QTest::addColumn<QVector3D>("point");
- QTest::addColumn<bool>("contains");
-
- QTest::newRow("minimal at null, same")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 0.0f, 0.0f) // q
- << QVector3D(0.0f, 0.0f, 0.0f) // r
- << QVector3D(0.0f, 0.0f, 0.0f) // point
- << false; // contains
- QTest::newRow("acute at p")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.0f, 2.0f) // point
- << true; // contains
- QTest::newRow("acute at q")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.0f, 4.0f) // point
- << true; // contains
- QTest::newRow("acute at r")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 3.0f, 3.0f) // point
- << true; // contains
- QTest::newRow("acute at p-q")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.0f, 3.0f) // point
- << true; // contains
- QTest::newRow("acute at p-r")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.5f, 2.5f) // point
- << true; // contains
- QTest::newRow("acute at q-r")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.5f, 3.5f) // point
- << true; // contains
- QTest::newRow("acute internal")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.5f, 3.0f) // point
- << true; // contains
- QTest::newRow("acute external a")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.8f, 2.0f) // point
- << false; // contains
- QTest::newRow("acute external b")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 2.8f, 4.0f) // point
- << false; // contains
- QTest::newRow("acute external c")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.0f, 1.4f, 3.0f) // point
- << false; // contains
- QTest::newRow("acute above plane")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(1.3f, 2.5f, 3.0f) // point
- << false; // contains
- QTest::newRow("acute below plane")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.8f, 2.5f, 3.0f) // point
- << false; // contains
- QTest::newRow("obtuse a")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(1.0f, 2.5f, 4.8f) // point
- << false; // contains
- QTest::newRow("obtuse b")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(1.0f, 2.5f, 4.3f) // point
- << true; // contains
- QTest::newRow("obtuse c")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(1.0f, 2.5f, 4.5f) // point
- << true; // contains
- QTest::newRow("obtuse d")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(1.2f, 2.5f, 4.3f) // point
- << false; // contains
- QTest::newRow("obtuse e")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(0.8f, 2.5f, 4.3f) // point
- << false; // contains
-}
-
-void tst_QTriangle3D::contains()
-{
- QFETCH(QVector3D, p);
- QFETCH(QVector3D, q);
- QFETCH(QVector3D, r);
- QFETCH(QVector3D, point);
- QFETCH(bool, contains);
- // qDebug("Triangle: P(%0.10f, %0.10f, %0.10f) Q(%0.10f, %0.10f, %0.10f) R(%0.10f, %0.10f, %0.10f)",
- // p.x(), p.y(), p.z(), q.x(), q.y(), q.z(), r.x(), r.y(), r.z());
- // qDebug("Point: (%0.10f, %0.10f, %0.10f)", point.x(), point.y(), point.z());
- QCOMPARE(QTriangle3D(p, q, r).contains(point), contains);
-}
-
-void tst_QTriangle3D::intersect_data()
-{
- QTest::addColumn<QVector3D>("p");
- QTest::addColumn<QVector3D>("q");
- QTest::addColumn<QVector3D>("r");
- QTest::addColumn<QVector3D>("origin");
- QTest::addColumn<QVector3D>("direction");
- QTest::addColumn<QVector3D>("intersection");
- QTest::addColumn<bool>("doesIntersect");
-
- QTest::newRow("minimal at null, same")
- << QVector3D(0.0f, 0.0f, 0.0f) // p
- << QVector3D(0.0f, 0.0f, 0.0f) // q
- << QVector3D(0.0f, 0.0f, 0.0f) // r
- << QVector3D(0.0f, 0.0f, 0.0f) // origin
- << QVector3D(0.0f, 0.0f, 1.0f) // direction
- << QVector3D(0.0f, 0.0f, 0.0f) // intersection
- << false; // degenerate triangles cannot intersect
-
- /*
- lines perpendicular to triangle plane.
- */
- QTest::newRow("acute at p")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.0f, 2.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.0f, 2.0f) // intersection
- << true; // intersects
- QTest::newRow("acute at q")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.0f, 4.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.0f, 4.0f) // intersection
- << true; // intersects
- QTest::newRow("acute at r")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 3.0f, 3.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 3.0f, 3.0f) // intersection
- << true; // intersects
- QTest::newRow("acute at p-q")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.0f, 3.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.0f, 3.0f) // intersection
- << true; // intersects
- QTest::newRow("acute at p-r")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.5f, 2.5f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.5f, 2.5f) // intersection
- << true; // intersects
- QTest::newRow("acute at q-r")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.5f, 3.5f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.5f, 3.5f) // intersection
- << true; // intersects
- QTest::newRow("acute internal")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.5f, 3.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.5f, 3.0f) // intersection
- << true; // intersects
- QTest::newRow("acute external a")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.8f, 2.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(0.0f, 0.0f, 0.0f) // intersection
- << false; // intersects
- QTest::newRow("acute external b")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 2.8f, 4.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(0.0f, 0.0f, 0.0f) // intersection
- << false; // intersects
- QTest::newRow("acute external c")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 3.0f) // r
- << QVector3D(0.0f, 1.4f, 3.0f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(0.0f, 0.0f, 0.0f) // intersection
- << false; // intersects
- QTest::newRow("obtuse a")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(0.0f, 2.5f, 4.8f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(0.0f, 0.0f, 0.0f) // intersection
- << false; // intersects
- QTest::newRow("obtuse b")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(0.0f, 2.5f, 4.3f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.5f, 4.3f) // intersection
- << true; // intersects
- QTest::newRow("obtuse c")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(0.0f, 2.5f, 4.5f) // origin
- << QVector3D(1.0f, 0.0f, 0.0f) // direction
- << QVector3D(1.0f, 2.5f, 4.5f) // intersection
- << true; // intersects
-
- QTest::newRow("in-triangle-plane")
- << QVector3D(1.0f, 2.0f, 2.0f) // p
- << QVector3D(1.0f, 2.0f, 4.0f) // q
- << QVector3D(1.0f, 3.0f, 5.0f) // r
- << QVector3D(1.0f, 2.0f, 2.0f) // origin (p)
- << QVector3D(0.0f, 0.0f, 2.0f) // direction (q - p)
- << QVector3D(0.0f, 0.0f, 0.0f) // intersection
- << false; // intersects
-}
-
-void tst_QTriangle3D::intersect()
-{
- QFETCH(QVector3D, p);
- QFETCH(QVector3D, q);
- QFETCH(QVector3D, r);
- QFETCH(QVector3D, origin);
- QFETCH(QVector3D, direction);
- QFETCH(QVector3D, intersection);
- QFETCH(bool, doesIntersect);
-
- QTriangle3D triangle(p, q, r);
- QRay3D line(origin, direction);
- QCOMPARE(triangle.intersects(line), doesIntersect);
-
- qreal result = triangle.intersection(line);
- if (doesIntersect)
- QCOMPARE(line.point(result), intersection);
- else
- QVERIFY(qIsNaN(result));
-}
-
-void tst_QTriangle3D::uv_data()
-{
- contains_data();
-}
-
-void tst_QTriangle3D::uv()
-{
- QFETCH(QVector3D, p);
- QFETCH(QVector3D, q);
- QFETCH(QVector3D, r);
-
- if (p == q || p == r || q == r)
- return; // Ignore degenerate triangles for this test.
-
- QTriangle3D triangle(p, q, r);
-
- QCOMPARE(triangle.uv(p), QVector2D(1, 0));
- QCOMPARE(triangle.uv(q), QVector2D(0, 1));
- QCOMPARE(triangle.uv(r), QVector2D(0, 0));
-
- QCOMPARE(triangle.uv((p + q) / 2.0f), QVector2D(0.5f, 0.5f));
- QCOMPARE(triangle.uv((p + r) / 2.0f), QVector2D(0.5f, 0.0f));
- QCOMPARE(triangle.uv((q + r) / 2.0f), QVector2D(0.0f, 0.5f));
-
- QVector2D v1(triangle.uv((p + q + r) / 3.0f));
- QVector2D v2(1.0f / 3.0f, 1.0f / 3.0f);
- QVERIFY(qFuzzyCompare(float(v1.x()), float(v2.x())));
- QVERIFY(qFuzzyCompare(float(v1.y()), float(v2.y())));
-}
-
-void tst_QTriangle3D::transform_data()
-{
- create_data();
-}
-
-void tst_QTriangle3D::transform()
-{
- QFETCH(QVector3D, p);
- QFETCH(QVector3D, q);
- QFETCH(QVector3D, r);
-
- QMatrix4x4 m;
- m.translate(-1.0f, 2.5f, 5.0f);
- m.rotate(45.0f, 1.0f, 1.0f, 1.0f);
- m.scale(23.5f);
-
- QTriangle3D tri1(p, q, r);
- QTriangle3D tri2(tri1);
- QTriangle3D tri3;
-
- tri1.transform(m);
- tri3 = tri2.transformed(m);
-
- QCOMPARE(tri1.p(), tri3.p());
- QCOMPARE(tri1.q(), tri3.q());
- QCOMPARE(tri1.r(), tri3.r());
-
- QCOMPARE(tri1.p(), m * p);
- QCOMPARE(tri1.q(), m * q);
- QCOMPARE(tri1.r(), m * r);
-}
-
-void tst_QTriangle3D::compare()
-{
- QVector3D p1(1.0f, 2.0f, 3.0f);
- QVector3D q1(4.0f, 5.0f, 6.0f);
- QVector3D r1(7.0f, 8.0f, 9.0f);
- QVector3D p2(-1.0f, -2.0f, -3.0f);
- QVector3D q2(-4.0f, -5.0f, -6.0f);
- QVector3D r2(-7.0f, -8.0f, -9.0f);
-
- QTriangle3D tri1(p1, q1, r1);
- QTriangle3D tri2(p1, q1, r1);
- QVERIFY(tri1 == tri2);
- QVERIFY(!(tri1 != tri2));
- QVERIFY(qFuzzyCompare(tri1, tri2));
-
- QTriangle3D tri3(p2, q1, r1);
- QVERIFY(tri1 != tri3);
- QVERIFY(!(tri1 == tri3));
- QVERIFY(!qFuzzyCompare(tri1, tri3));
-
- QTriangle3D tri4(p1, q2, r1);
- QVERIFY(tri1 != tri4);
- QVERIFY(!(tri1 == tri4));
- QVERIFY(!qFuzzyCompare(tri1, tri4));
-
- QTriangle3D tri5(p1, q1, r2);
- QVERIFY(tri1 != tri5);
- QVERIFY(!(tri1 == tri5));
- QVERIFY(!qFuzzyCompare(tri1, tri5));
-
- QTriangle3D tri6(p2, q2, r2);
- QVERIFY(tri1 != tri6);
- QVERIFY(!(tri1 == tri6));
- QVERIFY(!qFuzzyCompare(tri1, tri6));
-}
-
-void tst_QTriangle3D::dataStream()
-{
-#ifndef QT_NO_DATASTREAM
- QTriangle3D triangle(QVector3D(1.0f, 2.0f, 3.0f),
- QVector3D(4.0f, 5.0f, 6.0f),
- QVector3D(7.0f, 8.0f, 9.0f));
-
- QByteArray data;
- {
- QDataStream stream(&data, QIODevice::WriteOnly);
- stream << triangle;
- }
-
- QTriangle3D triangle2;
- {
- QDataStream stream2(data);
- stream2 >> triangle2;
- }
-
- QVERIFY(triangle == triangle2);
-#endif
-}
-
-class tst_QTriangle3DProperties : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(QTriangle3D triangle READ triangle WRITE setTriangle)
-public:
- tst_QTriangle3DProperties(QObject *parent = 0) : QObject(parent) {}
-
- QTriangle3D triangle() const { return t; }
- void setTriangle(const QTriangle3D& value) { t = value; }
-
-private:
- QTriangle3D t;
-};
-
-// Test getting and setting properties via the metaobject system.
-void tst_QTriangle3D::properties()
-{
- tst_QTriangle3DProperties obj;
-
- qRegisterMetaType<QTriangle3D>();
-
- obj.setTriangle(QTriangle3D(QVector3D(1, 2, 3), QVector3D(4, 5, 6),
- QVector3D(7, 8, 9)));
-
- QTriangle3D t = qVariantValue<QTriangle3D>(obj.property("triangle"));
- QCOMPARE(t.p(), QVector3D(1, 2, 3));
- QCOMPARE(t.q(), QVector3D(4, 5, 6));
- QCOMPARE(t.r(), QVector3D(7, 8, 9));
-
- obj.setProperty("triangle",
- qVariantFromValue
- (QTriangle3D(QVector3D(-1, -2, -3),
- QVector3D(-4, -5, -6),
- QVector3D(-7, -8, -9))));
-
- t = qVariantValue<QTriangle3D>(obj.property("triangle"));
- QCOMPARE(t.p(), QVector3D(-1, -2, -3));
- QCOMPARE(t.q(), QVector3D(-4, -5, -6));
- QCOMPARE(t.r(), QVector3D(-7, -8, -9));
-}
-
-void tst_QTriangle3D::metaTypes()
-{
- int id = qMetaTypeId<QTriangle3D>();
- QVERIFY(QMetaType::type("QTriangle3D") == id);
- QCOMPARE(QByteArray(QMetaType::typeName(id)), QByteArray("QTriangle3D"));
- QVERIFY(QMetaType::isRegistered(id));
-}
-
-QTEST_APPLESS_MAIN(tst_QTriangle3D)
-
-#include "tst_qtriangle3d.moc"