diff --git "a/2023_3_\320\226\320\265\320\273\320\276\320\261\320\272\320\276\320\262\320\270\321\207_\320\237\320\260\320\262\320\265\320\273.docx" "b/2023_3_\320\226\320\265\320\273\320\276\320\261\320\272\320\276\320\262\320\270\321\207_\320\237\320\260\320\262\320\265\320\273.docx" new file mode 100644 index 0000000..0b2ec4b Binary files /dev/null and "b/2023_3_\320\226\320\265\320\273\320\276\320\261\320\272\320\276\320\262\320\270\321\207_\320\237\320\260\320\262\320\265\320\273.docx" differ diff --git "a/2023_3_\320\226\320\265\320\273\320\276\320\261\320\272\320\276\320\262\320\270\321\207_\320\237\320\260\320\262\320\265\320\273.pdf" "b/2023_3_\320\226\320\265\320\273\320\276\320\261\320\272\320\276\320\262\320\270\321\207_\320\237\320\260\320\262\320\265\320\273.pdf" new file mode 100644 index 0000000..3c42649 Binary files /dev/null and "b/2023_3_\320\226\320\265\320\273\320\276\320\261\320\272\320\276\320\262\320\270\321\207_\320\237\320\260\320\262\320\265\320\273.pdf" differ diff --git a/MyFrame.java b/MyFrame.java new file mode 100644 index 0000000..c67d1dc --- /dev/null +++ b/MyFrame.java @@ -0,0 +1,172 @@ +package super_project; + +// импорты +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; + +// Описание окна +public class MyFrame extends JFrame implements ActionListener { + + // Создаем новое решение, в параметры передаем какой-то новый лист + Solution solution = new Solution(new ArrayList<>()); + + // сюда мы будем закидывать все точки + List points = new ArrayList<>(); + + // Кнопка + JButton button_ADD; + + // 2 Текстовых поля + JTextField textFieldForX; + JTextField textFieldForY; + + // Конструктор окна + public MyFrame(String title) { + super(title); // устанавливаем название нашего окна на строку, переданную в парметрах + + // Инициализация кнопки + button_ADD = new JButton("Press me to add new points"); + button_ADD.setBounds(50, 10, 200, 50); + button_ADD.addActionListener(this); + + // Инициализации текстовых полей + textFieldForX = new JTextField(); + textFieldForX.setBounds(300, 10, 150, 50); + + textFieldForY = new JTextField(); + textFieldForY.setBounds(450, 10, 150, 50); + + // Добавляем к окну кнопку и 2 текстовых поля + add(textFieldForX); + add(textFieldForY); + add(button_ADD); + + getContentPane().setBackground(Color.green); + setLayout(null); // для правильного расположения кнопок на окне + setSize(700, 300); // размеры нашего окна 700 * 300 + setVisible(true); // чтобы наше окно было видно + setDefaultCloseOperation(EXIT_ON_CLOSE); // чтобы можно было выйти из окна нажав крестик и остановить проект + addMouseListener(new MyMouseListener()); // добавляем поддержку MouseListener + } + + // рисовалка + @Override // переопределение + public void paint(Graphics g) { + super.paint(g); // + + // рисуем точки + // у каждой точки из листа points - зануляем ее счетчик + // (кол-во раз сколько она была вершиной правильного треугольника) + for (Point point : points) { + point.count = 0; + g.drawOval((int) point.x - 5, (int) point.y - 5, 10, 10); + g.fillOval((int) point.x - 5, (int) point.y - 5, 10, 10); + } + + + // Перебираем всевозможные тройки точек (points[i], points[j], points[k]) + // такая индексация выбрана неслучайно - + // она помогает избежать повторения учетнных троек точек + for (int i = 0; i < points.size(); i++) { + for (int j = i + 1; j < points.size(); j++) { + for (int k = j + 1; k < points.size(); k++) { + + // если точки из листа points с индексами (i, j, k) образуют правильный треугольник + // -> заходим в этот цикл + if (solution.isRightTriangle(points.get(i), points.get(j), points.get(k))) { + increaseCount(i, j, k); // увеличиваем счетчик каждой точки + Triangle newTriangle = new Triangle(points.get(i), points.get(j), points.get(k)); // создаем новый треугольник по этим трем точкам + solution.triangles.add(newTriangle); // добавляем его в общий лист треугольников + solution.drawTriangle(g, newTriangle); // рисуем этот треугольник черным цветом + } + + } + } + } + + // Каждый правильный треугольник, имеющий вершину с счетчиком хотя бы 2 + // Будет отрисован розовым + // i == {0 .. кол-во всех правильных треуг-ов - 1} + for (int i = 0; i < solution.triangles.size(); i++) { + g.setColor(Color.MAGENTA); // меняем цвет на розовый + + // смотрим на вершины какого-то правильного i-ого треугольника + // если каждая из его вершин имеет count >= 2, + // то рисуем этот треугольник розовым цветом + if (solution.triangles.get(i).p1.count >= 2 + || solution.triangles.get(i).p2.count >= 2 + || solution.triangles.get(i).p3.count >= 2) { + solution.drawTriangle(g, solution.triangles.get(i)); + } + } + + // То же самое для точек + for (Point point : points) { + if (point.count >= 2) { + g.setColor(Color.RED); + g.drawOval((int) point.x - 5, (int) point.y - 5, 10, 10); + g.fillOval((int) point.x - 5, (int) point.y - 5, 10, 10); + } + } + } + + // фукнция, увеличивающая счетчик точек с индексами i, j, k из листа points на 1 + private void increaseCount(int i, + int j, + int k) { + points.get(i).count++; + points.get(j).count++; + points.get(k).count++; + } + + // Метод обработки нажатия на кнопку + @Override + public void actionPerformed(ActionEvent e) { + int x = Integer.parseInt(textFieldForX.getText()); // получаем информацию из 1го текст. поля + int y = Integer.parseInt(textFieldForY.getText()); // получаем информацию из 2го текст. поля + + if (e.getSource() == button_ADD) { // если мы нажали button_ADD + Point point = new Point(x, y); // создаем новую точку (x, y) + points.add(point); // закидываем эту точку в общий лист + repaint(); // перерисовываем + } + } + + // Обрабатываем нажатия мышкой + private class MyMouseListener implements MouseListener { + @Override + public void mouseClicked(MouseEvent e) { // если мы кликнули мышкой + Point newPoint = new Point(e.getX(), e.getY()); // создали новую точку + points.add(newPoint); // добавить эту точку в лист points + repaint(); // перерисовываем + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + } + + // для запуска окна + public static void main(String[] args) { + new MyFrame("project"); // создаем наше окно + } +} diff --git a/Point.java b/Point.java new file mode 100644 index 0000000..5970639 --- /dev/null +++ b/Point.java @@ -0,0 +1,24 @@ +package super_project; + +// класс описания точки +public class Point { + double x; // две координаты + double y; + + int count; // кол-во раз, сколько точка была вершиной правильного треуг-ка + + // конструктор + public Point(double x, double y) { + this.x = x; + this.y = y; + } + + // Метод для вычисления расстояния + // между текущей точкой и переданной в параметры + public double getLength(Point p2) { + return Math.sqrt( + Math.pow(this.x - p2.x, 2) + + Math.pow(this.y - p2.y, 2) // теорема Пифагора + ); + } +} diff --git a/README.md b/README.md index ffa8a5b..f2a5b30 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ -# JavaGl239Project +# Итоговый проект по информатике -Проект +### Желобкович Павел + +Множество точек на плоскости назовем дваждытреугольным, +если каждая точка этого множества является вершиной хотя бы двух правильных треугольников, +построенных по точкам множества. Определить, удовлетворяет ли заданное множество точек +этому свойству. diff --git a/Solution.java b/Solution.java new file mode 100644 index 0000000..ed3f007 --- /dev/null +++ b/Solution.java @@ -0,0 +1,40 @@ +package super_project; + +// импорты +import java.awt.*; +import java.util.List; + +// класс решение +public class Solution { + // лист треугольников + List triangles; + + // конструктор решения + // принимает на вход лист треугольников и по нему создает новое решение + public Solution(List triangles) { + this.triangles = triangles; + } + + // метод отрисовки треугольника + public void drawTriangle(Graphics g, Triangle triangle) { + g.drawLine((int) triangle.p1.x, (int) triangle.p1.y, (int) triangle.p2.x, (int) triangle.p2.y); + g.drawLine((int) triangle.p1.x, (int) triangle.p1.y, (int) triangle.p3.x, (int) triangle.p3.y); + g.drawLine((int) triangle.p2.x, (int) triangle.p2.y, (int) triangle.p3.x, (int) triangle.p3.y); + } + + // метод, который возвращает true, если 3 точки из параметров являются вершинами правильного треуг-ка + // false - иначе + public boolean isRightTriangle(Point p1, Point p2, Point p3) { + if (Math.abs(p1.getLength(p2) - p1.getLength(p3)) <= 25) { + if (Math.abs(p1.getLength(p3) - p2.getLength(p3)) <= 25) { + if (Math.abs(p1.getLength(p2) - p2.getLength(p3)) <= 25) { + return true; + } else { + return false; + } + } + return false; + } + return false; + } +} diff --git a/Triangle.java b/Triangle.java new file mode 100644 index 0000000..1308d38 --- /dev/null +++ b/Triangle.java @@ -0,0 +1,14 @@ +package super_project; + +// описание треугольника +public class Triangle { + // его три вершины + public Point p1, p2, p3; + + // конструктор треуг-ка + public Triangle(Point p1, Point p2, Point p3) { + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + } +} diff --git a/src/main/java/problem/Problem.java b/src/main/java/problem/Problem.java index c97423d..6bda267 100644 --- a/src/main/java/problem/Problem.java +++ b/src/main/java/problem/Problem.java @@ -6,20 +6,22 @@ import java.util.Scanner; /** - * Класс задачи + * Типовая */ public class Problem { /** - * текст задачи + * На плоскости задано множество точек. Найти из них такие 4 точки, что построенный + * по ним 4-хугольник не является самопересекающимся и содержит в себе + * максимальное количество точек множества */ public static final String PROBLEM_TEXT = "ПОСТАНОВКА ЗАДАЧИ:\n" + - "Заданы два множества точек в пространстве.\n" + - "Требуется построить пересечения и разность этих множеств"; + "Задано множество точек на плоскости.\n" + + "Требуется найти такие 4 точки ,что построенный по ним 4-хугольник не является самопересекающимся и содержит в себе максимальное количество точек множества"; /** * заголовок окна */ - public static final String PROBLEM_CAPTION = "Итоговый проект ученика 10-7 Иванова Ивана"; + public static final String PROBLEM_CAPTION = "Итоговый проект ученика 10-3 класса Желобковича Павла "; /** * путь к файлу diff --git a/src/main/java/project/Main.java b/src/main/java/project/Main.java new file mode 100644 index 0000000..8829143 --- /dev/null +++ b/src/main/java/project/Main.java @@ -0,0 +1,7 @@ +package project; + +public class Main { + public static void main(String[] args) { + MyFrame frame = new MyFrame("title"); + } +} diff --git a/src/main/java/project/MyFrame.java b/src/main/java/project/MyFrame.java new file mode 100644 index 0000000..022e6d4 --- /dev/null +++ b/src/main/java/project/MyFrame.java @@ -0,0 +1,120 @@ +package project; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class MyFrame extends JFrame { + + /* + Данный метод помогает читать точки из файла + */ + public void getPointsFromFile() { + points.clear(); + try { + File file = new File("in.txt"); + Scanner sc = new Scanner(file); + while (sc.hasNextLine()) { + double x = sc.nextDouble(); + double y = sc.nextDouble(); + Point point = new Point(x, y); + points.add(point); + } + sc.close(); + } catch (Exception e) { + System.out.println("U did something wrong: " + e); + } + } + + Solution solution = new Solution(new ArrayList<>()); + List points = new ArrayList<>(); + + public MyFrame(String title) { + super(title); + setVisible(true); + setDefaultCloseOperation(EXIT_ON_CLOSE); + addMouseListener(new MyMouseListener()); + setSize(300, 300); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + + Graphics2D graphics2D = (Graphics2D) g; + BasicStroke stroke = new BasicStroke(2); + graphics2D.setStroke(stroke); + + for (Point value : points) { + value.count = 0; + g.drawOval((int) value.x - 5, (int) value.y - 5, 10, 10); + } + + for (int i = 0; i < points.size(); i++) { + for (int j = i + 1; j < points.size(); j++) { + for (int k = j + 1; k < points.size(); k++) { + if (solution.isRightTriangle(points.get(i), points.get(j), points.get(k))) { + increaseCount(i, j, k); + Triangle newTriangle = new Triangle(points.get(i), points.get(j), points.get(k)); + solution.triangles.add(newTriangle); + solution.drawTriangle(g, newTriangle); + } + } + } + } + + for (int i = 0; i < solution.triangles.size(); i++) { + g.setColor(Color.MAGENTA); + + if (solution.triangles.get(i).p1.count >= 2 + || solution.triangles.get(i).p2.count >= 2 + || solution.triangles.get(i).p3.count >= 2) { + solution.drawTriangle(g, solution.triangles.get(i)); + } + } + + for (Point point : points) { + if (point.count >= 2) { + g.setColor(Color.RED); + g.drawOval((int) point.x - 5, (int) point.y - 5, 10, 10); + g.fillOval((int) point.x - 5, (int) point.y - 5, 10, 10); + } + } + } + + private void increaseCount(int i, int j, int k) { + points.get(i).count++; + points.get(j).count++; + points.get(k).count++; + } + + private class MyMouseListener implements MouseListener { + @Override + public void mouseClicked(MouseEvent e) { + Point newPoint = new Point(e.getX(), e.getY()); + points.add(newPoint); + repaint(); + } + + @Override + public void mousePressed(MouseEvent e) { + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + } +} diff --git a/src/main/java/project/Point.java b/src/main/java/project/Point.java new file mode 100644 index 0000000..48c4441 --- /dev/null +++ b/src/main/java/project/Point.java @@ -0,0 +1,19 @@ +package project; + +public class Point { + double x; + double y; + + int count; + + public Point(double x, double y) { + this.x = x; + this.y = y; + } + + public double getLength(Point p2) { + return Math.sqrt( + Math.pow(this.x - p2.x, 2) + Math.pow(this.y - p2.y, 2) + ); + } +} diff --git a/src/main/java/project/Solution.java b/src/main/java/project/Solution.java new file mode 100644 index 0000000..5065f3f --- /dev/null +++ b/src/main/java/project/Solution.java @@ -0,0 +1,24 @@ +package project; + +import java.awt.*; +import java.util.List; + +public class Solution { + List triangles; + + public Solution(List triangles) { + this.triangles = triangles; + } + + public void drawTriangle(Graphics g, Triangle triangle) { + g.drawLine((int) triangle.p1.x, (int) triangle.p1.y, (int) triangle.p2.x, (int) triangle.p2.y); + g.drawLine((int) triangle.p1.x, (int) triangle.p1.y, (int) triangle.p3.x, (int) triangle.p3.y); + g.drawLine((int) triangle.p2.x, (int) triangle.p2.y, (int) triangle.p3.x, (int) triangle.p3.y); + } + + public boolean isRightTriangle(Point p1, Point p2, Point p3) { + return Math.abs(p1.getLength(p2) - p1.getLength(p3)) <= 25 + && Math.abs(p1.getLength(p3) - p2.getLength(p3)) <= 25 + && Math.abs(p1.getLength(p2) - p2.getLength(p3)) <= 25; + } +} diff --git a/src/main/java/project/Triangle.java b/src/main/java/project/Triangle.java new file mode 100644 index 0000000..b008d37 --- /dev/null +++ b/src/main/java/project/Triangle.java @@ -0,0 +1,11 @@ +package project; + +public class Triangle { + public Point p1, p2, p3; + + public Triangle(Point p1, Point p2, Point p3) { + this.p1 = p1; + this.p2 = p2; + this.p3 = p3; + } +}