Commit 6c5460a9 authored by Dennis Gläser's avatar Dennis Gläser
Browse files

[geomisection][2d-2d-3d] minimize occurrences of sqrt

parent 1d77e587
......@@ -871,26 +871,32 @@ public:
// if the geometries are not parallel, there cannot be a polygon intersection
const auto a1 = geo1.corner(1) - geo1.corner(0);
const auto b1 = geo1.corner(2) - geo1.corner(0);
auto n1 = crossProduct(a1, b1);
n1 /= n1.two_norm();
const auto n1 = crossProduct(a1, b1);
const auto a2 = geo2.corner(1) - geo2.corner(0);
const auto b2 = geo2.corner(2) - geo2.corner(0);
auto n2 = crossProduct(a2, b2);
n2 /= n2.two_norm();
const auto n2 = crossProduct(a2, b2);
// TODO: Use two_norm2() over two_norm() & modify check accordingly
using std::max;
using std::sqrt;
const auto a1Norm2 = a1.two_norm2();
const auto b1Norm2 = b1.two_norm2();
const auto maxNorm2 = max(a1Norm2, b1Norm2);
const auto eps2 = maxNorm2*eps_;
const auto eps = sqrt(maxNorm2)*eps_;
const auto eps3 = eps*eps2;
// early exit if polygons are not parallel
using std::abs;
if ( abs(abs(n1*n2) - 1.0) > eps_)
if (crossProduct(n1, n2).two_norm2() > eps2*maxNorm2)
return false;
// they are parallel, verify that they are on the same plane
auto d1 = geo2.corner(0) - geo1.corner(0);
if (d1.two_norm2() < eps_*eps_)
if (d1.two_norm2() < eps2)
d1 = geo2.corner(1) - geo1.corner(0);
d1 /= d1.two_norm();
if (abs(d1*n2) > eps_)
if (abs(d1*n2) > eps3)
return false;
// the candidate intersection points
......@@ -946,7 +952,6 @@ public:
return false;
// remove duplicates
const auto eps = (geo1.corner(0) - geo1.corner(1)).two_norm()*eps_;
std::sort(points.begin(), points.end(), [&eps](const auto& a, const auto& b) -> bool
{
using std::abs;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment