Неправильный вывод в консоль

126
21 декабря 2020, 03:00

Есть задача:

В файле хранятся координаты вершин четырехугольника в порядке обхода фигуры по часовой стрелке в виде:

<координата x1> <координата y1>
<координата x2> <координата y2>
<координата x3> <координата y3>
<координата x4> <координата y4>

Считаем, что полученные из файла вершины гарантированно образуют выпуклый четырехугольник.Написать программу, которая считывает координаты из файла. При запуске ждет от пользователя ввода координат некой точки и выводит один из четырех возможных результатов:

точка внутри четырехугольника
точка лежит на сторонах четырехугольника
точка - вершина четырехугольника
точка снаружи четырехугольника

Мой код:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
public class Main {
    public static void main(String[] args) {
        try {
            System.out.print("Путь и название файла: ");
            BufferedReader readerFileName = new BufferedReader(new InputStreamReader(System.in));
            String fileName = readerFileName.readLine();
            BufferedReader reader = new BufferedReader(new FileReader(fileName));
            String line;
            int[] arr = new int[8];
            int i = 0;
            while((line = reader.readLine()) != null){
                String[] arrStr = line.split(" ");
                arr[i] = Integer.parseInt(arrStr[0]);
                arr[++i] = Integer.parseInt(arrStr[1]);
                ++i;
            }
            System.out.print("Координата по X: ");
            BufferedReader readerX = new BufferedReader(new InputStreamReader(System.in));
            int x = readerX.read();
            System.out.print("Координата по Y: ");
            BufferedReader readerY = new BufferedReader(new InputStreamReader(System.in));
            int y = readerY.read();
            System.out.println();
            int x1 = arr[0],
                y1 = arr[1],
                x2 = arr[2],
                y2 = arr[3],
                x3 = arr[4],
                y3 = arr[5],
                x4 = arr[6],
                y4 = arr[7];
            int maxX = Math.max(Math.max(x1, x2), Math.max(x3, x4));
            int minX = Math.min(Math.min(x1, x2), Math.min(x3, x4));
            int maxY = Math.max(Math.max(y1, y2), Math.max(y3, y4));
            int minY = Math.min(Math.min(y1, y2), Math.min(y3, y4));

            if((x > minX && x < maxX) && (y > minY && y < maxY)){
                System.out.println("Точка внутри четырёхугольника");
            }
            else if(((x > x1 && y > y1) && (x < x2 && y < y2)) || ((x > x2 && y > y2) && (x < x3 && y < y3))
                                || ((x > x3 && y > y3) && (x < x4 && y < y4))){
                System.out.println("Точка лежит на сторонах треугольника");
            }
            else if((x == x1 && y == y1) || (x == x2 && y == y2) || (x == x3 && y == y3) || (x == x4 && y == y4)){
                System.out.println("Точка - вершина четырёхугольника");
            }
            else {
                System.out.println("Точка снаружи четырёхугольника");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

При вводе любых значений выполняется условие с else. Даже ввод тех же вершин четырёхугольника не даёт нужного вывода, хотя прописано верно

Answer 1

Для проверки, находится ли точка внутри многоугольника, есть много методов. В данном случае он выпуклый, и проще всего проверить, что все векторные произведения, образованных тройками V[i], V[i+1], P, имеют один знак

int orientation(Point p, v2, v3)  { 
   return Math.signum((v2.y - p.y) * (v3.x - v2.x) - 
          (v2.x - p.x) * (v3.y - v2.y)); 
}  

Нулевое значение одного из произведений означает, что точка находится на ребре (если знаки остальных совпадают). А нулевое значение двух последовательных произведений - что точка совпадает с вершиной (хотя это можно простым сравнением выяснить)

READ ALSO
Как с генерировать исходный код из байтов?

Как с генерировать исходный код из байтов?

Имеется массив из байтов одной Java программыКак мне получить её исходники в нормальном Java виде, с помощью ASM может как-то ?

122
Login Filter вопрос

Login Filter вопрос

Написал Логин Фильтр, который не будем пропускать не авторизованного юзера :

118
POST PACH в 1С из JAVA/Аndroid

POST PACH в 1С из JAVA/Аndroid

Пишу небольшое приложение под android для инвенторизации

132
Как отформатировать число jquery

Как отформатировать число jquery

Есть сумма 114358Эту цифру получаю так: 100 000 * 1

129