/
onequ1z
/
JavaCoursePaperTulSU
Обзор
Документация
Войти
/
onequ1z
/
JavaCoursePaperTulSU
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/ru/dmitry/montecarlo/model/TriangleGEF.java
96 строк
4 KB
tayno
Рефакторинг: добавление секундомера, профилировщика и очистка кода
05 дек 2025, 09:37
05 дек 2025, 09:37
52c8b9a
Код
Авторство
О чём код?
package ru.dmitry.montecarlo.model; /** * Представляет треугольник G-E-F, образованный тремя точками. * Реализует проверку принадлежности точек с помощью метода векторного произведения * и точное вычисление площади по формуле площади Гаусса (shoelace formula). * Класс является неизменяемым (immutable). */ public class TriangleGEF implements Figure { private final Point g; private final Point e; private final Point f; /** * Создаёт треугольник по трём вершинам. * * @param g первая вершина треугольника * @param e вторая вершина треугольника * @param f третья вершина треугольника */ public TriangleGEF(Point g, Point e, Point f) { this.g = g; this.e = e; this.f = f; } /** * Возвращает первую вершину треугольника. * * @return точка G */ public Point getG() { return g; } /** * Возвращает вторую вершину треугольника. * * @return точка E */ public Point getE() { return e; } /** * Возвращает третью вершину треугольника. * * @return точка F */ public Point getF() { return f; } /** * Вычисляет векторное произведение векторов (p1->p2) и (p1->p3). * Используется для проверки принадлежности точки треугольнику. */ private double crossProduct(Point p1, Point p2, Point p3) { return (p2.getX() - p1.getX()) * (p3.getY() - p1.getY()) - (p2.getY() - p1.getY()) * (p3.getX() - p1.getX()); } /** * Проверяет, находится ли точка внутри треугольника, с помощью метода векторного произведения. * Точка находится внутри, если она расположена на одной стороне от всех трёх рёбер. * @param p точка для проверки * @return true, если точка находится внутри треугольника, false в противном случае */ @Override public boolean contains(Point p) { double d1 = crossProduct(g, e, p); double d2 = crossProduct(e, f, p); double d3 = crossProduct(f, g, p); // Check if all cross products have the same sign (or zero for edge points) boolean hasNeg = (d1 < 0) || (d2 < 0) || (d3 < 0); boolean hasPos = (d1 > 0) || (d2 > 0) || (d3 > 0); // Point is inside if all cross products have the same sign return !(hasNeg && hasPos); } /** * Вычисляет точную площадь треугольника по формуле «шнурка». * Площадь = 0,5 * |(x1*y2 + x2*y3 + x3*y1) - (y1*x2 + y2*x3 + y3*x1)| * @return точная площадь треугольника */ @Override public double exactArea() { double area = 0.5 * Math.abs( (g.getX() * e.getY() + e.getX() * f.getY() + f.getX() * g.getY()) - (g.getY() * e.getX() + e.getY() * f.getX() + f.getY() * g.getX()) ); return area; } }