/
GYSFlash
/
MonteCarloApp
Обзор
Документация
Войти
/
GYSFlash
/
MonteCarloApp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/org/example/debfShape.java
164 строки
6 KB
Юрий
first_commit
17 июн 2025, 19:17
17 июн 2025, 19:17
ec7b4c9
Код
Авторство
О чём код?
/*package org.example; import java.util.List; public class debfShape implements Shape { private final List<Point> vertices; // Угловые точки фигуры debf (по вашему изображению) private final Point d, e, b, f; public debfShape(List<Point> vertices) { this.vertices = vertices; this.d = vertices.get(0); // Точка d this.e = vertices.get(1); // Точка e this.b = vertices.get(2); // Точка b this.f = vertices.get(3); // Точка f } @Override public boolean contains(Point p) { // Фигура debf - это четырехугольник debf return isPointInQuadrilateral(p, d, e, b, f); } @Override public double exactArea() { // Площадь четырехугольника по формуле Гаусса return 0.5 * Math.abs( (d.x*e.y + e.x*b.y + b.x*f.y + f.x*d.y) - (d.y*e.x + e.y*b.x + b.y*f.x + f.y*d.x) ); } @Override public String getName() { return "debf"; } private boolean isPointInQuadrilateral(Point p, Point a, Point b, Point c, Point d) { // Разбиваем четырехугольник на 2 треугольника и проверяем принадлежность return isPointInTriangle(p, a, b, c) || isPointInTriangle(p, a, c, d); } private boolean isPointInTriangle(Point p, Point a, Point b, Point c) { // Метод барицентрических координат double alpha = ((b.y - c.y)*(p.x - c.x) + (c.x - b.x)*(p.y - c.y)) / ((b.y - c.y)*(a.x - c.x) + (c.x - b.x)*(a.y - c.y)); double beta = ((c.y - a.y)*(p.x - c.x) + (a.x - c.x)*(p.y - c.y)) / ((b.y - c.y)*(a.x - c.x) + (c.x - b.x)*(a.y - c.y)); double gamma = 1 - alpha - beta; return alpha >= 0 && beta >= 0 && gamma >= 0; } }*/ package org.example; import java.util.List; public class debfShape implements Shape { private final Point d, e, f, b, a, o; private final double radius; public debfShape(List<Point> vertices) { this.d = vertices.get(0); this.e = vertices.get(1); this.b = vertices.get(2); this.f = vertices.get(3); //Расчет вспомогательной точки o - центр круга this.o = new Point( (f.x + d.x) / 2.0, (f.y + d.y) / 2.0 ); //Расчет вспомогательной точки a this.a = new Point( f.x, e.y ); this.radius = calculateDistance(o, d); } @Override public String getName() { return "debf"; } //Расчет площади фигуры @Override public double exactArea() { //Расчет площади четверти круга double quarterCircle = Math.PI * radius * radius / 4; //Расчет площади квадрата double square = radius * radius; //Расчет площади треугольника double triangleBase = radius; double triangleHeight = calculateDistance(a, b); double triangle = 0.5 * triangleBase * triangleHeight; //Вычисляем общую площадь фигуры debf return quarterCircle + square + triangle; } //Проверка принадлежности точки фигуре @Override public boolean contains(Point p) { return isInQuarterCircle(p) || isInRectangle(p) || isInTriangle(p); } // Проверки принадлежности точки к четверти круга private boolean isInQuarterCircle(Point p) { double dx = p.x - o.x; double dy = p.y - o.y; double distanceSquared = dx * dx + dy * dy; // Проверка радиуса if (distanceSquared > radius * radius) { return false; } // Проверка угла (между od и oe) double angleP = Math.atan2(dy, dx); double angleD = Math.atan2(d.y - o.y, d.x - o.x); double angleE = Math.atan2(e.y - o.y, e.x - o.x); // Нормализация углов angleP = (angleP + 2 * Math.PI) % (2 * Math.PI); angleD = (angleD + 2 * Math.PI) % (2 * Math.PI); angleE = (angleE + 2 * Math.PI) % (2 * Math.PI); // Проверка сектора if (angleD < angleE) { return angleP >= angleD && angleP <= angleE; } else { return angleP >= angleD || angleP <= angleE; } } private boolean isInRectangle(Point p) { // Прямоугольник eafo разбиваем на два треугольника return isPointInTriangle(p, e, a, f) || isPointInTriangle(p, e, f, o); } private boolean isInTriangle(Point p) { // Треугольник abf return isPointInTriangle(p, a, b, f); } // Проверка принадлежности точки треугольнику private boolean isPointInTriangle(Point p, Point v1, Point v2, Point v3) { double d1 = (p.x - v2.x) * (v1.y - v2.y) - (v1.x - v2.x) * (p.y - v2.y); double d2 = (p.x - v3.x) * (v2.y - v3.y) - (v2.x - v3.x) * (p.y - v3.y); double d3 = (p.x - v1.x) * (v3.y - v1.y) - (v3.x - v1.x) * (p.y - v1.y); boolean hasNeg = (d1 < 0) || (d2 < 0) || (d3 < 0); boolean hasPos = (d1 > 0) || (d2 > 0) || (d3 > 0); return !(hasNeg && hasPos); } //Расчет расстояния между точками private double calculateDistance(Point a, Point b) { return Math.hypot(a.x - b.x, a.y - b.y); } }