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) |
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