Skip to content

Instantly share code, notes, and snippets.

@lomomike
Created April 10, 2015 07:11
Show Gist options
  • Save lomomike/7d8c647d37f4f58df59a to your computer and use it in GitHub Desktop.
Save lomomike/7d8c647d37f4f58df59a to your computer and use it in GitHub Desktop.
RectangularTriangleSquare
namespace Geometry
{
/// <summary>
/// Класс предназначен для геометрических операций с прямоугольным треугольником.
/// </summary>
public static class RectangularTriangle
{
/// <summary>
/// Покеазатель точности, с которой проводятся расчеты.
/// </summary>
public const double Tolerance = 1e-5;
/// <summary>
/// Рассчитывает площадь прмоугольного треугольника.
/// </summary>
/// <param name="a">Сторона A прямоугольного треугольника.</param>
/// <param name="b">Сторона B прямоугольного треугольника.</param>
/// <param name="c">Сторона С прямоугольного треугольника.</param>
/// <returns>Площадь прямугольного треугольниика, рассчитанная по заданным сторонам.</returns>
/// <exception cref="ArgumentException">Исключение возникает в качестве одной или нескольких сторон неположительного значения.
/// Или же при передаче значений сторон, которые не образуют прямоугольный треугольник.</exception>
/// <remarks>
/// В текущей реализации стороны можно задавать в любом порядке. Важно, чтобы значения были положительные
/// и вместе образовывали прямоугольный треугольник.
/// </remarks>
public static double Square(double a, double b, double c)
{
if(a < Tolerance)
throw new ArgumentException("Сторона а должна иметь положительное значение", "a");
if (b < Tolerance)
throw new ArgumentException("Сторона b должна иметь положительное значение", "b");
if (c < Tolerance)
throw new ArgumentException("Сторона c должна иметь положительное значение", "c");
double[] sides = { a, b, c };
Array.Sort(sides);
if(!TriangleIsRectagular(sides[0], sides[1], sides[2]))
throw new ArgumentException("Заданные стороны не соответсвую прямоугольному треугольнику.");
return (sides[0]*sides[1]/2);
}
private static bool TriangleIsRectagular(double a, double b, double c)
{
return Math.Abs((a*a + b*b) - c*c) < Tolerance;
}
}
[TestFixture]
class RectangularTriangleTests
{
[TestCase(0, 1, 1)]
[TestCase(-1, 1, 1)]
[TestCase(1, 0, 1)]
[TestCase(1, -1, 1)]
[TestCase(1, 1, 0)]
[TestCase(1, 1, -1)]
public void TriangleSidesShouldBePositive(double a, double b, double c)
{
Assert.Throws<ArgumentException>(() => RectangularTriangle.Square(a, b, c));
}
[TestCase(1, 2, 3, ExpectedException = typeof(ArgumentException),
ExpectedMessage = "Заданные стороны не соответсвую прямоугольному треугольнику.")]
[TestCase(3, 4, 5)]
public void TriangleShouldBeRectangular(double a, double b, double c)
{
RectangularTriangle.Square(a, b, c);
}
[Test]
public void SquareShouldCalculatesCorrect()
{
Assert.That(RectangularTriangle.Square(3,4,5), Is.EqualTo(6.0).Within(RectangularTriangle.Tolerance));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment