/
onequ1z
/
JavaCoursePaperTulSU
Обзор
Документация
Войти
/
onequ1z
/
JavaCoursePaperTulSU
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/test/java/ru/dmitry/montecarlo/model/TriangleGEFTest.java
178 строк
7 KB
tayno
fix: Исправлены грубые ошибки при рассчёте площади треугольника и прямоугольника. Подобраны максимально подходящие координаты для фигур ABCD и GEF. Исправлены тесты
08 дек 2025, 10:22
08 дек 2025, 10:22
dbf7c5e
Код
Авторство
О чём код?
package ru.dmitry.montecarlo.model; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class TriangleGEFTest { @Test void testExactArea() { // Прямоугольный треугольник с основанием 1 и высотой 1, площадь которого равна 0,5 Point g = new Point(0.0, 1.0); Point e = new Point(1.0, 1.0); Point f = new Point(1.0, 0.0); TriangleGEF triangle = new TriangleGEF(g, e, f); double area = triangle.exactArea(); // Ожидаемая площадь = 0,5 * основание * высота = 0,5 * 1 * 1 = 0,5 assertEquals(0.5, area, 0.0001); } @Test void testExactAreaWithDifferentTriangle() { // Треугольник с вершинами (0,0), (3,0), (0,4) — площадь должна быть равна 6,0 Point g = new Point(0.0, 0.0); Point e = new Point(3.0, 0.0); Point f = new Point(0.0, 4.0); TriangleGEF triangle = new TriangleGEF(g, e, f); double area = triangle.exactArea(); // Ожидаемая площадь = 0,5 * 3 * 4 = 6,0 assertEquals(6.0, area, 0.0001); } @Test void testContainsPointInside() { Point g = new Point(0.0, 1.0); Point e = new Point(1.0, 1.0); Point f = new Point(1.0, 0.0); TriangleGEF triangle = new TriangleGEF(g, e, f); // Точка внутри треугольника (приблизительно в центре) Point inside = new Point(0.5, 0.75); assertTrue(triangle.contains(inside)); // Ещё одна точка в центре Point inside2 = new Point(0.7, 0.8); assertTrue(triangle.contains(inside2)); } @Test void testContainsPointOutside() { Point g = new Point(0.0, 1.0); Point e = new Point(1.0, 1.0); Point f = new Point(1.0, 0.0); TriangleGEF triangle = new TriangleGEF(g, e, f); // Точка за пределами треугольника Point outside1 = new Point(0.5, 0.0); assertFalse(triangle.contains(outside1)); // Другая точка за пределами треугольника Point outside2 = new Point(1.5, 0.5); assertFalse(triangle.contains(outside2)); // Точка далеко вне треугольника Point outside3 = new Point(2.0, 2.0); assertFalse(triangle.contains(outside3)); } @Test void testContainsPointOnVertex() { Point g = new Point(0.0, 1.0); Point e = new Point(1.0, 1.0); Point f = new Point(1.0, 0.0); TriangleGEF triangle = new TriangleGEF(g, e, f); // Точки на вершинах, которые следует считать внутренними (или находящимися на границе) assertTrue(triangle.contains(g)); assertTrue(triangle.contains(e)); assertTrue(triangle.contains(f)); } @Test void testExactAreaHandComputed() { // Треугольник с вершинами (0,0), (4,0), (0,3) // Ручной расчёт по формуле площади Гаусса: // Площадь = 0.5 * |(0*0 + 4*3 + 0*0) - (0*4 + 0*0 + 3*0)| // = 0.5 * |12 - 0| = 0.5 * 12 = 6.0 Point g = new Point(0.0, 0.0); Point e = new Point(4.0, 0.0); Point f = new Point(0.0, 3.0); TriangleGEF triangle = new TriangleGEF(g, e, f); double area = triangle.exactArea(); assertEquals(6.0, area, 0.0001); } @Test void testExactAreaHandComputedNegativeCoordinates() { // Треугольник с вершинами (-1,0), (2,0), (0,2) // Ручной расчёт: 0.5 * |(-1*0 + 2*2 + 0*0) - (0*2 + 0*0 + 2*(-1))| // = 0.5 * |4 - (-2)| = 0.5 * 6 = 3.0 Point g = new Point(-1.0, 0.0); Point e = new Point(2.0, 0.0); Point f = new Point(0.0, 2.0); TriangleGEF triangle = new TriangleGEF(g, e, f); double area = triangle.exactArea(); assertEquals(3.0, area, 0.0001); } @Test void testContainsPointOnEdge() { // Треугольник: G(0,0), E(2,0), F(0,2) Point g = new Point(0.0, 0.0); Point e = new Point(2.0, 0.0); Point f = new Point(0.0, 2.0); TriangleGEF triangle = new TriangleGEF(g, e, f); // Точка на ребре GE (нижнее основание): (1, 0) Point onEdgeGE = new Point(1.0, 0.0); assertTrue(triangle.contains(onEdgeGE), "Точка на ребре GE должна считаться внутри"); // Точка на ребре GF (левая сторона): (0, 1) Point onEdgeGF = new Point(0.0, 1.0); assertTrue(triangle.contains(onEdgeGF), "Точка на ребре GF должна считаться внутри"); // Точка на ребре EF (гипотенуза): (1, 1) Point onEdgeEF = new Point(1.0, 1.0); assertTrue(triangle.contains(onEdgeEF), "Точка на ребре EF должна считаться внутри"); } @Test void testContainsPointJustOutside() { // Треугольник: G(0,0), E(2,0), F(0,2) Point g = new Point(0.0, 0.0); Point e = new Point(2.0, 0.0); Point f = new Point(0.0, 2.0); TriangleGEF triangle = new TriangleGEF(g, e, f); // Для треугольника (0,0), (2,0), (0,2) точка (0.1, 0.1) должна быть внутри Point inside = new Point(0.1, 0.1); assertTrue(triangle.contains(inside), "Точка (0.1, 0.1) должна быть внутри треугольника"); // Проверим точку, которая точно снаружи Point outside = new Point(1.5, 1.5); // За гипотенузой assertFalse(triangle.contains(outside), "Точка за гипотенузой должна быть снаружи"); Point outside2 = new Point(-0.1, 0.0); // Слева от треугольника assertFalse(triangle.contains(outside2), "Точка слева от треугольника должна быть снаружи"); } @Test void testExactAreaForGEFTriangle() { // Треугольник GEF из основного приложения: G(0, 3), E(9.2, 4), F(5.3, 0) // Ручной расчёт по формуле площади Гаусса: // Площадь = 0.5 * |(0*4 + 9.2*0 + 5.3*3) - (3*9.2 + 4*5.3 + 0*0)| // = 0.5 * |(0 + 0 + 15.9) - (27.6 + 21.2 + 0)| // = 0.5 * |15.9 - 48.8| // = 0.5 * 32.9 = 16.45 Point g = new Point(0.0, 3.0); Point e = new Point(9.2, 4.0); Point f = new Point(5.3, 0.0); TriangleGEF triangle = new TriangleGEF(g, e, f); double area = triangle.exactArea(); double expectedArea = 16.45; assertEquals(expectedArea, area, 0.0001); } }