Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added 2023_3_Желобкович_Павел.docx
Binary file not shown.
Binary file added 2023_3_Желобкович_Павел.pdf
Binary file not shown.
172 changes: 172 additions & 0 deletions MyFrame.java
Original file line number Diff line number Diff line change
@@ -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<Point> 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"); // создаем наше окно
}
}
24 changes: 24 additions & 0 deletions Point.java
Original file line number Diff line number Diff line change
@@ -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) // теорема Пифагора
);
}
}
9 changes: 7 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# JavaGl239Project
# Итоговый проект по информатике

Проект
### Желобкович Павел

Множество точек на плоскости назовем дваждытреугольным,
если каждая точка этого множества является вершиной хотя бы двух правильных треугольников,
построенных по точкам множества. Определить, удовлетворяет ли заданное множество точек
этому свойству.
40 changes: 40 additions & 0 deletions Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package super_project;

// импорты
import java.awt.*;
import java.util.List;

// класс решение
public class Solution {
// лист треугольников
List<Triangle> triangles;

// конструктор решения
// принимает на вход лист треугольников и по нему создает новое решение
public Solution(List<Triangle> 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;
}
}
14 changes: 14 additions & 0 deletions Triangle.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
12 changes: 7 additions & 5 deletions src/main/java/problem/Problem.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 класса Желобковича Павла ";

/**
* путь к файлу
Expand Down
7 changes: 7 additions & 0 deletions src/main/java/project/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package project;

public class Main {
public static void main(String[] args) {
MyFrame frame = new MyFrame("title");
}
}
Loading