/
Swdevil
/
Mrakobesya
Обзор
Документация
Войти
/
Swdevil
/
Mrakobesya
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/com/montecarlo/figure/CompositeFigure.java
76 строк
3 KB
Vorobina-Alina
first_commit
18 июн 2025, 14:41
18 июн 2025, 14:41
b3e9d2e
Код
Авторство
О чём код?
package com.montecarlo.figure; import java.util.List; public class CompositeFigure implements Figure { private final Point circleCenter; private final Point circleEdge; private final Point triangleA; private final Point triangleB; private final double radius; public CompositeFigure(List<Point> vertices) { if (vertices.size() != 4) { throw new IllegalArgumentException("Требуется 4 точки: центр круга, точка на окружности и 2 вершины треугольника"); } this.circleCenter = vertices.get(0); this.circleEdge = vertices.get(1); this.triangleA = vertices.get(2); this.triangleB = vertices.get(3); this.radius = calculateDistance(circleCenter, circleEdge); // Проверка корректности радиуса if (radius <= 0) { throw new IllegalArgumentException("Радиус круга должен быть положительным"); } } @Override public String getName() { return "CompositeFigure (Triangle + QuarterCircle)"; } @Override public boolean contains(Point p) { return isInQuarterCircle(p) || isInTriangle(p); } @Override public double exactArea() { // Площадь четверти круга double quarterCircleArea = Math.PI * radius * radius / 4; // Площадь треугольника через векторное произведение double triangleArea = 0.5 * Math.abs( (triangleA.x - circleEdge.x) * (triangleB.y - circleEdge.y) - (triangleB.x - circleEdge.x) * (triangleA.y - circleEdge.y) ); return quarterCircleArea + triangleArea; } private boolean isInQuarterCircle(Point p) { double dx = p.x - circleCenter.x; double dy = p.y - circleCenter.y; double distanceSquared = dx * dx + dy * dy; return distanceSquared <= radius * radius && dx >= 0 && dy >= 0; } private boolean isInTriangle(Point p) { Point triangleC = circleEdge; // Третья вершина треугольника // Вычисляем векторные произведения double d1 = (p.x - triangleA.x) * (triangleB.y - triangleA.y) - (p.y - triangleA.y) * (triangleB.x - triangleA.x); double d2 = (p.x - triangleB.x) * (triangleC.y - triangleB.y) - (p.y - triangleB.y) * (triangleC.x - triangleB.x); double d3 = (p.x - triangleC.x) * (triangleA.y - triangleC.y) - (p.y - triangleC.y) * (triangleA.x - triangleC.x); // Учитываем точки на границе (== 0) 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); } }