Дана задача[Java], при компиляции выходят ошибки, в чем именно проблема?
Выпуклый многоугольник задан на плоскости перечислением координат вершин в порядке обхода его границы. Определить площадь многоугольника. Java
package area;
import java.awt.Color;
import java.awt.Graphics;
import java.util.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import javax.swing.JDialog;
import static java.lang.System.*;
/**
Многоугольник (не обязательно выпуклый) задан на плоскости перечислением
координат вершин в порядке обхода его границ. Определить площадь многоугольника.
Входные данные:
- Число вершин в многоугольнике
- Координаты вершин, заданные в порядке обхода его границы по часовой стрелке
Выходные данные:
- Площадь заданного многоугольника
Решение.
Пусть дан многоугольник ABCDE (в проекте файл polygon.jpg).
Количество вершин n = 5.
Отпустим от каждой вершины перпендикуляр на ось ox.
Площадь нашего многоугольника можно посчитать через интегралы:
S = ∫AB - ∫CB + ∫CD - ∫ED + ∫EA
Получается, что каждый интеграл представляет собой площадь соответствующей трапеции. Таким образом:
S = S ABJH – S CBJF + S CDIF – S EDIG + S EAHG
Иначе говоря, у нас есть две вершины: i и i+1.
Если вершина i+1 расположена справа от вершины i,
то эту площадь мы прибавляем, если слева – отнимаем.
----------------------------------------------------------------------------------
Sтрапеции = 1/2 *((a+b))*h, где a, b – основания трапеции, h – высота трапеции.
*
*/
public class AreaCounter {
private static Queue<Point> coords = new LinkedList<Point>();
private static BufferedReader input = new BufferedReader(new InputStreamReader(in));
public static void main(String... args) throws IOException {
out.println("Программа расчета площади не выпуклого многоуголиника\n"
+ "вводите координаты точек через пробел, по завершению ввода\n"
+ "координат, введите 'c' для рассчета площади. 'x' для выхода\n"
+ "'r' удалить последнюю точку");
while (true) {
String ans = input.readLine();
//выходим если пользователь ввел х
if ("x".equals(ans)) {
return;
}
//если введена комманда посчитать
if ("c".equals(ans)) {
//вызываем метод расчета площади
count();
//переходим к следующей итерации цикла
continue;
}
if ("r".equals(ans)) {
((List) coords).remove(coords.size() - 1);
continue;
}
//пытаемся выделить координаты точки из введенной строки
//выделяем строку от начала до символа пробел
String xStr = null;
String yStr = null;
try {
xStr = ans.substring(0, ans.indexOf(" "));
//выделяем подстроку от пробела до конца строки
yStr = ans.substring(ans.indexOf(" "));
//пытаемя преобразовать строки в числа
} catch (IndexOutOfBoundsException iobe) {
out.println("Вы ввели что-то не то :-). Попробуйте еще раз");
continue;
}
try {
double xd = Double.parseDouble(xStr);
double yd = Double.parseDouble(yStr);
coords.add(new Point(xd, yd));
} catch (NumberFormatException nfe) {
out.println("Вы ввели что-то не то :-). Попробуйте еще раз");
}
}
}
private static void count() {
//проверяем число введенных точек
//если меньше трех то считать нечего
if (coords.size() < 3) {
out.println("Маловато исходных точек, введите еще.");
return;
}
//рассчитываем площадь
//переменная хранит бщую площадь
double area = 0;
//запоминаем координаты первой точки
Point start = coords.peek();
//добавляем первую точку в конец очереди
//чтобы замкнуть фигуру при обходе точек в цикле
coords.add(start);
//начинаем обход по вершинам фигуры
for (int i= 0 ; i< coords.size();i++) {
Point p = ((List<Point>)coords).get(i);
/*
* (p.x - start.x) -- это высота трапеции, если точка i+1 (p)
* правее от точки i (start) то площадь трапеции войдет в сумму со знаком +;
* если точка i+1 (p)
* левее от точки i (start) то площадь трапеции войдет в сумму со знаком -;
*
* (p.y + start.y) / 2 -- половина суммы верхней и нижней граней трапеции
*
*/
area += (p.x - start.x) * (p.y + start.y) / 2.;
//переходим к следующей вершине многоугольника
//тепер она становится начальной
start = p;
}
out.println("Площадь фигуры: " + Math.abs(area));
//удаляем последнюю точку из очереди
//вдруг пользователь захочет добавить пару точек
((List) coords).remove(coords.size() - 1);
show();
}
public static void show() {
JDialog d = new JDialog() {
@Override
public void paint(Graphics g) {
int x0 = getWidth()/2;
int y0 = getHeight()/2;
g.setColor(Color.red);
Point first = coords.peek();
for (Point p : coords) {
g.drawLine(x0+(int) first.x * 10, y0-(int) first.y * 10, x0+(int) p.x * 10, y0-(int) p.y * 10);
first = p;
}
g.drawLine(x0+(int) first.x * 10, y0-(int) first.y * 10,
x0+(int) (coords.peek().x * 10), y0-(int) (coords.peek().y*10));
}
};
d.setSize(320, 240);
d.setVisible(true);
}
}