Есть задача:
В файле хранятся координаты вершин четырехугольника в порядке обхода фигуры по часовой стрелке в виде:
<координата 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. Даже ввод тех же вершин четырёхугольника не даёт нужного вывода, хотя прописано верно
Для проверки, находится ли точка внутри многоугольника, есть много методов.
В данном случае он выпуклый, и проще всего проверить, что все векторные произведения, образованных тройками 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));
}
Нулевое значение одного из произведений означает, что точка находится на ребре (если знаки остальных совпадают). А нулевое значение двух последовательных произведений - что точка совпадает с вершиной (хотя это можно простым сравнением выяснить)
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется массив из байтов одной Java программыКак мне получить её исходники в нормальном Java виде, с помощью ASM может как-то ?
Написал Логин Фильтр, который не будем пропускать не авторизованного юзера :