mirror of https://github.com/mosra/magnum.git
4 changed files with 139 additions and 0 deletions
@ -0,0 +1,61 @@
|
||||
#ifndef Magnum_Math_Geometry_Distance_h |
||||
#define Magnum_Math_Geometry_Distance_h |
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
/** @file
|
||||
* @brief Class Magnum::Math::Geometry::Distance |
||||
*/ |
||||
|
||||
#include "Math/Vector3.h" |
||||
|
||||
namespace Magnum { namespace Math { namespace Geometry { |
||||
|
||||
/** @brief Functions for computing distances */ |
||||
class Distance { |
||||
public: |
||||
/**
|
||||
* @brief %Distance of line and point |
||||
* @param a First point of the line |
||||
* @param b Second point of the line |
||||
* @param point Point |
||||
* |
||||
* The distance *d* is computed from point **p** and line defined by **a** |
||||
* and **b** using @ref Vector3::cross() "cross product": |
||||
* @f[ |
||||
* d = \frac{|(\boldsymbol p - \boldsymbol a) \times (\boldsymbol p - \boldsymbol b)|} |
||||
* {|\boldsymbol b - \boldsymbol a|} |
||||
* @f] |
||||
* |
||||
* @see linePointSquared() |
||||
*/ |
||||
template<class T> inline static T linePoint(const Vector3<T>& a, const Vector3<T>& b, const Vector3<T>& point) { |
||||
return sqrt(linePointSquared(a, b, point)); |
||||
} |
||||
|
||||
/**
|
||||
* @brief %Distance of line and point, squared |
||||
* |
||||
* More efficient than linePoint() for comparing distance with other |
||||
* values, because it doesn't compute the square root. |
||||
*/ |
||||
template<class T> static T linePointSquared(const Vector3<T>& a, const Vector3<T>& b, const Vector3<T>& point) { |
||||
return Vector3<T>::cross(point - a, point - b).lengthSquared()/(b - a).lengthSquared(); |
||||
} |
||||
}; |
||||
|
||||
}}} |
||||
|
||||
#endif |
||||
@ -1 +1,2 @@
|
||||
corrade_add_test(MathGeometryDistanceTest DistanceTest.h DistanceTest.cpp) |
||||
corrade_add_test(MathGeometryIntersectionTest IntersectionTest.h IntersectionTest.cpp) |
||||
|
||||
@ -0,0 +1,46 @@
|
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
#include "DistanceTest.h" |
||||
|
||||
#include <limits> |
||||
#include <QtTest/QTest> |
||||
|
||||
#include "Math.h" |
||||
#include "Distance.h" |
||||
|
||||
QTEST_APPLESS_MAIN(Magnum::Math::Geometry::Test::DistanceTest) |
||||
|
||||
using namespace std; |
||||
|
||||
namespace Magnum { namespace Math { namespace Geometry { namespace Test { |
||||
|
||||
typedef Magnum::Math::Vector3<float> Vector3; |
||||
|
||||
void DistanceTest::linePoint() { |
||||
Vector3 a(0.0f); |
||||
Vector3 b(1.0f); |
||||
|
||||
/* Point on the line */ |
||||
QCOMPARE((Distance::linePoint(a, b, Vector3(0.25f))), 0.0f); |
||||
|
||||
/* The distance should be the same for all equidistant points */ |
||||
QCOMPARE((Distance::linePoint(a, b, Vector3(1.0f, 0.0f, 1.0f))), |
||||
Constants<float>::Sqrt2/Constants<float>::Sqrt3); |
||||
QCOMPARE((Distance::linePoint(a, b, Vector3(1.0f, 0.0f, 1.0f)+Vector3(100.0f))), |
||||
Constants<float>::Sqrt2/Constants<float>::Sqrt3); |
||||
} |
||||
|
||||
}}}} |
||||
@ -0,0 +1,31 @@
|
||||
#ifndef Magnum_Math_Geometry_Test_DistanceTest_h |
||||
#define Magnum_Math_Geometry_Test_DistanceTest_h |
||||
/*
|
||||
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
This file is part of Magnum. |
||||
|
||||
Magnum is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU Lesser General Public License version 3 |
||||
only, as published by the Free Software Foundation. |
||||
|
||||
Magnum is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU Lesser General Public License version 3 for more details. |
||||
*/ |
||||
|
||||
#include <QtCore/QObject> |
||||
|
||||
namespace Magnum { namespace Math { namespace Geometry { namespace Test { |
||||
|
||||
class DistanceTest: public QObject { |
||||
Q_OBJECT |
||||
|
||||
private slots: |
||||
void linePoint(); |
||||
}; |
||||
|
||||
}}}} |
||||
|
||||
#endif |
||||
Loading…
Reference in new issue