Skip to content
Snippets Groups Projects
Commit d1ed975c authored by Stephan Schulz's avatar Stephan Schulz Committed by Rene Halver
Browse files

Fix point distance calculation

parent d69ed0df
No related branches found
No related tags found
1 merge request!21Fix point distance calculation
...@@ -11,6 +11,13 @@ Version 1.0.0 ...@@ -11,6 +11,13 @@ Version 1.0.0
Version 0.9 Version 0.9
----------- -----------
Version 0.9.3
*************
- Bug: ALL::Point.dist_plane(..) had a type bug. This manifestes with a cuda
compiler even without explicit usage of the function. Fixed and added
corresponding test.
Version 0.9.2 Version 0.9.2
************* *************
......
...@@ -220,31 +220,17 @@ public: ...@@ -220,31 +220,17 @@ public:
throw PointDimensionMissmatchException(__FILE__, __func__, __LINE__); throw PointDimensionMissmatchException(__FILE__, __func__, __LINE__);
// vectors spanning the plane from vertex 'a' // vectors spanning the plane from vertex 'a'
T vb[3]; Point<T> vb = B - A;
T vc[3]; Point<T> vc = C - A;
for (int i = 0; i < 3; ++i) {
vb[i] = B[i] - A[i];
vc[i] = C[i] - A[i];
}
// normal vector of plane // normal vector of plane
T n[3]; Point<T> n = vb.cross(vc);
n = n/n.norm();
n[0] = vb[1] * vc[2] - vb[2] * vc[1];
n[1] = vb[2] * vc[0] - vb[0] * vc[2];
n[2] = vb[0] * vc[1] - vb[1] * vc[0];
// length of normal vector
T dn = n.norm();
// distance from origin // return r.n - A.n = (r-A).n as distance from plane to r
T d = n * A; return std::abs( (coordinates.at(0) - A[0]) * n[0] +
(coordinates.at(1) - A[1]) * n[1] +
// compute distance of test vertex to plane (coordinates.at(2) - A[2]) * n[2] );
return std::abs((n[0] * coordinates.at(0) + n[1] * coordinates.at(1) +
n[2] * coordinates.at(2) - d) /
dn);
} }
/// operator for the addition of two point objects /// operator for the addition of two point objects
...@@ -301,6 +287,17 @@ public: ...@@ -301,6 +287,17 @@ public:
return result; return result;
} }
/// operator to scale the local point object by a provided factor
/// @param rhs scaling factor
/// @return scaled point object
Point<T> operator/(const T &rhs) const {
Point<T> result(dimension);
for (int d = 0; d < dimension; ++d) {
result[d] = coordinates.at(d) / rhs;
}
return result;
}
/// operator to compute the cross product between two point objects /// operator to compute the cross product between two point objects
/// @param rhs point object to compute the cross product with /// @param rhs point object to compute the cross product with
/// @return cross product between the two point objects /// @return cross product between the two point objects
......
...@@ -172,5 +172,20 @@ BOOST_AUTO_TEST_CASE(point_scale_long_double) { ...@@ -172,5 +172,20 @@ BOOST_AUTO_TEST_CASE(point_scale_long_double) {
BOOST_CHECK_CLOSE(C2[2],4.4l,1e-14); BOOST_CHECK_CLOSE(C2[2],4.4l,1e-14);
} }
BOOST_AUTO_TEST_CASE(point_dist_plane) {
std::vector<double> A_data = {1.,0.,0.};
std::vector<double> B_data = {0.,1.,0.};
std::vector<double> C_data = {0.,0.,1.};
std::vector<double> p_data = {0.5,0.5,0.5};
ALL::Point<double> A(A_data);
ALL::Point<double> B(B_data);
ALL::Point<double> C(C_data);
ALL::Point<double> p(p_data);
double dist = p.dist_plane(A,B,C);
BOOST_CHECK_CLOSE(dist, 0.28867513459481292, 1e-14);
}
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment