triangle: iteration 2

This commit is contained in:
Dmitry Kokorin 2016-03-17 19:12:35 +03:00
parent f0f0058645
commit 489e524385

View file

@ -10,7 +10,6 @@ using namespace std;
namespace { namespace {
inline bool fuzzy_equal(double a, double b) inline bool fuzzy_equal(double a, double b)
{ {
typedef numeric_limits<double> limits_t; typedef numeric_limits<double> limits_t;
@ -24,39 +23,25 @@ inline bool fuzzy_equal(double a, double b)
|| abs(a - b) < min; || abs(a - b) < min;
} }
inline bool is_valid(double a, double b, double c)
{
return a > 0 && b > 0 && c > 0
&& a + b > c
&& a + c > b
&& b + c > a;
} }
inline bool is_equilateral(double a, double b, double c)
{
return fuzzy_equal(a, b)
&& fuzzy_equal(a, c)
&& fuzzy_equal(b, c);
}
inline bool is_isosceles(double a, double b, double c)
{
return fuzzy_equal(a, b)
|| fuzzy_equal(a, c)
|| fuzzy_equal(b, c);
}
}
kind_t kind(double a, double b, double c) kind_t kind(double a, double b, double c)
{ {
if (!is_valid(a, b, c)) if (a > b) swap(a, b);
if (a > c) swap(a, c);
if (b > c) swap(b, c);
if (a <= 0)
throw domain_error("invalid triangle"); throw domain_error("invalid triangle");
if (is_equilateral(a, b, c)) if (a + b <= c)
throw domain_error("");
if (fuzzy_equal(a, c))
return equilateral; return equilateral;
if (is_isosceles(a, b, c)) if (fuzzy_equal(a, b) || fuzzy_equal(b, c))
return isosceles; return isosceles;
return scalene; return scalene;