Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 16

Программа, который отсортирует точки по возрастанию расстояния от прямой

01.01.2021, 16:21. Показов 1862. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать программу, которой пользователь задаст координаты двух точек, образующих прямую. Потом программа должна получить на входные данные набор координат и отсортировать их согласно возрастанию удаленности от прямой.
Спецификация входных данных:
Программа при одном запуске может выполнить любое количество заданий. Перед началом нового задания, программа спросит пользователя: продолжить в обработке или нет. Ответ пользователя будет знак "а" (да) или "n" (нет). Программа должна закончиться, если пользователь введет "n". При введении начальных данных программа сначала получит координаты двух точек, образующей прямую, потом количество обрабатываемых координат и в конце пользователь введет координаты отдельных точек (x, y)ю

Пример коммуникации с пользователем:

Продолжить обработку? (a/n):
А
Введите координаты точек, образующих прямую:
1 0
-1 0
Введите количество других точек:
4
Введите координаты точек:
10,32 0
-3 -8
15 20
1 0
Отсортированные точки:
10,32 0,00
1,00 0,00
-3,00 -8,00
15,00 20,00
Продолжить обработку? (a/n):
у
Продолжить обработку? (a/n):
Y
Продолжить обработку? (a/n):
N
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.01.2021, 16:21
Ответы с готовыми решениями:

Квадрат расстояния от точки до прямой на плоскости
Напишите тело функции, вычисляющей квадрат расстояния от точки до прямой на плоскости. function dist(a:Point; l:Line):real; Задача решается...

Вычисление расстояния от точки до прямой в пространстве
Вычисление расстояния от точки до прямой в пространстве

Отсортировать точки по во возрастанию расстояния
Здравствуйте, написал программу для вывода минимально точки, а вот как сделать чтобы она их выводила по возрастанию я не знаю, помогите...

12
 Аватар для Aviz__
2753 / 2060 / 509
Регистрация: 17.02.2014
Сообщений: 9,488
01.01.2021, 16:50
Viktoria S, С новым годом, красавица! как и в старых годах, чтобы помощь была эффективной, показывай свои попытки (это эквивалент заинтересованности). ежели нет у тебя интереса, то зачем и помогать...
1
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 16
01.01.2021, 23:27  [ТС]
Aviz__, С Новым годом! Сейчас у меня есть код для нахождения уравнения прямой, относительно которой будут делаться расчеты.

Данную задачу я анализировала с математической точки зрения: расстояние от точки до прямой его перпендикуляр на эту прямую. Прямую я могу посчитать, но не знаю как привести все именно к перпендикуляру. Для этого, по моему мнению, нужно найти точку пересечения перпендикуляра и прямой. Расстояние можно вычислить по формуле sqrt((x2-x1)^2+(y2-y1)^2)
Затруднения вызывает именно представление этого с помощью Java

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        float x1, x2, y1, y2, k, b;
 
        x1 = sc.nextFloat();
        y1 = sc.nextFloat();
 
        x2 = sc.nextFloat();
        y2 = sc.nextFloat();
 
        k = (y1-y2)/(x1-x2);
        b = k*x1-y1;
 
        if (b>0) System.out.println("y = " + k + "x +" + b);
        else System.out.println("y = " + k + "x " + b);
    }
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
02.01.2021, 08:45
Цитата Сообщение от Viktoria S Посмотреть сообщение
sqrt((x2-x1)^2+(y2-y1)^2)
Java
1
Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
1
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 16
02.01.2021, 13:28  [ТС]
А как можно найти точку пересечения этого перпендикуляра с прямой?
0
 Аватар для Aviz__
2753 / 2060 / 509
Регистрация: 17.02.2014
Сообщений: 9,488
02.01.2021, 16:52
Viktoria S, на отрезке, который принадлежит прямой, выбираешь одну из точек, как начало вектора. из этой точке, назовем ее О, строем вектор во вторую точку В, и в точку не лежащую на прямой Х. по векторам находишь синус угла между ними. затем, по отрезку ОХ синусу ним и отрезком ОБ, находишь желаемый перпендикуляр КХ. и так, для всех точек))
О____К_______________В
*\
**\
***\
****Х
1
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 16
08.01.2021, 16:15  [ТС]
Сейчас у меня уже написан код, который считает расстояние от точки до прямой, но как это расстояния связать с точками?
вот то что я уже сделала:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        double Ax, Bx, Ay, By, Mx, My, m, a, b, hm, p;
        int pocet;
//souřadnice
        Ax = sc.nextFloat();
        Ay = sc.nextFloat();
 
        Bx = sc.nextFloat();
        By = sc.nextFloat();
 
        m = Math.sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay)); //přímka
 
        pocet = sc.nextInt();
 
        for (int i = 1; i <= pocet; i++) {
            //souřadnice bodů
            Mx = sc.nextFloat();
            My = sc.nextFloat();
 
            a = Math.sqrt((Mx - Bx) * (Mx - Bx) + (My - By) * (My - By));
            b = Math.sqrt((Mx - Ax) * (Mx - Ax) + (My - Ay) * (My - Ay));
 
            p = a + b + m;
 
            hm = (2 * Math.sqrt(p * (p - m) * (p - b) * (p - a))) / m; //vzdalenost bodu M od přímky AB
 
            System.out.println("a = " + a + "; b = " + b + "; m = " + m);
            System.out.println("hm = " + hm);
        }
    }
Как в итоге отсортировать эти точки? Координаты задаются отдельно, поэтому их нужно связать как-то между собой, а потом в зависимости от удаленности выписывая на экран.

Надеюсь на вашу помощь
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.01.2021, 17:15
Viktoria S, если не сходится, ищи косяк в формуле. Ну или в коде

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package ru.ismokejc;
 
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
 
public class Cyber {
    Scanner sc = new Scanner(System.in);
    double Ax, Bx, Ay, By, m;
 
    public static void main(String[] args) {
        new Cyber().task();
    }
 
    public void task() {
        System.out.println("Input line");
        Ax = getDouble("Ax: ");
        Ay = getDouble("Ay: ");
        Bx = getDouble("Bx: ");
        By = getDouble("By: ");
        m = Math.sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay));
 
        List<Point> list = new ArrayList<>();
        String answer = "";
        double x, y, distance;
        while (!answer.toLowerCase().equals("n")) {
            System.out.println("Input point");
            x = getDouble("X: ");
            y = getDouble("Y: ");
            distance = distance(x, y);
            list.add(new Point(x, y, distance));
            System.out.print("One more? ");
            answer = sc.nextLine();
        }
        list.sort(Comparator.comparingDouble(Point::getDistance));
        list.forEach(System.out::println);
    }
 
    private double getDouble(String message) {
        while (true) {
            System.out.print(message);
            try {
                return Double.parseDouble(sc.nextLine());
            } catch (NumberFormatException ex) {
                System.out.println("Invalid input, try again.");
            }
        }
    }
 
    private double distance(double x, double y) {
        double a = Math.sqrt((x - Bx) * (x - Bx) + (y - By) * (y - By));
        double b = Math.sqrt((x - Ax) * (x - Ax) + (y - Ay) * (y - Ay));
        double p = a + b + m;
        return (2 * Math.sqrt(p * (p - m) * (p - b) * (p - a))) / m;
    }
}
 
class Point{
    private double x;
    private double y;
    private double distance;
 
    public Point(double x, double y, double distance) {
        this.x = x;
        this.y = y;
        this.distance = distance;
    }
 
    public double getDistance() {
        return distance;
    }
 
    @Override
    public String toString() {
        return String.format("%.2f %.2f", x, y);
    }
}
1
 Аватар для Aviz__
2753 / 2060 / 509
Регистрация: 17.02.2014
Сообщений: 9,488
08.01.2021, 17:16
Цитата Сообщение от Viktoria S Посмотреть сообщение
расстояния связать с точками?
я те даже чертеж из символов забацал, а ты снова "за рыбу деньги"((! создай, или возьми готовый класс Точка(x, y), сохрани их в какуюнить коллекцию, а дальше по чертежу.
0
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 16
09.01.2021, 13:15  [ТС]
Всем спасибо за помощь! Успешно сделала программу) Ошибка была при нахождении полупериметра
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        float[] x, y, vzdOdPrimky;
        float Ax, Ay, Bx, By, m, a, b, p;
        int pocet;
//přímka
        //souřadnice bodu A
        Ax = sc.nextFloat();
        Ay = sc.nextFloat();
 
        //souřadnice bodu B
        Bx = sc.nextFloat();
        By = sc.nextFloat();
 
        //delka přímky
        m = (float) Math.sqrt((Bx - Ax) * (Bx - Ax) + (By - Ay) * (By - Ay));
 
        pocet = sc.nextInt(); //počet bodů
        x = new float[pocet];
        y = new float[pocet];
        vzdOdPrimky = new float[pocet];
 
        for (int i = 0; i < pocet; i++) { //v tomto cyklu postupně zadaváme souřadnice bodů
            x[i] = sc.nextFloat();
            y[i] = sc.nextFloat();
        }
 
        for (int i = 0; i < pocet; i++) { //v tomto cyklu počítame vzdalenost zadaných bodů od přímky
            a = (float) Math.sqrt((x[i] - Bx) * (x[i] - Bx) + (y[i] - By) * (y[i] - By));
            b = (float) Math.sqrt((x[i] - Ax) * (x[i] - Ax) + (y[i] - Ay) * (y[i] - Ay));
            p = (a + b + m) / 2;
            vzdOdPrimky[i] = (float) ((2 * Math.sqrt(p * (p - m) * (p - b) * (p - a))) / m);
        }
 
        for (int f = vzdOdPrimky.length - 1; f > 0; f--) { //tento cyklus sortuje body podle vzdálenosti
            for (int i = 0; i < f; i++) {
                if (vzdOdPrimky[i] > vzdOdPrimky[i + 1]) {
                    float tmp = vzdOdPrimky[i];
                    vzdOdPrimky[i] = vzdOdPrimky[i + 1];
                    vzdOdPrimky[i + 1] = tmp;
 
                    tmp = x[i];
                    x[i] = x[i + 1];
                    x[i + 1] = tmp;
 
                    tmp = y[i];
                    y[i] = y[i + 1];
                    y[i + 1] = tmp;
                }
            }
        }
 
        for (int i = 0; i < pocet; i++) {
            System.out.print(x[i] + "   " + y[i] + "   " + vzdOdPrimky[i]);
            System.out.println();
        }
    }
Добавлено через 2 минуты
Aviz__, возможно я неправильно выразилась) спасибо за помощь
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
09.01.2021, 16:54
Зачем постоянно кастовать во float, если можно сразу работать с нужным типом?
0
0 / 0 / 0
Регистрация: 21.11.2020
Сообщений: 16
10.01.2021, 15:55  [ТС]
xoraxax, у меня, действительно, сразу все переменные типа  float, но IntelliJ IDEA ругается при использовании корня без кастовани. Нам также говорили в универе, что при использовании корня лучше указывать тип финальной переменной
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
10.01.2021, 16:04
Viktoria S, используй везде double и будет счастье
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2021, 16:04
Помогаю со студенческими работами здесь

Заданные точки плоскости рассортировать по возрастанию расстояния от начала координат
Заданные точки плоскости рассортировать по возрастанию расстояния от начала координат. Для сортировки использовать алгоритм выбора...

Заданные точки на плоскости рассортировать по возрастанию расстояния от начала координат
Добрый день, у меня не выводит массив, когда присутствую нужные функции. в чем проблема? Вот условие: Заданные точки плоскости...

Программа поиска расстояния от точки до стороны треугольника
Помогите пожалуйста с прогой, нужно сдавать, а я никак не вникну в суть. Очень буду признателен, если у кого-то получится, можно с...

По данным коэффициентами уравнения прямой и координатами некоторой точки, вычислить абс. отклонение точки от прямой
По данным коэффициентами уравнения прямой на плоскости (Ах + Ву + С = 0) и координатами некоторой точки K (x0, y0) вычислить абсолютное...

Программа, определяющая точки пересечения прямой и параболы
Помогите пожалуйста отладить программу, которая определяет, пересекаются ли парабола y=cx^2+dx+f и прямая y=ax+b. И если пересекаются, то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru