overte/tests/shared/src/CubicHermiteSplineTests.cpp
2018-05-24 12:42:33 -07:00

77 lines
2.8 KiB
C++

//
// CubicHermiteSplineTests.cpp
// tests/shared/src
//
// Copyright 2017 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "CubicHermiteSplineTests.h"
#include <test-utils/QTestExtensions.h>
#include <QtCore/QDebug>
#include "CubicHermiteSpline.h"
QTEST_MAIN(CubicHermiteSplineTests)
void CubicHermiteSplineTests::testCubicHermiteSplineFunctor() {
glm::vec3 p0(0.0f, 0.0f, 0.0f);
glm::vec3 m0(1.0f, 0.0f, 0.0f);
glm::vec3 p1(1.0f, 1.0f, 0.0f);
glm::vec3 m1(2.0f, 0.0f, 0.0f);
CubicHermiteSplineFunctor hermiteSpline(p0, m0, p1, m1);
const float EPSILON = 0.0001f;
QCOMPARE_WITH_ABS_ERROR(p0, hermiteSpline(0.0f), EPSILON);
QCOMPARE_WITH_ABS_ERROR(p1, hermiteSpline(1.0f), EPSILON);
// these values were computed offline.
const glm::vec3 oneFourth(0.203125f, 0.15625f, 0.0f);
const glm::vec3 oneHalf(0.375f, 0.5f, 0.0f);
const glm::vec3 threeFourths(0.609375f, 0.84375f, 0.0f);
QCOMPARE_WITH_ABS_ERROR(oneFourth, hermiteSpline(0.25f), EPSILON);
QCOMPARE_WITH_ABS_ERROR(oneHalf, hermiteSpline(0.5f), EPSILON);
QCOMPARE_WITH_ABS_ERROR(threeFourths, hermiteSpline(0.75f), EPSILON);
}
void CubicHermiteSplineTests::testCubicHermiteSplineFunctorWithArcLength() {
glm::vec3 p0(0.0f, 0.0f, 0.0f);
glm::vec3 m0(1.0f, 0.0f, 0.0f);
glm::vec3 p1(1.0f, 1.0f, 0.0f);
glm::vec3 m1(2.0f, 0.0f, 0.0f);
CubicHermiteSplineFunctorWithArcLength hermiteSpline(p0, m0, p1, m1);
const float EPSILON = 0.001f;
float arcLengths[5] = {
hermiteSpline.arcLength(0.0f),
hermiteSpline.arcLength(0.25f),
hermiteSpline.arcLength(0.5f),
hermiteSpline.arcLength(0.75f),
hermiteSpline.arcLength(1.0f)
};
// these values were computed offline
float referenceArcLengths[5] = {
0.0f,
0.268317f,
0.652788f,
1.07096f,
1.50267f
};
QCOMPARE_WITH_ABS_ERROR(arcLengths[0], referenceArcLengths[0], EPSILON);
QCOMPARE_WITH_ABS_ERROR(arcLengths[1], referenceArcLengths[1], EPSILON);
QCOMPARE_WITH_ABS_ERROR(arcLengths[2], referenceArcLengths[2], EPSILON);
QCOMPARE_WITH_ABS_ERROR(arcLengths[3], referenceArcLengths[3], EPSILON);
QCOMPARE_WITH_ABS_ERROR(arcLengths[4], referenceArcLengths[4], EPSILON);
QCOMPARE_WITH_ABS_ERROR(0.0f, hermiteSpline.arcLengthInverse(referenceArcLengths[0]), EPSILON);
QCOMPARE_WITH_ABS_ERROR(0.25f, hermiteSpline.arcLengthInverse(referenceArcLengths[1]), EPSILON);
QCOMPARE_WITH_ABS_ERROR(0.5f, hermiteSpline.arcLengthInverse(referenceArcLengths[2]), EPSILON);
QCOMPARE_WITH_ABS_ERROR(0.75f, hermiteSpline.arcLengthInverse(referenceArcLengths[3]), EPSILON);
QCOMPARE_WITH_ABS_ERROR(1.0f, hermiteSpline.arcLengthInverse(referenceArcLengths[4]), EPSILON);
}