Skip to content
Snippets Groups Projects
Commit 4cb32c06 authored by Kersten Schuster's avatar Kersten Schuster
Browse files

Fixed triangle obtuseness and moved it to tests.

parent c2f7a882
No related branches found
No related tags found
1 merge request!34Added method for testing obtuseness of triangle.
......@@ -44,6 +44,5 @@
#include <typed-geometry/functions/subvector.hh>
#include <typed-geometry/functions/tangent.hh>
#include <typed-geometry/functions/translation.hh>
#include <typed-geometry/functions/triangle.hh>
#include <typed-geometry/functions/uniform.hh>
#include <typed-geometry/functions/volume.hh>
......@@ -254,4 +254,12 @@ struct identity_fun
}
};
template <class T>
void swap(T& a, T& b)
{
T tmp = static_cast<T&&>(a);
a = static_cast<T&&>(b);
b = static_cast<T&&>(tmp);
}
} // namespace tg
#pragma once
#include <typed-geometry/detail/utility.hh>
#include <typed-geometry/functions/distance.hh>
#include <typed-geometry/types/objects/triangle.hh>
namespace tg
{
enum class obtuseness_class
enum class triangle_obtuseness
{
obtuse, // one angle > 90°
right, // one angle = 90°
nonobtuse // all angles < 90° (aka acute)
obtuse, // largest angle > 90°
right, // largest angle = 90°
acute // largest angles < 90°
};
template <int D, class ScalarT>
TG_NODISCARD constexpr obtuseness_class triangle_obtuseness(triangle<D, ScalarT> const& t)
TG_NODISCARD constexpr triangle_obtuseness classify_obtuseness(triangle<D, ScalarT> const& t)
{
auto e0sqr = tg::distance(t.pos0, t.pos1);
auto e1sqr = tg::distance(t.pos1, t.pos2);
auto e2sqr = tg::distance(t.pos2, t.pos0);
auto e0sqr = tg::distance_sqr(t.pos0, t.pos1);
auto e1sqr = tg::distance_sqr(t.pos1, t.pos2);
auto e2sqr = tg::distance_sqr(t.pos2, t.pos0);
// make e0sqr longest (squared) edge
if (e1sqr > e0sqr)
std::swap(e0sqr, e1sqr);
tg::swap(e0sqr, e1sqr);
if (e2sqr > e0sqr)
std::swap(e0sqr, e2sqr);
tg::swap(e0sqr, e2sqr);
auto test = e0sqr - e1sqr - e2sqr;
if (test > ScalarT(0))
return obtuseness_class::obtuse;
return triangle_obtuseness::obtuse;
if (test < ScalarT(0))
return obtuseness_class::nonobtuse;
return obtuseness_class::right;
return triangle_obtuseness::acute;
return triangle_obtuseness::right;
}
template <int D, class ScalarT>
TG_NODISCARD constexpr obtuseness_class is_obtuse_triangle(triangle<D, ScalarT> const& t)
TG_NODISCARD constexpr triangle_obtuseness is_obtuse_triangle(triangle<D, ScalarT> const& t)
{
return triangle_obtuseness(t) == obtuseness_class::obtuse;
return classify_obtuseness(t) == triangle_obtuseness::obtuse;
}
template <int D, class ScalarT>
TG_NODISCARD constexpr obtuseness_class is_right_triangle(triangle<D, ScalarT> const& t)
TG_NODISCARD constexpr triangle_obtuseness is_right_triangle(triangle<D, ScalarT> const& t)
{
return triangle_obtuseness(t) == obtuseness_class::right;
return classify_obtuseness(t) == triangle_obtuseness::right;
}
template <int D, class ScalarT>
TG_NODISCARD constexpr obtuseness_class is_nonobtuse_triangle(triangle<D, ScalarT> const& t)
TG_NODISCARD constexpr triangle_obtuseness is_nonobtuse_triangle(triangle<D, ScalarT> const& t)
{
return triangle_obtuseness(t) == obtuseness_class::nonobtuse;
return classify_obtuseness(t) != triangle_obtuseness::obtuse;
}
template <int D, class ScalarT>
TG_NODISCARD constexpr obtuseness_class is_acute_triangle(triangle<D, ScalarT> const& t)
TG_NODISCARD constexpr triangle_obtuseness is_acute_triangle(triangle<D, ScalarT> const& t)
{
return is_nonobtuse_triangle(t);
return classify_obtuseness(t) == triangle_obtuseness::acute;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment